我有一个旧版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)
我找到了解决方案。
显然,解决方案是将命令对象参数的精度和数字小数位数设置为addbTimeStamp的定义大小。
在调用SQL2008数据库之前,将这两行添加到cmd对象参数中,并将秒传递到存储过程。
.Parameters("@dtDateAndTime").Precision = 23
.Parameters("@dtDateAndTime").NumericScale = 3