关于Using语句自动关闭数据库连接及VB.NET插入代码的技术咨询
关于VB.NET数据库代码中Using语句的疑问解答
1. Using语句会不会自动关闭数据库连接?
答案是肯定的——Using语句不仅会自动关闭连接,还会帮你妥善释放资源。
在.NET里,SqlConnection实现了IDisposable接口,而Using语句就是专门用来管理这类可释放对象的“贴心工具”:不管代码是正常跑完Using块,还是中途抛出异常崩了,只要离开Using块的范围,.NET就会自动调用SqlConnection的Dispose()方法。而这个方法会确保连接被关闭(哪怕你没手动写Close()),还会把连接放回连接池(默认是开启的,能提升后续连接的效率)。
这比手动写Try...Finally去关连接靠谱多了,完全不用担心遗漏释放资源导致的连接泄漏问题。
2. 你的代码写法规范吗?
整体思路是对的,但有几个小细节得调整下,让代码更健壮:
先夸夸做得好的地方:
- 用Using包裹
SqlConnection,这是管理数据库连接的最佳实践,必须给个赞👍 - 用了参数化查询,彻底避免SQL注入风险,这是写数据库代码的底线,做得非常对
要改进的几个点:
(1) 忘了打开连接啦
你的代码里没写con.Open(),这会导致后续执行命令时直接报错——数据库连接默认是关闭状态,必须在执行命令前打开它,把这行加在Using块里、创建命令之前就行。
(2) SqlCommand的Using可以更简洁
你可以直接在初始化SqlCommand的时候就把查询语句和连接传进去,不用再单独用With块赋值,代码会更清爽:
Using comm As New SqlCommand(query, con) ' 这里直接配置参数就行 End Using
(3) 尽量别用AddWithValue
AddWithValue()虽然写起来省事,但它会让.NET自动猜参数类型,有时候猜不对就会导致性能下降或者类型不匹配的问题。建议用Parameters.Add()明确指定参数类型和长度,比如:
' 假设你的id是整数,name是50长度的字符串,data是长文本 comm.Parameters.Add("@id", SqlDbType.Int).Value = myGDI.id comm.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = myGDI.name comm.Parameters.Add("@data", SqlDbType.NVarChar).Value = myGDI.data
(4) 别忘了执行插入命令
你的代码片段里没写comm.ExecuteNonQuery(),这可是执行INSERT语句的关键一步,不加的话数据库根本不会收到插入请求哦。
调整后的完整代码参考:
Public Class SQL_Client Sub AddData(ByRef myGDI As GeneralInfo) Dim conStr As String = "Server=NB01009;Database=DEV_DW;Trusted_Connection=true" Dim query As String = "INSERT INTO GeneralInfo(id, name, data) VALUES (@id, @name, @data)" Using con As SqlConnection = New SqlConnection(conStr) con.Open() Using comm As New SqlCommand(query, con) ' 明确指定参数类型和值 comm.Parameters.Add("@id", SqlDbType.Int).Value = myGDI.id comm.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = myGDI.name comm.Parameters.Add("@data", SqlDbType.NVarChar).Value = myGDI.data ' 执行插入操作,还能获取受影响的行数判断是否成功 Dim rowsAffected As Integer = comm.ExecuteNonQuery() If rowsAffected > 0 Then ' 可选:插入成功后的逻辑 End If End Using End Using End Sub End Class
内容的提问来源于stack exchange,提问作者ruedi
相关产品推荐
相关产品推荐

