Sql server 是否使用数组克隆DATETIME列的值?

Sql server 是否使用数组克隆DATETIME列的值?,sql-server,vb.net,datetime,Sql Server,Vb.net,Datetime,我编写了下面的函数来获取数据库中两列的值,一列由整数(ID)和SQL Server 2008 R2中DATETIME格式的其他日期/时间组成。它将两个值存储在两个不同的数组(列表)中,定义如下: Dim arrPartIDs As New List(Of Integer) Dim arrPartUMDates As New List(Of Date) 我的目标是将每行的datetime值克隆到“Part_Previous_UMDate”列,该列当前设置为NULL 但是,当我的代码执行该

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

  Dim arrPartIDs As New List(Of Integer)
  Dim arrPartUMDates As New List(Of Date)
我的目标是将每行的datetime值克隆到“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数据类型导致值超出范围

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

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

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

此处表格的图像:

代码:


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

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
用于从数据库读取数据。

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

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
用于从数据库读取数据。

这是正确的。您可能还想扩展这个答案,以包括为什么——正如为什么(最有可能)错误首先发生在Symon一样,我永远不会想象查询中的一组简单参数能够正确地管理转换。。。感谢您的回复,对于一个不常见的问题,这是一个很好的答案。这就是为什么使用参数是一个好的、公认的做法的原因之一。这是正确的。您可能还想扩展这个答案,以包括为什么——正如为什么(最有可能)错误首先发生在Symon一样,我永远不会想象查询中的一组简单参数能够正确地管理转换。。。感谢您的回复,对于一个不常见的问题,这是一个很好的答案。这就是为什么使用参数是一个好的、已确立的实践的原因之一。