You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:26:41