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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:15:47