2016-02-09 43 views
0

我有一個很長的,具體的問題。asp.net sql update報告它正在工作,但沒有真正的結果

我在創建asp.net(C#) Web應用程序。
我已經定製了一個DATABASE.cs類,女巫用於所有與數據庫的通信,我有在真實服務器上(不是我正在開發web應用的pc),並且它正在工作很好 - 完全沒有錯誤。

我programmaticaly在formReports.aspx創建一個表,並在每一行中,還有來自數據庫的一些信息,在(asp.net的)文本框-ES顯示,帶有按鈕保存刪除 。在此調用中,我對感興趣,爲什麼保存按鈕不起作用

幾件事情,可能需要了解的:
-The formReports.aspx顯示在其他.aspx頁面中以的iFrame
- 保存按鈕的Click功能是這樣添加的:btn.Click += new EventHandler(Update);在我設置btn.CommandArgument之前,我需要保存一些變量,用「/」分開。
- 更新功能工作正常,服用按鈕CommandArgument的,與這些變量分裂他們到變量,並呼籲DATABASE.cs功能更新
- 取自CommandArgument的變量沒問題,就像我需要它們一樣,所以沒有錯誤。
- DATABASE.cs不是靜態類。
-In DATABASE.cs,我正在使用SqlConnectionSqlCommand
- 我在代碼運行時通過逐步檢查檢查了所有內容。

現在,這裏是從DATABASE.Update代碼:

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和金額的一類。當我填充表格時,在創建EACH行時,在CommandArgument中,我放入了這個類的信息。
btn.CommandArgument例如:U/1/220/43267,14其中:
Ü - 表示 「更新」
1 - 代表錶行號(從DATABASE在預製取出列表還列表索引.cs類。
220 - 代表從ReportContent(東西ROM真正的數據庫)
43267,14 AccountCodeID - 代表量ReportContent(東西ROM真正的數據庫)

正如你可以probbably告訴,與throw new NotSupportedException()我將毫無遺漏確切SQL查詢,在真實的服務器上試過了,它工作正常 - 沒有錯誤,並且行已更新。

功能單()NonQuery()只需打開連接,執行的ExecuteScalar(),這是的ExecuteNonQuery(),並隨後關閉連接 - 沒有錯誤有eather,他們返回(單())字符串來自單個左上單元格,即受影響行的(NonQuery())節點。

問題:我點擊保存按鈕,功能更新formReport.aspx叫,巫婆然後調用DATABASE.Update函數,返回空字符串( 「」) ,因爲實際數據庫中的行更新爲,但是當我檢查真實數據庫時,行是根本不受影響

一切運行平穩。我甚至補充說,如果DATABASE.Update返回「」 - 如果它不是「」(當它點擊它時它變成黃色),它會變成紅色。

爲什麼從我的(客戶端)那裏得到更新成功完成的信息,但是當我到達真實服務器時,刷新結果,我所瞄準的那一行不受影響?

+1

在SQL Server上運行探查器跟蹤,並查看當您執行更新時,.NET應用程序發送了哪些命令(如果有)。 –

+0

你可以顯示'NonQuery()'的代碼嗎? – user1666620

+1

您應該重寫您的類DATABASE.cs並開始使用** [參數化查詢](http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/)**。字符串連接容易受到惡意Sql注入的影響,但也容易受到格式錯誤的sql,類型轉換,數據截斷以及無法使用緩存的查詢計劃的影響。這種改變也會使調試更容易。如前所述,您可能需要運行跟蹤來檢查服務器上正在執行的操作。 – GarethD

回答

0

我在這裏回答我自己的問題。

從問題中發佈的任何內容都無法看到問題。
我很抱歉大驚小怪,並會提出一個建議,以便其他開發人員可以從我的錯誤中學到一些東西。

當我說我是programmaticaly創建保存按鈕,在CommandArgument,我把剛剛創建文本框的當前文本作爲參數,所以任何更新或刪除到數據庫將作爲參數,有一個空字符串。現在

,我解決了這一問題,通過對這些文本框創造獨特的ID,在CommandArgument發送它作爲參數,然後檢索該文本框的當前文本。

我創建的表的方式 保護無效的Page_Load(對象發件人,EventArgs的) { //如果(!的IsPostBack) { 如果(會話[ 「用戶」] == NULL) {Server.Transfer(「formMain。ASPX「);回報;}

  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)); 
     } 
    } 

因此,鴕鳥政策CODE-FOR-特羅

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-特羅

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; 
    } 



所以,總結起來,這是一個真正愚蠢的錯誤。但是直到我試圖刪除並插入更新的行時,我纔想出來。我希望這個「答案」能節省一些人的時間。

相關問題