VB.Net执行SQL查询时出现异常:原因及解决方法
错误原因及解决方案
错误原因
- 数据库连接对象未初始化:代码仅声明了连接字符串
connstring,但未创建SqlConnection实例就直接使用conn变量,会引发对象引用未设置的错误。 - 日期参数格式错误:给
SqlDbType.Date类型的参数拼接了#符号,这是Access数据库的日期写法,SQL Server无需额外格式转换,直接传入DateTime类型值即可,拼接#会导致类型转换失败。 - DataReader使用逻辑错误:调用
ExecuteReader后立即关闭连接,而DataReader需要保持连接打开才能读取数据,会导致读取失败。
解决方案
修正后的代码如下:
' 读取连接字符串并实例化数据库连接 Dim connstring As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString Using conn As New SqlConnection(connstring) ' 构造SQL命令 Dim cmd As New SqlCommand("SELECT * FROM Table_1 WHERE date_register >= @date_register AND date_register <= @date_register2", conn) ' 直接传入DateTime类型参数,无需拼接格式符号 cmd.Parameters.Add("@date_register", SqlDbType.Date).Value = DatePicker.Value cmd.Parameters.Add("@date_register2", SqlDbType.Date).Value = DatePicker2.Value conn.Open() ' 使用Using自动释放DataReader,同时指定CommandBehavior.CloseConnection让连接随DataReader关闭 Using myreader As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection) ' 在这里处理读取到的数据,示例: While myreader.Read() ' 如获取字段值:Dim registerDate As Date = myreader.GetDateTime(myreader.GetOrdinal("date_register")) End While End Using End Using
关键修正说明
- 用
Using语句管理SqlConnection和SqlDataReader,确保资源自动释放,避免内存泄漏。 - 移除参数值的
#拼接,直接传入DatePicker.Value(本身为DateTime类型,匹配SqlDbType.Date参数类型)。 - 实例化
SqlConnection对象,解决未初始化的问题。 - 使用
CommandBehavior.CloseConnection,让连接在DataReader关闭时自动关闭,无需手动调用conn.Close()。
内容的提问来源于stack exchange,提问作者yossef saad
相关产品推荐
相关产品推荐

