我点击了一下按钮点击:
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时,原因是什么?
答案 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
方法获取它。