当查询选择记录时,ExecuteNonQuery返回-1。为什么?

时间:2016-03-27 14:41:15

标签: c# sqlcommand

我点击了一下按钮点击:

private void button7_Click(object sender, EventArgs e)
{
     using (SqlConnection connect = new SqlConnection(PubVars.connStr))
     {
        string query = "SELECT * FROM Users WHERE username = '" + comboBox1.SelectedValue.ToString() + "' AND password = '" + txtDelUsrPassword.Text + "'";
        using (SqlCommand cmd = new SqlCommand(query, connect))
        {
           connect.Open();
           DataRow[] foundRow = cmd.ExecuteNonQuery();
           connect.Close();
        }
     }
}

在我输入行

之后
DataRow[] foundRow = cmd.ExecuteNonQuery();

红色波浪线在cmd.ExecuteNonQuery下。因此,当我尝试保存并运行它时出现错误消息:

  

无法隐式转换类型' int'到' System.Data.DataRow []'。

当查询是标准SQL select时,原因是什么?

1 个答案:

答案 0 :(得分:1)

因为documented;

  

对于UPDATE,INSERT和DELETE语句,返回值为   受命令影响的行数。当a上存在触发器时   正在插入或更新的表,返回值包括数字   受插入或更新操作影响的行数和数字   受触发器或触发器影响的行数。 适用于所有其他类型的   语句,返回值为-1。如果发生回滚,则返回   值也是-1。

如果您想获得所有结果并将其放入DataRow数组中,则应使用SqlDataAdapter方法使用DataRow[]方法返回var dt = new DataTable(); using(var adapter = new SqlDataAdapter(cmd)) { adapter.Fill(dt); DataRow[] rows = dt.Select(); }

DataRow[]

此外,您应始终使用DataTable.Select。这种字符串连接对parameterized statements攻击是开放的。并且不要将您的密码存储为纯文本。阅读:SQL Injection

顺便说一句,目前尚不清楚您将使用此WHERE做什么,但如果您只是想根据SELECT count(*)中的条件检查有多少结果子句,您可以将查询更改为ExecuteScalar并使用worker方法获取它。