programing

엑셀 VBA에서 sql 데이터베이스로 매개 변수를 전달할 때 adDecimal 유형을 사용하는 방법은 무엇입니까?

megabox 2023. 8. 7. 22:28
반응형

엑셀 VBA에서 sql 데이터베이스로 매개 변수를 전달할 때 adDecimal 유형을 사용하는 방법은 무엇입니까?

ADODB 연결 및 매개 변수를 사용하여 Excel/VBA를 사용하여 SQL 데이터베이스와 통신하고 있습니다.데이터베이스에 Decimal 유형(13,4)의 열이 있으므로 VBA 유형 adDecimal을 사용하여 다음 매개 변수를 생성하려고 했습니다.

Set param = dbCmd.CreateParameter("myvalue", adDecimal, adParamInput, 0, myvalue)
param.NumericScale = 4
param.Precision = 13

그러나 내 값이 더 이상 오래 저장될 수 없는 즉시 실패합니다. 즉, 1000*myvalue > 2147483647입니다.오류는 발생하지 않지만 데이터베이스에 기록된 값이 횡설수설하거나 오버플로 상태입니다.

내 값을 두 배로 변환하려고 시도했습니다.CDbl(myvalue)또는 소수CDec(myvalue)CreateParameter(매개 변수 만들기) 함수에 전달했지만 아무런 영향을 미치지 않았습니다.

이 문제를 해결하는 것은 대신 adDouble 유형의 매개 변수를 만드는 것입니다.그래서 저는 저에게 맞는 해결책을 찾았지만, 여전히 그 문제에 대해 어리둥절합니다.내부 변환이 발생하고 있습니까? 아니면 adDecimal 유형을 사용하는 방법을 잘못 이해하고 있습니까?VBA에서 십진수 데이터베이스 값을 처리하는 올바른 방법은 무엇입니까?

다음은 최소 작업 예제입니다(기존 mysql/mariaDB 데이터베이스의 경우).
데이터베이스에서:

CREATE TABLE mytable ( 
  id SMALLINT AUTO_INCREMENT PRIMARY KEY, 
  dec1 DECIMAL(13,4),
  dec2 DECIMAL(13,4)
); 

VBA의 경우:

Public Sub test()
    WriteToDB 123456789.1234, 123456789.1234
    WriteToDB 214748.3647, 214748.3647
    WriteToDB 214748.3648, 214748.3648
End Sub

Public Sub WriteToDB(dec1 As Variant, dec2 As Variant)
    Dim dbConn As ADODB.Connection
    Dim dbCmd As ADODB.Command
    Dim sql As String
    Dim param As ADODB.Parameter
    
    'Open database connection
    Set dbConn = New ADODB.Connection
    dbConn.Open "Provider=MSDASQL;DSN=XXX;DATABASE=XXX;UID=XXX;PWD=XXX;"
    
    Set dbCmd = New ADODB.Command
    dbCmd.ActiveConnection = dbConn
    dbCmd.CommandType = adCmdText
    
    'Define command and parameters
    sql = "INSERT INTO mytable (dec1, dec2) VALUES (?, ?)"
    Set param = dbCmd.CreateParameter("dec1", adDecimal, adParamInput, 0, dec1)
    param.NumericScale = 4
    param.Precision = 13
    dbCmd.Parameters.Append param
    
    Set param = dbCmd.CreateParameter("dec2", adDouble, adParamInput, 0, dec2)
    dbCmd.Parameters.Append param
  
    'Execute command
    dbCmd.CommandText = sql
    dbCmd.Execute , , adExecuteNoRecords
    
    'Close connection
    dbConn.Close
End Sub

데이터베이스 결과:

MariaDB [XXX]> SELECT * FROM mytable;
+----+--------------+----------------+
| id | dec1         | dec2           |
+----+--------------+----------------+
|  1 |  191227.7282 | 123456789.1234 |
|  2 |  214748.3647 |    214748.3647 |
|  3 | -214748.3640 |    214748.3648 |
+----+--------------+----------------+

보시다시피 id=1 및 id=3의 dec1 값이 잘못되었습니다.

이것은 정말로 벌레인 것으로 밝혀졌습니다.동일한 문제가 발생한 경우 다음과 같이 처리할 수 있습니다.

  • 최신 mariadb-connector 버전으로 업데이트합니다.버그 보고서에 따르면 이 문제는 버전 3.1.12에서 수정되었습니다.
  • mariadb-connector 대신 mysql-connector 사용
  • 질문에 설명된 대로 excel에서 adDouble로 매개 변수를 만듭니다.

언급URL : https://stackoverflow.com/questions/66660886/how-to-use-type-addecimal-when-passing-parameters-from-excel-vba-to-sql-database

반응형