【问题标题】:VB.NET, SQL Server and list of datesVB.NET、SQL Server 和日期列表
【发布时间】:2021-01-19 21:15:26
【问题描述】:

我有一个以日期列表为参数的查询。在 VB.NET 中,日期位于字符串 ArrayList 中,我使用 String.Join() 方法将它们放在逗号分隔的列表中。问题是当我这样做时,双引号会放在字符串的开头和结尾,而 SQL 会抱怨这一点(我认为;见下文)。如何从不带引号的字符串ArrayList 中获取日期列表。

我的数组列表包含这些值:

'2020-08-30'
'2020-08-27'
'2020-09-28'
'2020-09-09'
'2020-08-31'
'2020-08-29'

当我使用 String.Join(",", sDates) 加入他们时,我得到以下信息:

"'2020-08-30','2020-08-27','2020-09-28','2020-09-09','2020-08-31','2020-08-29'"

当我在参数查询中使用它时,它会被拒绝。 comm.Parameters.AddWithValue("@dates", String.Join(",", sDates))

sql 包含以下"

...where pj.ProjectName =@projectname And tcd.Date in (@dates)

我得到的确切错误是

    System.Data.SqlClient.SqlException
    HResult=0x80131904
    Message=Incorrect syntax near ','.
    Source=.Net SqlClient Data Provider

有什么建议吗?

【问题讨论】:

  • 正确的做法是使用表值参数。
  • 也可能是 addwithvalue 对您不利的情况之一。不知道 tcd.Date 的数据类型是什么,但您可能会发现 AddWithValue 假设您正在使用字符串并与日期列进行比较
  • 当您说“我有一个查询”时,您的意思是存储过程吗?如果是这样,我们可以将存储过程视为问题的一部分吗?
  • tcd.Date的数据类型是什么?

标签: sql-server vb.net parameters


【解决方案1】:

这个错误信息:

',' 附近的语法不正确

不是由您完成 IN 的方式引起的。它是由其他原因引起的,例如选择块中的逗号错误:

SELECT , a FROM x
       ^

你写 IN 的方式也行不通,因为它在概念上和写这个是一样的:

SELECT * FROM table WHERE dateColumn IN ('''2000-01-01'',''2000-02-01''')

没有字符串值为'2000-01-01','2000-02-01'的日期。

如果您想在此处尝试的样式中使用 IN,您必须为每个日期值添加一个参数并进行相应的设置:

sqlCommand.CommandText = "SELECT * FROM table WHERE dateCol IN("
Dim p = 0
For Each d as DateTime in MyDateList
  sqlCommand.CommandText &= "@p" & i & "," 'concat param placeholder on
  sqlCommand.Parameters.AddWithValue("@p" & i, d)
  i += 1
Next d

sqlCommand.CommandText = sqlCommand.CommandText.TrimEnd(","c) & ")" 'get rid of trailing comma and close the IN brackets

这将生成一个类似的sql

SELECT * FROM table WHERE dateCol IN (@p0,@p1,@p2)

具有 3 个参数和一个填充的参数集合。您已经被指向 Joel 关于 AddWithValue 的博客,所以我不会重复它。但我确实想说,您提出问题的方式意味着您有一个字符串列表,而不是日期时间。您绝对应该确保您的列表中有 DateTimes,并且您的 db 列应该是基于日期的类型,而不是基于字符串的类型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2017-01-10
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2014-08-03
    相关资源
    最近更新 更多