一、方法说明
SqlCommand.ExecuteNonQuery()
适用场景:INSERT(新增)、UPDATE(更新)、DELETE(删除),不要用于SELECT查询
返回值:int 类型,代表SQL执行后受影响的数据行数
原理:数据库执行DML语句后会返回变更行数,程序拿到这个数字用来判断操作是否生效。
返回值业务判断逻辑
- INSERT:正常新增成功 → 返回
1;失败/异常报错; - UPDATE:
- 找到匹配数据并修改 → 返回 ≥1
WHERE条件找不到任何记录 → 返回0(语句没报错,但是没有数据被更新)
- DELETE:
- 匹配到数据删除 → 返回≥1
- 无匹配数据 → 返回
0
重要区分:返回0 ≠ 程序报错。SQL语法没问题正常执行,只是没有符合条件的数据被改动。
INSERT 新增示例
private void button2_Click(object sender, EventArgs e)
{
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=True";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
// 参数化SQL,防止SQL注入
sqlCom.CommandText = "INSERT INTO [dbo].[Article]([Title]) VALUES(@Title)";
sqlCom.CommandTimeout = 60;
SqlParameter param = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
param.Value = "这是新的标题" + DateTime.Now;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);
int res = sqlCom.ExecuteNonQuery();
MessageBox.Show(res.ToString());
// 新增成功 res=1
}
}Code language: JavaScript (javascript)
优势:参数化查询,避免拼接字符串造成SQL注入漏洞。
UPDATE 更新示例
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
sqlCom.CommandText = "UPDATE [dbo].[Article] SET [Title] = @Title WHERE id = @id";
sqlCom.CommandTimeout = 60;
SqlParameter param = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
param.Value = "这是新的标题"+DateTime.Now;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);
// 两种添加参数写法,效果等价
//方式1:先创建变量再添加
SqlParameter param2 = new SqlParameter("@id", SqlDbType.Int);
param2.Value = 5;
sqlCom.Parameters.Add(param2);
//方式2:链式直接添加(图中注释写法)
//sqlCom.Parameters.Add(new SqlParameter("@id", SqlDbType.Int){Value=5});
int res = sqlCom.ExecuteNonQuery();
MessageBox.Show(res.ToString());Code language: JavaScript (javascript)
- 表中存在
id=5的数据 →res=1 - 不存在
id=5的数据 →res=0
业务上可以这样判断:
if(res > 0)
{
MessageBox.Show("更新成功");
}
else
{
MessageBox.Show("没有找到对应数据,未执行更新");
}Code language: JavaScript (javascript)
说明
- 不要依靠“没有异常”判断业务成功
SQL不报错,不代表数据改动成功(比如更新条件找不到行,返回0),必须结合返回行数判断业务结果。 ExecuteNonQuery不要用来执行SELECT
执行SELECT时,它只会返回-1,无法拿到查询结果;查询数据应当使用ExecuteReader()/ExecuteScalar()。- using语法的好处
using(SqlConnection conn)执行结束后自动释放数据库连接,避免连接泄露。 - 参数名称严格匹配
SQL里@Title、@id必须和代码SqlParameter的参数名完全一致,大小写不敏感但是名称不能写错。
三种SqlCommand对比
| 方法 | 用途 | 返回值 |
|---|---|---|
| ExecuteNonQuery | 增/删/改(INSERT/UPDATE/DELETE) | int 受影响行数 |
| ExecuteScalar | 查询单行单列(例如COUNT、获取新增自增ID) | object 第一行第一列的值 |
| ExecuteReader | 查询多行多列SELECT | SqlDataReader 数据流 |
Previous: 执行优化和参数传递
Next: SqlTransaction 数据库事务