使用日期时间从vb6调用Sql Server 2008存储过程

问题描述 投票:0回答:1

我有一个旧版vb6应用程序,可以访问在SQL2000和SQL2008数据库上运行的数据库。

[使用adDBTimeStamp输入参数从vb6调用带有datetime参数的存储过程时,完整的日期时间(包括秒)将传递给该存储过程。

[在SQL2008 r2数据库中调用相同的存储过程时,秒始终为零。

编辑

在SQL2000数据库和SQL2008 R2数据库上都创建以下存储过程。

CREATE    PROCEDURE [dbo].[TestDate] (@DateAndTime DATETIME)
AS
SET NOCOUNT ON
BEGIN
    SELECT @DateAndTime AS DateAndTime
END

然后使用以下命令按钮事件方法构建VB6应用程序:

Private Sub Command_Click()

    Dim SQL2000_ConnectionString As String
    Dim SQL2008_ConnectionString As String
    Dim DateOnly As Date
    Dim DateAndTime As Date

    DateAndTime = DateTime.Now

    SQL2000_ConnectionString = "Driver={SQL Server};Server=<SQL2000ServerName>;UID=<UserName>;pwd=<Password>;Database=<DataBaseName>;dsn=''"
    SQL2008_ConnectionString = "Provider=SQLNCLI10;DataTypeCompatibility=80;Server=<SQL2008ServerName>;Database=<DataBaseName>;User Id=<UserName>;Password=<Password>;"

    Dim conn As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim rs As ADODB.Recordset
    Dim Msg As String

    Set conn = New ADODB.Connection
    conn.ConnectionTimeout = 300
    Call conn.Open(SQL2000_ConnectionString)

    Set cmd = New ADODB.Command
    With cmd
        .CommandType = adCmdStoredProc
        Set .ActiveConnection = conn
        .CommandType = adCmdStoredProc
        .CommandText = "TestDate"
        .CommandTimeout = 60
        Call .Parameters.Append(.CreateParameter("@dtDateAndTime", adDBTimeStamp, adParamInput))
        .Parameters("@dtDateAndTime").Value = DateAndTime
        Set rs = .Execute
    End With
    If Not rs.EOF Then
        Msg = "DateTime:" & rs.fields("DateAndTime").Value
        Call MsgBox(Msg)
    End If
    Call conn.Close


    Set conn = New ADODB.Connection
    conn.ConnectionTimeout = 300
    Call conn.Open(SQL2008_ConnectionString)

    Set cmd = New ADODB.Command
    With cmd
        .CommandType = adCmdStoredProc
        Set .ActiveConnection = conn
        .CommandType = adCmdStoredProc
        .CommandText = "TestDate"
        .CommandTimeout = 60
        Call .Parameters.Append(.CreateParameter("@dtDateAndTime", adDBTimeStamp, adParamInput))
        .Parameters("@dtDateAndTime").Value = DateAndTime
        Set rs = .Execute
    End With
    If Not rs.EOF Then
        Msg = "DateTime:" & rs.fields("DateAndTime").Value
        Call MsgBox(Msg)
    End If
    Call conn.Close


End Sub

执行vb6应用程序时,将显示第一个消息框,其中包含日期和时间(包括秒)。第二个消息框的秒显示为零。

当我在数据库中记录输入参数时,我看到的是相同的东西。

似乎对SQL2008 R2数据库的调用正在截断输入参数的秒数。

第二编辑

看来OLE DB驱动程序可能是罪魁祸首。当我更改为使用本机客户端时,它似乎可以正常工作。

SQL2008_ConnectionString = "Driver={SQL Server Native Client 10.0};Server=<SQL2008ServerName>;UID=<UserName>;pwd=<Password>;Database=<DataBaseName>;"

由于这是一个使用率很高的旧版应用程序,因此对所有东西进行回归测试以使用新驱动程序的时间太长了。有什么方法可以使OLE DB驱动程序执行正确的操作?

第三编辑

刚刚意识到这不是SQL 2008 R2盒子。我错了。只是SQL2008

这里是我的@@VERSION

Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)   Sep 21 2011 22:45:45   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (VM) 
sql-server-2008 stored-procedures vb6 sql-server-2000
1个回答
1
投票

我找到了解决方案。

显然,解决方案是将命令对象参数的精度和数字小数位数设置为addbTimeStamp的定义大小。

在调用SQL2008数据库之前,将这两行添加到cmd对象参数中,并将秒传递到存储过程。

    .Parameters("@dtDateAndTime").Precision = 23
    .Parameters("@dtDateAndTime").NumericScale = 3
© www.soinside.com 2019 - 2024. All rights reserved.