2016-02-12 402 views
-3

當我點擊這個按鈕,我面對這個錯誤:的ExecuteNonQuery CommandText屬性尚未初始化

executenonquery commandtext property has not been initialized

private void button_FirstStep_Click(object sender, EventArgs e) 
{ 
    SqlConnection Conn = new SqlConnection(Yahya.strcon); 
    Conn.Open(); 
    int CurrentCount = Convert.ToInt32(label_CurrentCount.Text); 
    string strcom1 = "select * from vm1 where count = '" + (CurrentCount - 1) + "' and benchmarkid = '" + Structure.BenchmarkID + "' "; 
    SqlCommand cmd = new SqlCommand(strcom1, Conn); 
    SqlDataReader reader = cmd.ExecuteReader(); 
    string strcom = ""; 
    while (reader.Read()) 
    { 
     if (reader["vmid"].ToString() != "") 
     { 
      string vmid = reader["vmid"].ToString(); 
      strcom += "update vm1 set pmid = (select pmid from vm1 as VM2 where benchmarkid = '" + Structure.BenchmarkID + "' and vm2.count ='" + (CurrentCount - 1) + "' and vm2.vmid ='" + vmid + "') where count = '" + CurrentCount + "' and vmid = '" + vmid + "' and benchmarkid = '" + Structure.BenchmarkID + "' \n"; 
     } 
    }//end of while 
    reader.Close(); 
    cmd.CommandText = strcom; 
    cmd.ExecuteNonQuery(); 
} 
+2

你調試了嗎? 'ExecuteReader'返回了多少行?如果沒有結果,'reader.Read'永遠不是'true',所以'strcom'仍然是空的。 –

+0

[Bobby Tables](http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-work)即將參加這個派對,他說他帶來了很多朋友 – Steve

+0

也,你把一個點鑄造currentCount爲一個整數,然後把它作爲查詢中的varchar通過將它包圍在引號中 - 是在vb1數值?如果是這樣,請刪除引號(或更好地參數化查詢) – NDJ

回答

0

你可以通過詢問之前簡單地調試解決這個問題。

此錯誤的原因可能是您的第一次請求返回零結果。
所以reader.Read()總是falsestrcom保持空。您在致電ExecuteNonQuery()之前設置一個空字符串爲cmd.CommandText

爲了解決這個問題,只需檢查如果字符串是空的,執行的最後一個查詢,只有當它不爲空:

... 
reader.Close(); 
if (!string.IsNullOrEmpty(strcom)) 
{ 
    cmd.CommandText = strcom; 
    cmd.ExecuteNonQuery(); 
} 
1

劉若英是他的comment很正確,就像你reader.Read()回報false,這就是爲什麼你的代碼從未進入你while循環和你CommandText被分配到"",這就是爲什麼ExecuteNonQuery拋出

ExecuteNonQuery: CommandText property has not been initialized

您可以檢查您strcom爲空字符串或沒有解決你的問題,但除此之外,我看到你的代碼錯誤的東西..

  • 看起來你count列是數值,但是你提供你的CurrentCount - 1作爲帶有單引號的字符。如果它不是數字,那麼應該是。閱讀:Bad habits to kick : choosing the wrong data type
  • 基於它的名字,benchmarkid應該(?)也是數字類型。
  • 您可以使用parameterized queries解決這兩個問題,因爲這種字符串連接對於SQL Injection攻擊是開放的。
  • 使用using statement來自動處理您的連接,命令和讀取器而不是自動調用CloseDispose方法
  • Open您的連接只是在執行您的命令之前。
相關問題