【发布时间】: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)
但这只是给了我相同的结果。如果有人能建议我哪里出错了,不胜感激。
谢谢
【问题讨论】:
-
eventend和eventstart的数据类型是什么? -
eventend 和 eventstart 都是 DATETIME,这让我感到困惑,如果我可以在 management studio 中运行查询,那么我会假设查询是正确的并且它是 VB,但 VB 有数据类型也正确
-
不是你的问题,但 sp 代表系统过程,只能由数据库使用。