我需要將某些數據從SQL Server表複製到具有Excel VBA的類似Access表中。爲此,我創建了一個函數,該函數根據Select語句創建將SQL插入到Access數據庫(PreparedStatement)到SQL Server。在ADODB中執行具有十進制值的查詢時,類型不匹配錯誤在ADODB.Parameter中鍵入adNumeric
事情發展很好,字符串,日期和整數。有多少十進制值(adNumber類型)導致錯誤「標準表達式中的數據類型不匹配」。如果我將小數點四捨五入到整數,事情就會順利進行。我還確認可以使用訪問手動將十進制值輸入到目標表中。
原始SQL Server源表字段中的數據類型爲十進制(18,4),目標Access表中對應的類型爲數字(十進制字段類型,精度爲18,比例尺爲4)。下面的代碼看到字段類型adNumeric和NumericScale是4和精度是18.
例如,當我從源表中讀取值5.16,並嘗試將其插入到目標表中時,出現錯誤。如果我將讀取值舍入爲5,則插入無錯誤地工作。
那麼我在這裏做錯了什麼,我應該怎麼做才能得到十進制數?
我創建和執行基礎上,選擇查詢的INSERT語句如下:
Private Sub AddToTargetDatabase(ByRef source As ADODB.Recordset, ByRef targetCn As ADODB.connection, tableName As String)
Dim flds As ADODB.Fields
Set flds = source.Fields
'target table is cleared at the beginning
targetCn.Execute ("DELETE FROM " & tableName)
Dim insertSQL As String
insertSQL = "INSERT INTO " & tableName & "("
Dim valuesPart As String
valuesPart = ") VALUES ("
Dim i As Integer
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = targetCn
cmd.Prepared = True
Dim parameters() As ADODB.Parameter
ReDim parameters(flds.Count)
'Construct insert statement and parameters
For i = 0 To flds.Count - 1
If (i > 0) Then
insertSQL = insertSQL & ","
valuesPart = valuesPart & ","
End If
insertSQL = insertSQL & "[" & flds(i).Name & "]"
valuesPart = valuesPart & "?"
Set parameters(i) = cmd.CreateParameter(flds(i).Name, flds(i).Type, adParamInput, flds(i).DefinedSize)
parameters(i).NumericScale = flds(i).NumericScale
parameters(i).Precision = flds(i).Precision
parameters(i).size = flds(i).DefinedSize
cmd.parameters.Append parameters(i)
Next i
insertSQL = insertSQL & valuesPart & ")"
Debug.Print insertSQL
cmd.CommandText = insertSQL
'String generated only for debug purposes
Dim params As String
Do Until source.EOF
params = ""
For i = 0 To flds.Count - 1
Dim avalue As Variant
If (parameters(i).Type = adNumeric) And Not IsNull(source.Fields(parameters(i).Name).Value) And parameters(i).Precision > 0 Then
avalue = source.Fields(parameters(i).Name).Value
'If rounded insert works quite nicely
'avalue = Round(source.Fields(parameters(i).Name).Value)
Else
avalue = source.Fields(parameters(i).Name).Value
End If
'construct debug for the line
params = params & parameters(i).Name & " (" & parameters(i).Type & "/" & parameters(i).Precision & "/" & source.Fields(parameters(i).Name).Precision & ") = " & avalue & "|"
parameters(i).Value = avalue
Next i
'print debug line containing parameter info
Debug.Print params
'Not working with decimal values!!
cmd.Execute
source.MoveNext
Loop
End Sub
讓我猜...您的小數點符號是逗號嗎?而在數據庫中它是'.'? – Vityata