【问题标题】:SQL Procedure failing due to Conversion of Varchar To DateTime error由于将 Varchar 转换为 DateTime 错误,SQL 过程失败
【发布时间】:2011-10-21 09:27:13
【问题描述】:

我编写的存储过程有问题,我可以在管理工作室中调用它,它工作正常,但是当我调用 da.Fill(dt) 时从我的代码隐藏调用它会出现此错误The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

真正让我感到困惑的是,我实际上并没有将任何东西从 varchar 转换为 datetime,我对日期变量所做的最多的事情就是将它们格式化为不同的 datetime 格式。

我的 VB.Net 代码

  Private Function dbGetEvents(ByVal start As DateTime, ByVal days As Integer) As DataTable
      Dim dt As New DataTable()

      Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("Blueprint").ToString())

      Dim cmd As New SqlCommand
      cmd.CommandType = CommandType.StoredProcedure
      cmd.CommandText = "spGetEventDetails"
      cmd.Parameters.AddWithValue("@start", start)
      cmd.Parameters.AddWithValue("@end", start.AddDays(days))
      cmd.Parameters.AddWithValue("@userid", ddlUser.SelectedValue)

      cmd.Connection = conn

      Using da As New SqlDataAdapter(cmd)
         conn.Open()
         da.Fill(dt)
         conn.Close()
      End Using

      Return dt
   End Function

我的 SQL 过程:

CREATE PROCEDURE spGetEventDetails
(
    @start AS DATETIME,
    @end AS DATETIME,
    @userid AS INT
)
AS
BEGIN

SET @start = CONVERT(CHAR(10), CAST(@start AS DATETIME), 23)
SET @end = CONVERT(CHAR(10), CAST(@end AS DATETIME), 23)

    -- GET DETAILS FOR TICKETS
    SELECT
        [ev].[id]                           AS [EventID],
        CAST([tck].[TicketID] AS NVARCHAR)  AS [TicketID],
        [tck].[Description]                 AS [Description],
        [ev].[eventstart]                   AS [Start],
        [ev].[eventend]                     AS [End],
        [ev].[status]                       AS [Status],
        [ev].[type]                         AS [EventType],
        CAST([tck].[Type] AS NVARCHAR)      AS [Type],
        CAST([tck].[Product] AS NVARCHAR)   AS [Product],
        CAST([tck].[Severity] AS NVARCHAR)  AS [Severity],
        [ev].[resource_id]                  AS [resource_id],
        CAST(pers.FirstName AS NVARCHAR)    AS [FirstName],
        CAST(pers.Surname AS NVARCHAR)      AS [Surname],
        CAST(tck.LogDate AS NVARCHAR)       AS [LogDate]
    FROM
        tblSupportEvent ev
    JOIN
        tblTicketsInEvents tie
    ON
        ev.id =tie.eventID
    JOIN
        SupportTicketsTbl tck
    ON
        tie.ticketID = tck.TicketID 
    JOIN 
        PersonnelTbl pers
    ON
        pers.ID = tck.LoggedBy 
    WHERE
        ev.type = 1
    AND 
        NOT (([eventend] <= @start) OR ([eventstart] >= @end))  
    AND  
        resource_id <> 0  
    AND   
        ev.resource_id = @userid  

UNION 
    -- GET THE DETAILS FOR NON TICKET ITEMS

    SELECT
        [ev].[id]           AS [EventID],
        ''                  AS [TicketID],
        [nti].[Description] AS [Description],
        [ev].[eventstart]   AS [Start],
        [ev].[eventend]     AS [End],
        [ev].[status]       AS [Status],
        [ev].[type]         AS [EventType],
        ''                  AS [Type],
        ''                  AS [Product],
        ''                  AS [Severity],
        [ev].[resource_id]  AS [resource_id],
        ''                  AS [FirstName],
        ''                  AS [Surname],
        ''                  AS [LogDate]
    FROM
        tblSupportEvent ev
    JOIN
        tblNonTicketsInEvents nte
    ON
        ev.id = nte.eventID 
    JOIN
        tblNonTicketItems nti
    ON
        nte.nonTicketID = nti.id    
    WHERE
        ev.type = 2
    AND
        NOT (([eventend] <= @start) OR ([eventstart] >= @end))  
    AND  
        resource_id <> 0  
    AND   
        ev.resource_id = @userid  
END

我看不出这个错误可能来自哪里,在 SQL 管理工作室中测试运行它没有错误我很确定错误在 VB 中。

我的第一个想法是,我在 @start / @end 值中传递的参数可能没有被识别为 DateTime,所以我尝试添加如下参数:

 Dim p As New SqlParameter

  p.SqlDbType = SqlDbType.DateTime
  p.ParameterName = "@start"
  p.Value = start
  cmd.Parameters.Add(p)

但这只是给了我相同的结果。如果有人能建议我哪里出错了,不胜感激。

谢谢

【问题讨论】:

  • eventendeventstart的数据类型是什么?
  • eventend 和 eventstart 都是 DATETIME,这让我感到困惑,如果我可以在 management studio 中运行查询,那么我会假设查询是正确的并且它是 VB,但 VB 有数据类型也正确
  • 不是你的问题,但 sp 代表系统过程,只能由数据库使用。

标签: sql vb.net


【解决方案1】:

登录的语言可能不同。

set dateformat mdy

declare @start datetime = '20110130'

SET @start = CONVERT(CHAR(10), CAST(@start AS DATETIME), 23)

有效。但是set dateformat dmy 没有。

要提取datetimedate 部分,您可以使用DATEADD(DAY,DATEDIFF(DAY,0,@start),0)

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 2019-07-04
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多