2016-02-12 347 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您的连接只是在执行您的命令之前。
相关问题