2014-12-05 104 views
0

我有一個傳統的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

回答

1

我找到了解決方案。

顯然,解決方案是將命令對象參數的精度和數字比例設置爲定義的addbTimeStamp大小。

在調用SQL2008數據庫之前,將這兩行添加到cmd對象參數中,並將秒傳遞給存儲過程。

.Parameters("@dtDateAndTime").Precision = 23 
    .Parameters("@dtDateAndTime").NumericScale = 3 
相關問題