【问题标题】:Clone the value of a DATETIME column using arrays?使用数组克隆 DATETIME 列的值?
【发布时间】:2016-01-14 04:17:22
【问题描述】:

我在 SQL Server 2008 R2 中编写了以下函数来获取数据库中两列的值,其中一列由整数 (ID) 和DATETIME 格式的其他日期/时间组成。它将两个值存储在两个不同的数组(列表)中,在这里定义:

  Dim arrPartIDs As New List(Of Integer)
  Dim arrPartUMDates As New List(Of Date)

我的目标是将每一行的日期时间值克隆到“Part_Previous_UMDate”列,当前设置为 NULL。

但是,当我的代码执行该行时:

WinToolSQLCmd.ExecuteReader()

之后

 WinToolSQLCmd = New SqlCommand("UPDATE WTData.dbo.Parts SET Part_Previous_UMDate = '" & arrPartUMDates.Item(intUMDateCounter) & "' WHERE ID = " & PartID.ToString, WinToolConnection)

应用程序返回异常

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

我认为通过创建数组(列表)arrPartUMDates 作为日期列表,我可以简单地将其值传输回数据库,但显然它们在添加到数组时被创建为字符串...

完全精确地将UMDate 中的DATETIME 值克隆到Part_Previous_UMDate 的最佳方法是什么?我需要完全精确,因为稍后我将比较两列的值以确定它们是否需要更新。

有什么想法吗?我已搜索此错误消息,但找不到与处理数组中的日期相关的任何内容...

这里的表格图片:http://i.stack.imgur.com/BYT1j.png

代码:

Function MirrorUMDateInPartsTable()

        Dim arrPartIDs As New List(Of Integer)
        Dim arrPartUMDates As New List(Of Date)
        Dim WinToolConnection As New SqlConnection(StrGlobalWinToolConnection)
        Dim intUMDateCounter As Integer = 0

        WinToolSQLCmd = New SqlCommand("SELECT TOP 5 ID, UMDate FROM WTData.dbo.Parts WHERE WTData.dbo.Parts.Part_Previous_UMDate IS NULL ORDER BY ID", WinToolConnection)
        WinToolConnection.Open()

        Dim reader = WinToolSQLCmd.ExecuteReader()
        While reader.Read()
            arrPartIDs.Add(reader.Item(0))
            arrPartUMDates.Add(reader.Item(1))
        End While
        reader.Close()
        WinToolSQLCmd.Dispose()

        If arrPartIDs.Count > 0 Then
            For Each PartID As Integer In arrPartIDs
                WinToolSQLCmd = New SqlCommand("UPDATE WTData.dbo.Parts SET Part_Previous_UMDate = '" & arrPartUMDates.Item(intUMDateCounter) & "' WHERE ID = " & PartID.ToString, WinToolConnection)
                WinToolSQLCmd.ExecuteReader()
            Next
        End If

        Return Nothing
    End Function

【问题讨论】:

    标签: sql-server vb.net datetime


    【解决方案1】:

    您应该使用SqlParameter 将值添加到您的查询中(并防止 SQL 注入)。您的问题是您在代码中将日期转换为字符串,而 SQL Server 将其视为字符串。发生从 varchar 转换的错误是因为日期格式不是 SQL Server 使用的格式。如果您使用参数,它知道您传递了日期值并正确发送 - 您无需担心任何字符串转换。

    WinToolSQLCmd = New SqlCommand("UPDATE WTData.dbo.Parts SET Part_Previous_UMDate = @DateParam WHERE ID = @IdParam", WinToolConnection)
    WinToolSQLCmd.Parameters.Add("@DateParam", arrPartUMDates.Item(intUMDateCounter))
    WinToolSQLCmd.Parameters.Add("@IdParam", PartID)
    

    另外,它是一个更新查询,所以你应该使用ExecuteNonQuery 来执行你的查询:

    WinToolSQLCmd.ExecuteNonQuery()
    

    ExecuteReader用于从数据库中读取数据。

    【讨论】:

    • 这是正确的。您可能还想扩展此答案以包括原因 - 例如为什么错误(最有可能)首先发生
    • Szymon,我永远不会想到查询中的一组简单参数可以正确管理转换...感谢您的回复,这是一个不常见问题的好答案。
    • 这就是为什么使用参数是一种良好的、既定做法的原因之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2015-02-12
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多