从日期时间从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)
我找到了解决方案。
显然,解决方案是将命令对象参数的精度和数字比例设置为定义的addbTimeStamp大小。
在调用SQL2008数据库之前,将这两行添加到cmd对象参数中,并将秒传递给存储过程。
.Parameters("@dtDateAndTime").Precision = 23
.Parameters("@dtDateAndTime").NumericScale = 3
假设这是一个问题...你可以发布一些代码。 VB6 sie和来自两个数据库的sprocs – Rob 2014-12-05 10:44:43
您可以运行SQL分析器查看针对2008 DB执行的命令吗?我怀疑这些命令是相同的,并且您在2008年的日期列可能是SmallDateTime数据类型。 (只是猜测)。 – 2014-12-05 15:33:54