【问题标题】:Conversion failed when converting the varchar value '08/22/1954' to data type int将 varchar 值“08/22/1954”转换为数据类型 int 时转换失败
【发布时间】:2013-07-07 16:17:45
【问题描述】:

我正在尝试在我的 sql command 中写入 stored procedure,如图所示:

Dim tdate As String = Me.PresentDate.Value.ToString("MM-dd-yyyy")

myCommand As New SqlCommand("select c.description as 'provider',b.lastname,
b.firstname, b.middleinitial,convert(varchar(10),b.dob,101) as DOB,
b.chartID,b.sex, d.businessname,d.businessfax from patientappointmentbase as a, 
patientlistbase as b,resourcebase as c, locationbase as d where convert(varchar(10),
a.starttime,101) = " & tdate & " 
and a.patientid = b.patientid and a.resourceid = c.resourceid and 
a.locationid = d.locationid order by provider, lastname, firstname", myConnection)

当我运行这段代码时,我得到的错误是

Conversion failed when converting the varchar value '08/22/1954' to data type int.

【问题讨论】:

  • 您确定这条消息是指“tdate”变量吗?我看到另一个转换,消息中的值似乎是 DOB 而不是开始时间
  • @steve-yes...我敢肯定,因为我给出了具体的日期而不是 tdate,而且效果很好..

标签: vb.net date stored-procedures sqlcommand


【解决方案1】:

您有两个主要问题。

第一个问题是日期被内联到 SQL 中,因此您正在执行的 SQL 看起来像:

select ... where convert(varchar(10), a.starttime,101) = 07-07-2013

这不是有效的SQL,所以你需要将日期参数用单引号括起来,即

... where convert(varchar(10), a.starttime,101) = '" & tdate & "' and ...

如果将它用双引号括起来并且将 QUOTED_IDENTIFIER 设置为 on,SQL Server 将尝试将其解释为列名。

第二个问题是您使用两种不同的日期格式进行比较。使用 101 样式进行转换会产生格式为 mm/dd/yyyy 的日期。但是,您使用的是 mm-dd-yyyy 格式。

这意味着您要求 SQL Server 将“07/07/2013”​​与“07-07-2013”​​进行比较,这将永远不会相同。最简单的解决方法是更改​​ tdate 的日期格式以匹配 SQL Server:

Dim tdate As String = Me.PresentDate.Value.ToString("MM/dd/yyyy")

【讨论】:

    【解决方案2】:

    你的连接的 SQL 字符串看起来像

    convert(varchar(10), a.starttime,101) = 08/22/1954
    

    这是一系列除法运算,产生一个数字,而不是日期。

    您希望通过将值括在引号中来创建日期文字。
    (或者,更好的是,使用参数)

    【讨论】:

    • 我在双引号内使用过......而且我什至尝试过使用@Date 并传递了日期参数,尽管我有同样的问题。
    猜你喜欢
    • 2011-12-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多