ExecuteNonQuery

一、方法说明

SqlCommand.ExecuteNonQuery()


适用场景INSERT(新增)、UPDATE(更新)、DELETE(删除),不要用于SELECT查询
返回值int 类型,代表SQL执行后受影响的数据行数

原理:数据库执行DML语句后会返回变更行数,程序拿到这个数字用来判断操作是否生效。

返回值业务判断逻辑

  1. INSERT:正常新增成功 → 返回 1;失败/异常报错;
  2. UPDATE
  • 找到匹配数据并修改 → 返回 ≥1
  • WHERE条件找不到任何记录 → 返回 0(语句没报错,但是没有数据被更新)
  1. 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)

说明

  1. 不要依靠“没有异常”判断业务成功
    SQL不报错,不代表数据改动成功(比如更新条件找不到行,返回0),必须结合返回行数判断业务结果。
  2. ExecuteNonQuery 不要用来执行SELECT
    执行SELECT时,它只会返回 -1,无法拿到查询结果;查询数据应当使用 ExecuteReader() / ExecuteScalar()
  3. using语法的好处
    using(SqlConnection conn) 执行结束后自动释放数据库连接,避免连接泄露。
  4. 参数名称严格匹配
    SQL里 @Title@id 必须和代码 SqlParameter 的参数名完全一致,大小写不敏感但是名称不能写错。

三种SqlCommand对比

方法用途返回值
ExecuteNonQuery增/删/改(INSERT/UPDATE/DELETE)int 受影响行数
ExecuteScalar查询单行单列(例如COUNT、获取新增自增ID)object 第一行第一列的值
ExecuteReader查询多行多列SELECTSqlDataReader 数据流

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注