.NET计算SQL Server当前时间与InsertDate时差时遇空引用异常求助
问题原因
oku变量仅声明未初始化:直接调用oku.GetDateTime时,oku是空对象,触发ArgumentNullException。GetDateTime参数用法错误:该方法的参数只能是数据表的列名(如"InsertDate")或列索引,不能拼接SQL查询条件。- 存在SQL注入风险:直接将
qrcode.Text拼接进查询逻辑,极易被利用注入恶意SQL。
正确实现方式
推荐直接在SQL语句中完成时间差判断,无需先读取数据再计算,效率更高且更安全:
方案一:Update语句内置时间条件(优先推荐)
' 构造带参数的更新语句,直接在SQL里判断时间差 Dim updateSql As String = "UPDATE [Table] SET [目标列名] = @NewValue WHERE QR = @QRCode AND DATEDIFF(HOUR, InsertDate, GETDATE()) <= 2" Using conn As New SqlConnection("你的数据库连接字符串") Using cmd As New SqlCommand(updateSql, conn) ' 添加参数,避免SQL注入 cmd.Parameters.AddWithValue("@NewValue", 你的更新值) cmd.Parameters.AddWithValue("@QRCode", qrcode.Text) conn.Open() Dim updatedCount As Integer = cmd.ExecuteNonQuery() ' updatedCount为0时,说明要么无匹配QR的行,要么时间差超过2小时 End Using End Using
方案二:先查询时间再判断更新(需先获取时间场景)
如果必须先读取InsertDate再计算,需正确初始化SqlDataReader:
Dim targetInsertDate As DateTime Dim selectSql As String = "SELECT InsertDate FROM [Table] WHERE QR = @QRCode" Using conn As New SqlConnection("你的数据库连接字符串") Using selectCmd As New SqlCommand(selectSql, conn) selectCmd.Parameters.AddWithValue("@QRCode", qrcode.Text) conn.Open() Using oku As SqlDataReader = selectCmd.ExecuteReader() If oku.Read() Then ' 通过列名获取对应值,先确认列存在 targetInsertDate = oku.GetDateTime(oku.GetOrdinal("InsertDate")) Else ' 未找到匹配QR的记录,直接退出 Return End If End Using End Using ' 计算当前时间与InsertDate的小时差 Dim hourDiff As Long = DateAndTime.DateDiff(DateInterval.Hour, targetInsertDate, DateTime.Now) If hourDiff <= 2 Then Dim updateSql As String = "UPDATE [Table] SET [目标列名] = @NewValue WHERE QR = @QRCode" Using updateCmd As New SqlCommand(updateSql, conn) updateCmd.Parameters.AddWithValue("@NewValue", 你的更新值) updateCmd.Parameters.AddWithValue("@QRCode", qrcode.Text) conn.Open() updateCmd.ExecuteNonQuery() End Using End If End Using
重要注意点
- 必须使用参数化查询:禁止直接拼接用户输入到SQL语句,杜绝SQL注入风险。
- 用
Using语句管理资源:自动释放数据库连接、命令、DataReader等资源,避免内存泄漏。 - 读取DataReader前先调用
Read():确保存在可读取的行,防止读取空数据报错。
内容的提问来源于stack exchange,提问作者marcy
相关产品推荐
相关产品推荐

