问题
在尝试获取周结束日期时,VB.NET DbDataReader似乎正在更改从数据库返回的字符串中的日期。 分别使用18-jan-2018和1-mar-2018作为开始日期和结束日期,我希望从数据库中找回以下字符串。
Week Ending 21/01/2018
Week Ending 28/01/2018
Week Ending 04/02/2018
Week Ending 11/02/2018
Week Ending 18/02/2018
Week Ending 25/02/2018
Week Ending 04/03/2018
在我的本地开发系统上,我恢复了上面的正确日期。在其他开发系统和生产系统上,我回来了
Week Ending 22/01/2018
Week Ending 29/01/2018
Week Ending 05/02/2018
Week Ending 12/02/2018
Week Ending 19/02/2018
Week Ending 26/02/2018
Week Ending 05/03/2018
代码
SQL存储过程从.net前端获取开始和结束日期。传入的值是正确的。
SQL存储过程
SET @dteStartDate = CAST(@prmStartDate As smalldatetime)
SET @dteEndDate = CAST(@prmEndDate As smalldatetime)
DECLARE @MyTempTable TABLE (
[tmpDate] [smalldatetime],
[NumReferrals] [int] NULL
)
DECLARE @dteCurrent AS SMALLDATETIME
DECLARE @NumReferrals AS INT
SELECT @dteCurrent = dbo.fnGetEndOfWeek(@dteStartDate)
WHILE @dteCurrent <= dbo.fnGetEndOfWeek(@dteEndDate)
BEGIN
--SELECT FROM DATA
INSERT INTO @MyTempTable (tmpDate, NumReferrals) VALUES (@dteCurrent, @NumReferrals)
SET @dteCurrent = DATEADD(Week, 1, @dteCurrent)
END
SELECT NumReferrals as Referrals,
'Week Ending ' + convert(nvarchar, tmpDate, 103) AS WeekEnding
FROM @MyTempTable
功能fnGetEndOfWeek
CREATE FUNCTION dbo.fnGetEndOfWeek
(
@prmInputDate smalldatetime
)
BEGIN
Declare @AddNumOfDay INT
-- If input date is not Sunday, move it foward to Sunday
-- 1 Sunday
-- 2 Monday
-- ...
-- 7 Saturday
SELECT @AddNumOfDay = CASE (DATEPART(WEEKDAY, @prmInputDate))
WHEN '2' THEN '6'
WHEN '3' THEN '5'
WHEN '4' THEN '4'
WHEN '5' THEN '3'
WHEN '6' THEN '2'
WHEN '7' THEN '1'
WHEN '1' THEN '0'
END
RETURN DATEADD(d,@AddNumOfDay,@prmInputDate)
END
从SQL Server返回的结果在所有系统上都是正确的(开发和生产。
.NET代码如下:
Dim dtSeriesData As New Data.DataTable
Using cmdGetSeries As SqlCommand = conLocal.CreateCommand()
Using sqlSeries As SqlDataAdapter = New SqlDataAdapter()
cmdGetSeries.CommandType = Data.CommandType.StoredProcedure
cmdGetSeries.CommandText = sp
For Each param As SqlParameter In sqlParams
If Not param Is Nothing Then
cmdGetSeries.Parameters.Add(param)
End If
Next
Using dr As System.Data.Common.DbDataReader = cmdGetSeries.ExecuteReader()
dtSeriesData.Load(dr) *
End Using
End Using
cmdGetSeries.Parameters.Clear()
End Using
在星号(dtSeriesData.Load(dr)
)处,数据行由于某种原因发生了变化,即使它是一个字符串。
问题
为什么会这样?我们都在使用.NET 4.5,SQL Server 2014.甚至将返回的SELECT作为varchar进行转换,或者将临时表列类型设置为varchar而不是datetime会产生相同的结果,除了本地机器之外,String由.NET操纵。是否有某些我错过的.net设置?
额外评论后的评论结果
使用jQuery UI DatePicker控制器选择开始日期和结束日期,在SQL Server上执行以下操作(使用sql profiler)
exec spGetGraphReferralsbyWeekAll @prmStartDate='18 Jan 2018',@prmEndDate='01 Mar 2018'
此过程在SSMS中返回以下数据
Week Ending 21/01/2018
Week Ending 28/01/2018
Week Ending 04/02/2018
Week Ending 11/02/2018
Week Ending 18/02/2018
Week Ending 25/02/2018
Week Ending 04/03/2018
在Visual Studio中使用DataSet Visualiser获取dtSeries.Indexes(0).Table带回来
Week Ending 22/01/2018
@@DATEFIRST
变量在显示正确结果的计算机上返回SSMS中的7
,而在没有显示正确结果的计算机上返回103
。
在存储过程中将DateTime属性从127
更改为2018-01-21T00:00:00
会在工作的计算机和不起作用的计算机上返回相同(正确)的日期dtSeriesData.Load
。该日期仍然由应用程序的conLocal
部分更改。
.AddWithValue
不是持久性SQL连接
{{1}}不用于添加参数。