C#中 SqlCommand对象管理不同写法的区别及各自的使用场景总结

最近在一个项目中看到两种关于执行SQL语句相关内容的写法,感觉实现的功能差不多,但不太清楚具体每种写法应该在何种情况下使用,为此查询了一些资料,最终搞明白区别和使用场景记录如下:

话不多说,先上代码:

写法1:

SqlCommand cmd1 = new SqlCommand();
connection.Open();
string query = "UPDATE tableName SET field1= 'aaa',field2='bbb',field3='ccc' WHERE id=123;";
cmd1.CommandText = query;
cmd1.Connection = connection;
cmd1.ExecuteNonQuery();
connection.Close();

写法2:

connection.Open();
string query = "UPDATE tableName SET field1= 'aaa',field2='bbb',field3='ccc' WHERE id=123;";
using (SqlCommand cmd = new SqlCommand(query, connection))
{
     object result = cmd.ExecuteNonQueryAsync();
}

这两种写法的主要区别在于如何管理 SqlCommand 对象以及异步执行的方式。具体来看:

主要区别:
1. SqlCommand 对象的管理:

写法1: SqlCommand cmd1 = new SqlCommand(); 创建了一个命令对象,然后手动设置其 CommandTextConnection 属性。在 ExecuteNonQueryAsync 执行之后,连接(connection)是手动关闭的。这个命令对象没有使用 using 语句块来管理资源,因此需要显式关闭和释放资源。
写法2: SqlCommand 被放置在一个 using 块中。这样 SqlCommand 对象会在 using 块结束时自动释放资源,确保正确管理对象的生命周期,无需显式调用 Close()Dispose()

2. ExecuteNonQueryAsync 异步执行:

写法1: 使用 await 关键字等待异步操作完成。由于 await 会阻塞当前方法直到异步操作完成,因此在执行完 ExecuteNonQueryAsync 后,连接会被关闭。
写法2: 使用了 ExecuteNonQueryAsync(),但是并没有 await,而是直接获取了 object result。这里是一个潜在的问题,ExecuteNonQueryAsync 是异步方法,它返回的是一个 Task,因此直接将其赋值给 object result 是不正确的,因为这会导致异步任务的结果没有被正确处理。正确的做法是使用 await 来等待任务完成。

3. 连接管理:

写法1: connection.Open() 在前,connection.Close() 在后。连接的打开和关闭是手动的,需要特别注意在异常情况下也能正确关闭连接,否则可能会导致连接泄露。
写法2: connection.Open() 同样是手动打开的,但using语句块的使用会确保 SqlCommand 对象在使用完之后被正确释放,但并没有对数据库连接本身进行封装和管理。理想情况下,你应该使用 using 块来管理 SqlConnection,确保连接能够在操作完成后被正确关闭和释放。

使用建议:

写法1: 适合于一些特定的场景,尤其是当你需要精确控制 SqlCommand 对象的生命周期或需要执行一些额外的逻辑时。比如,你可能需要在执行查询后做一些后续处理,或者你需要在多个地方使用相同的 SqlCommand 对象。值得注意的是,在这种情况下,你需要非常小心手动管理资源,确保连接和命令对象都被正确关闭和释放。
写法2: 更推荐用于简单的场景,特别是当你只需要执行一个 SQL 命令并且不需要对 SqlCommand 对象做复杂的处理时。using 语句能更简洁地管理资源,避免资源泄漏,尤其是在异步操作中,资源管理变得尤为重要。需要注意的是,你应该正确使用 await 来确保异步操作正确执行。

改进建议:

如果想在写法2中修复异步操作的部分,正确的写法应该是:

connection.Open();
string query = "UPDATE " + tableName + " SET " + fieldName + " = " + resultStr + " WHERE id=" + id + ";";

using (SqlCommand cmd = new SqlCommand(query, connection))
{
    await cmd.ExecuteNonQueryAsync();
    Console.WriteLine("更新数据的ID是:" + id);
}

这样可以确保异步操作正常进行,并且连接和 SqlCommand 对象会在操作完成后正确释放。

以上就是我结合项目中的代码以及往上查询到的信息对两种写法的区别以及各自使用场景的总结。

欢迎大家前来纠正及补充,愿与大家共勉~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值