我有一个存储过程的问题我写了,我可以在管理工作室调用它,它工作正常,但从我的代码隐藏调用它给出了这个错误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。
谢谢
什么是'eventend'和'eventstart'的数据类型? –
eventend和eventstart都是DATETIME,这是什么让我困惑,如果我可以在管理工作室中运行查询,那么我会假设查询是正确的,它是VB,但VB也有正确的数据类型 – Purplegoldfish
不是你的问题,但sp代表系统过程,只应由数据库使用。 – jmoreno