2011-10-21 107 views
1

我有一个存储过程的问题我写了,我可以在管理工作室调用它,它工作正常,但从我的代码隐藏调用它给出了这个错误The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.当我调用da.Fill(dt)由于Varchar转换导致SQL Procedure失败到DateTime错误

这里真正让我困惑的是,我实际上并没有将任何东西从varchar转换为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 Management Studio中运行它没有错误我很确定这个错误在VB中。

我的第一个念头是,也许我传递的@启动参数/ @end值的arent被认可为日期时间,所以我尝试添加的参数,如:

Dim p As New SqlParameter 

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

但这只是给了我同样的结果。如果任何人可以建议我去哪里错了id是gratefull。

谢谢

+0

什么是'eventend'和'eventstart'的数据类型? –

+0

eventend和eventstart都是DATETIME,这是什么让我困惑,如果我可以在管理工作室中运行查询,那么我会假设查询是正确的,它是VB,但VB也有正确的数据类型 – Purplegoldfish

+0

不是你的问题,但sp代表系统过程,只应由数据库使用。 – jmoreno

回答

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)

+0

感谢,似乎已经修复了错误 – Purplegoldfish

相关问题