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

问题描述:

我有一个传统的vb6应用程序,它可以访问在SQL2000和SQL2008数据库上运行的数据库。从日期时间从vb6调用Sql Server 2008存储过程

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

当在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 

结束子

当执行VB6应用程序,所述第一消息框显示的日期和时间,包括秒。第二个消息框的秒数显示为零。

我在数据库中记录输入参数时看到了同样的情况。

看起来好像对SQL2008 R2数据库的调用截断了输入参数的秒数。

2日编辑:

看来,OLE DB驱动程序可能是罪魁祸首。 当我更改为使用Native Client时,它似乎正常工作。 SQL2008_ConnectionString =“Driver = {SQL Server Native Client 10.0}; Server =; UID =; pwd =; Database =;”

由于这是一个使用频率很高的传统应用程序,回归测试所有使用新驱动程序是时间过于紧张。有没有办法让OLE DB驱动程序做正确的事情?

3日编辑:

刚刚意识到这不是一个SQL 2008 R2箱。我误解了。它只是SQL2008

这是我的@@版本: 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位)在Windows NT 6.1(内部版本7601:Service Pack 1)(VM)

+0

假设这是一个问题...你可以发布一些代码。 VB6 sie和来自两个数据库的sprocs – Rob 2014-12-05 10:44:43

+1

您可以运行SQL分析器查看针对2008 DB执行的命令吗?我怀疑这些命令是相同的,并且您在2008年的日期列可能是SmallDateTime数据类型。 (只是猜测)。 – 2014-12-05 15:33:54

我找到了解决方案。

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

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

.Parameters("@dtDateAndTime").Precision = 23 
    .Parameters("@dtDateAndTime").NumericScale = 3