2011-06-28 87 views
0

這是我更新語句建立像這樣:ExecuteCommand返回-1但不更新記錄

rowsreturned = this.dba.ExecuteCommand(cmd); 

寫了到控制檯,像這樣:

Console.WriteLine(string.Format("cmd-{0}",cmd)); //+ "and siteID = '{0}'",siteID 
Console.WriteLine(String.Format("Number of rows updated: {0} UPDATE FISB Data: report date {1} svid {2} ", rowsreturned, rptdate, svd.ID)); 

StringBuilder queryUpdate = new StringBuilder(); 
queryUpdate.AppendFormat("UPDATE TPMdailydata SET FISBTranIntvairmet={0},FISBTranIntvmetr={1},FISBTranIntvnexradnational = {2} ", svd.Data[1].SecPerUpdate.ToString("0.0"), svd.Data[2].SecPerUpdate.ToString("0.0"), svd.Data[3].SecPerUpdate.ToString("0.0")); 
queryUpdate.AppendFormat(",FISBTranIntvnexradregional = {0},FISBTranIntvnotam = {1},FISBTranIntvoutage = {2} ", svd.Data[4].SecPerUpdate.ToString("0.0"), svd.Data[5].SecPerUpdate.ToString("0.0"), svd.Data[7].SecPerUpdate.ToString("0.0")); 
queryUpdate.AppendFormat(",FISBTranIntvpirep = {0},FISBTranIntvsigmet = {1},FISBTranIntvSUA = {2} ", svd.Data[8].SecPerUpdate.ToString("0.0"), svd.Data[9].SecPerUpdate.ToString("0.0"), svd.Data[10].SecPerUpdate.ToString("0.0")); 
queryUpdate.AppendFormat(",FISBTranIntvTAF = {0},FISBTranIntvTISB = {1},FISBTranIntvwind = {2}, AirportID = '{3}' ", svd.Data[11].SecPerUpdate.ToString("0.0"), svd.Data[12].SecPerUpdate.ToString("0.0"), svd.Data[13].SecPerUpdate.ToString("0.0"), des); 
queryUpdate.AppendFormat("where SVID = {0} and reportdate = '{Z}' ", (int)svd.ID, rptdate.ToShortDateString()); 
queryUpdate.AppendFormat("and siteID = '{0}'", siteID); 
string cmd = queryUpdate.ToString(); 

所執行

結果如下:

CMD-UPDATE TPMdailydata SET FISBTranIntvairmet = 124.8,FISBTranIntvmetr = 252.0,FISBTranIntvnexradnational = 905.4,FISBTranIntvnexradregional = 150.6,FISBTranIntvnotam = 248.5,FISBTranIntvoutage = 0.0,FISBTranIntvpirep = 494.8,FISBTranIntvsigmet = 123.8,FISBTranIntvSUA = 551.8,FISBTranIntvTAF = 553.7,FISBTranIntvTISB = 13.3 ,FISBTranIntvwind = 554.1,AirportID ='ZDC',其中SVID = 158,reportdate ='6/20/2011'和siteID ='DEV' 更新的行數:-1 UPDATE FISB數據:報告日期6/20/2011 12 :00:00上午svid 158

更新肯定有效,但我期待更新行數的返回值。我得到-1。我認爲這很糟糕。我似乎無法找到-1的含義。 幫助任何人?

+3

您有一個SQL注入漏洞。 – SLaks

+0

這與LINQ無關。 – SLaks

+0

真實的陳述。我沒有使用LINQ,而是直接使用SQL – lahso

回答

0

有時數據庫有選項,不發送更新的記錄數量。

例如,與SQL Server,如果這是在存儲過程中完成的:

SET NOCOUNT ON 

然後進行記錄將始終返回-1。

可能有一些像這樣的選項,無論是數據庫還是提供程序阻止返回的記錄數量。

+0

我沒有使用存儲過程。我的陳述如上所述。我會在服務器端查看更多的db選項。謝謝 – lahso

+0

什麼是this.dba?你使用的是哪個數據庫? –

+0

dba是我的LINQ datacontext連接。 Microsoft SQL Server 2008 R2 – lahso

1

您需要參數化您的代碼並將參數添加到字符串,而不是讓人們嘗試瀏覽上面的意大利麪條混亂。即使你不想爲了可維護性而這樣做,你也將刪除SQL注入的機會。

至於你的-1,我不知道爲什麼。有很多事情可以設定完成。我想嘗試的是遠離LINQ,因爲沒有理由通過LINQ對象運行此查詢。下面是調用SQL命令直接而不是通過隱性FUD的圖層模式:

 string connString = "{Connection string here}"; 
     string sql = "{SQL Query Here}"; 

     using(SqlConnection conn = new SqlConnection(connString)) 
     { 
      conn.Open(); 

      using(SqlCommand cmd = new SqlCommand(sql, conn)) 
      { 
       int numRows = cmd.ExecuteNonQuery(); 
      } 
     } 

新增:要嘗試上述方法,而無需創建SQL連接,您更改此:

rowsreturned = this.dba.ExecuteCommand(cmd); 

這個

 SqlConnection conn = (SqlConnection) dba.Connection; 
     using(SqlCommand cmd = new SqlCommand(queryUpdate, conn)) 
     { 
      rowsreturned = cmd.ExecuteNonQuery(); 
     } 

此拉過的環境下,你已經有了,你可以看到,如果按照RowsReturned仍存在的問題。如果是這樣,請檢查命令字符串並考慮直接在SQL Studio中運行它。

+0

布拉沃格雷戈裏,我還以爲有一個SqlCommand一個普通的ExecuteNonQuery會更好地工作,在這種情況下:) –

+0

抱歉,我無法弄清楚如何輸入我的代碼就像你只是做。它沒有被寫得不好,只是沒有正確插入...回到正題。我正在使用ExecuteCommand直接在SQL 2008 R2數據庫上執行SQL語句,而不是通過LINQ,但正如在msdn信息頁中所述。直接在數據庫上執行SQL命令......謝謝 – lahso

+0

代碼有點亂設置查詢,這導致了嚴重注入問題的可能性。它使用數據庫上下文執行,這意味着你正在拖拽大量的LINQ(當你所有的是一個錘子,你看到的只是釘子)。問題域並不需要通過LINQ進行。至於獲得我所擁有的解決方案,我會發布另一個選項。 –