.net datareader更改从SQL Server返回的字符串/ varchar中的日期

时间:2018-01-22 12:57:13

标签: asp.net sql-server vb.net datetime

问题

在尝试获取周结束日期时,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}}不用于添加参数。

0 个答案:

没有答案