asp.net SQL 更新报告它正在工作,但没有实际结果
本文关键字:结果 工作 SQL net 更新 报告 asp | 更新日期: 2023-09-27 18:33:57
我有一个很长很具体的问题。
我正在创建 asp.net (C#( Web 应用程序。
我创建了一个自定义的 DATABASE.cs 类,witch 用于与我在真实服务器上拥有的数据库(不是我正在开发 Web 应用程序的 PC(上进行的所有通信,并且它工作正常 - 根本没有错误。
我以编程方式在 formReports 中创建了一个表.aspx在每一行中,都有来自数据库的一些信息,显示在 (asp.net's(TextBox-es 中,带有按钮">保存"和"删除"。在这个任务中,我对为什么保存按钮不起作用感兴趣。
一些可能有用的事情:
表单报告.aspx显示在 iFrame 的其他.aspx页面中。
-保存按钮的点击功能是这样添加的: btn.Click += new EventHandler(Update);
女巫之前,我btn.CommandArgument
设置了一些我需要保存的变量,用"/"分隔。
-更新函数工作正常,获取按钮CommandArgument
,将它们拆分为变量并调用 DATABASE.cs 函数使用这些变量更新。
-从CommandArgument
中获取的变量是可以的,就像我需要它们一样,所以没有错误。
-DATABASE.cs 不是静态类。
-在数据库中.cs,我正在使用SqlConnection
和SqlCommand
。
-我在代码运行时通过分步检查检查了所有内容。
现在,这是来自数据库的代码。更新:
public string Update(ReportContent rcOld, string newAccountCodeID, string newAmount)
{
string queryFrom = "FROM [FinReports].[dbo].[ReportContent] ";
string queryWhere =
" WHERE ReportID = '" + rcOld.ReportID +
"' AND AccountCodeID = '" + rcOld.AccountCodeID +
"' AND Amount = '" + rcOld.Amount.ToString().Replace(',', '.') + "'";
//check number of rows
int rowCount;
string query = "SELECT COUNT(*) " + queryFrom + queryWhere;
try { rowCount = int.Parse(Single(query)); }
catch { throw new NotSupportedException(command.CommandText + ""); }
//throw new NotSupportedException(query + "");
//return if eny errors are found
if (rowCount < 1) return "Ne postoji u bazi podataka";
if (rowCount > 1) return "Postoji vise od 1 reda sa istim celijama";
//update row
query = "UPDATE [FinReports].[dbo].[ReportContent] " +
"SET AccountCodeID = '" + newAccountCodeID + "', Amount = " + newAmount.Replace(',', '.') +
queryWhere;
//throw new NotSupportedException(query + "");
//try {
if (NonQuery(query) != 1)
return "Greska";
//} catch { throw new NotSupportedException(query + ""); }
return "";
//}catch{return "Fatalna greska"; }
}
ReportContent.cs 是一个仅用于包含 ReportID、AccountCodeID 和 Amount 的类。当我填充表时,在创建 EACH 行时,在 CommandArgument
中,我放置了来自此类的信息。
btn.CommandArgument
示例:U/1/220/43267,14 其中:
u - 代表"更新">
1 - 代表表行号(也是从数据库获取的预制列表.cs类中的列表索引。
220 - 代表来自ReportContent的AccountCodeID (stuff rom real database(
43267,14 - 代表 来自报告内容的金额(内容 rom 真实数据库(
正如您可能知道的那样,throw new NotSupportedException()
我已经咳出了确切的SQL查询,在真实服务器上进行了尝试,并且工作正常-没有错误,并且该行已更新。
函数 Single(( 和 NonQuery(( 只需打开连接,执行 ExecuteScalar((,即 ExecuteNonQuery((,然后关闭连接 - 没有错误,它们从单个左上角单元格返回 (Single((( 字符串,即 (NonQuery((( 受影响的行。
问题:我单击"保存"按钮,调用函数"从表单报告更新.aspx然后调用数据库。更新函数,返回空字符串("(,因为真实数据库中的行已更新,但是当我检查真实数据库时,行根本不受影响。
一切都很顺利。我什至补充说,如果数据库,表行的背景会变成黄色。更新返回 " - 如果不是 ",则变为红色(单击它时变为黄色(。
为什么从我(客户端(端获得更新成功完成的信息,但是当我到达真实服务器时,刷新结果,我的目标行不受影响?
我在这里回答我自己的问题。
从我在问题中发布的任何内容中都看不到问题。
我很抱歉大惊小怪,我会给出一个警告,以便其他开发人员可以从我的错误中吸取一些教训。
当我说我正在以编程方式创建"保存"按钮时,在 CommandArgument 中,我将刚刚创建的 TextBox 的当前文本作为参数,因此任何对数据库的更新或删除都将作为参数具有空字符串。
现在,我通过为这些文本框创建唯一 ID,将其作为 CommandArgument 中的参数发送,然后检索该文本框的当前文本来解决此问题。
我创建表的方式 受保护的无效Page_Load(对象发送器,事件参数 e( { 如果(!IsPostBack( { if (会话["用户"] == 空( { Server.Transfer("formMain.aspx"(; return; }
if (Request.QueryString["reportID"] == null)
{ //error code here
}
database = new DATABASE();
//load report from db
reportID = int.Parse(Request.QueryString["reportID"]);
List<ReportContent> rows = database.ReportContents(reportID);
//add rows
for (int i = 0; i < rows.Count; i++)
report.Rows.Add(TRow(rows[i].AccountCodeID.ToString(),SetDecimals(rows[i].Amount.ToString()), i));
}
}
所以,不要为TRow
编码public TableRow TRow(string AccountCodeID, string Amount, int rowNo)
{
TableCell cell = new TableCell();
TableRow row = new TableRow();
Label label = new Label();
string tbACIDID = "tbAccountCodeID" + rowNo;
string tbAID = "tbAmount" + rowNo;
//add row number
label.Text = (rowNo + 1) + ".";
cell.Controls.Add(label);
row.Cells.Add(cell);
//add AccountCodeID
TextBox tbac = new TextBox();
tbac.ID = tbACIDID;
tbac.Text = AccountCodeID;
tbac.Width = 50;
tbac.CssClass = "textbox";
cell = new TableCell();
cell.Controls.Add(tbac);
cell.Attributes.Add("class", "cell");
row.Cells.Add(cell);
//add Amount
tbam = new TextBox();
tbam.ID = tbAID;
tbam.Text = Amount;
tbam.Width = 100;
tbam.CssClass = "textbox";
cell.Controls.Add(tbam);
cell.Attributes.Add("class", "cell");
row.Cells.Add(cell);
//add save button
Button btn = new Button();
btn.Text = "Sacuvaj";
btn.CssClass = "saveButton";
btn.CommandArgument =
"u" + separator +
rowNo + separator +
tbac.Text + separator +
tbam.Text;
btn.Click += new EventHandler(Update);
cell.Controls.Add(btn);
//style cell
cell.Attributes.Add("class", "tableCell");
row.Cells.Add(cell);
//style row
row.Attributes.Add("class", "row");
return row;
}
和 DO-CODE-FOR-TRow
public TableRow TRow(string AccountCodeID, string Amount, int rowNo)
{
TableCell cell = new TableCell();
TableRow row = new TableRow();
Label label = new Label();
string tbACIDID = "tbAccountCodeID" + rowNo;
string tbAID = "tbAmount" + rowNo;
//add row number
label.Text = (rowNo + 1) + ".";
cell.Controls.Add(label);
row.Cells.Add(cell);
//add AccountCodeID
TextBox tb = new TextBox();
tb.ID = tbACIDID;
tb.Text = AccountCodeID;
tb.Width = 50;
tb.CssClass = "textbox";
cell = new TableCell();
cell.Controls.Add(tb);
cell.Attributes.Add("class", "cell");
row.Cells.Add(cell);
//add Amount
tb = new TextBox();
tb.ID = tbAID;
tb.Text = Amount;
tb.Width = 100;
tb.CssClass = "textbox";
cell.Controls.Add(tb);
cell.Attributes.Add("class", "cell");
row.Cells.Add(cell);
//add save button
Button btn = new Button();
btn.Text = "Sacuvaj";
btn.CssClass = "saveButton";
btn.CommandArgument =
"u" + separator +
rowNo + separator +
tbACIDID + separator +
tbAID;
btn.Click += new EventHandler(Update);
cell.Controls.Add(btn);
//style cell
cell.Attributes.Add("class", "tableCell");
row.Cells.Add(cell);
//style row
row.Attributes.Add("class", "row");
return row;
}
所以,总结一下,这是一个非常愚蠢的错误。但是直到我尝试删除并插入更新的行,我才弄清楚。我希望这个"答案"能节省某人的时间。