ExecuteNonQuery CommandText属性尚未初始化

时间:2016-02-12 11:30:34

标签: c# executenonquery

当我点击此按钮时,我面临此错误:

  

executiontenonquery commandtext属性尚未初始化

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 个答案:

答案 0 :(得分:1)

Rene关于他的comment非常正确,看起来像reader.Read()返回false这就是为什么你的代码永远不会进入你的while循环并且CommandText已分配给"",这就是ExecuteNonQuery抛出

的原因
  

ExecuteNonQuery:CommandText属性尚未初始化

您可以检查您的strcom是否为空字符串以解决您的问题但我在您的代码中看到更多错误的内容除此之外..

  • 您的count列似乎是数字值,但您提供的CurrentCount - 1字符是带引号的字符。如果它不是数字,则。阅读:Bad habits to kick : choosing the wrong data type
  • 根据它的名称,benchmarkid也应该(?)为数字类型。
  • 使用parameterized queries可以解决这两个问题,因为这种字符串连接对SQL Injection攻击是开放的。
  • 使用using statement自动处理您的连接,命令和阅读器 ,而不是手动调用CloseDispose方法。
  • 在执行命令之前,
  • Open您的连接只是

答案 1 :(得分:0)

你可以在询问之前通过简单的调试来解决这个问题。

此错误的原因可能是您的第一个请求返回零结果 因此,reader.Read()始终为falsestrcom保持为空。在调用cmd.CommandText之前,您将空字符串设置为ExecuteNonQuery()

要解决这个问题,只需检查字符串是否为空,只有在它不为空时执行最后一个查询:

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