【问题标题】:function that contains " Mysql Insert into" command in vb6 clalled from a dll在从 dll 调用的 vb6 中包含“Mysql Insert into”命令的函数
【发布时间】:2026-02-13 19:30:01
【问题描述】:

我做了一个在表格中添加记录的函数:

Public Function AjouterCleint _ 
(ByVal pcode As String, ByVal prsoc As String, ByVal padresse As String, ByVal pcp As String) As Boolean


    On Error GoTo ErrorHandler
    MsgBox " code  " & "   : " & pcode & " / rsoc : " & prsoc & " / adresse : " & padresse & " /  cp : " & pcp
    AjouterCleint = False
    Dim rs As New Recordset
    Set rs = New Recordset
    Dim conn As ADODB.Connection
    Dim strIPAddress As String
    Set con = New ADODB.Connection
    con.CursorLocation = adUseClient
    con.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _
    & "SERVER=LOCALHOST;" _
    & " DATABASE=ste002;" _
    & "UID=root;PWD=; OPTION=3"
    con.Open
    Set rs = Nothing  
    rs.CursorLocation = adUseClient  
    SQL = "INSERT INTO Client (code,rsoc,adresse,cp) VALUES ('" _
    & pcode & "','" & prsoc & "','" & padresse & "','" & pcp & "')"
    MsgBox "5"
    rs.Open SQL, con, 3, 3
    MsgBox "6"
    Set rs = Nothing
    MsgBox "7"
    con.Close
    MsgBox "8"
    Set con = Nothing
    MsgBox "9"
    AjouterCleint = True
    ErrorHandler:
    MsgBox Err.Number & vbLf & Err.Description & vbLf & Err.HelpContext & vbLf & Err.Source, , ""
 End Function

参数的值不是我用的一些。 (我进入消息框:

 code: ????, rsoc: ????, adresse :???? , cp :1

当我以普通方式使用此功能时(我将它添加到一个模块中并称之为:

 a = AjouterCleint("13234", "1234", "1234", "1234")

它可以工作,但是当我把它放在一个 dll 中时,出现了一个错误:

    2147217900
    [MySQL][ODBC 3.51 DRIVER] ... SYNTHAX error in “???????????????” in line 1.
    1000440
    Microsoft OLE DB providerfor ODBC drivers

例外在这一行:

    rs.Open SQL, con, 3, 3

我删除了INSET COMMAND中的所有参数并替换了

    SQL = "INSERT INTO Client (code,rsoc,adresse,cp) VALUES ('" _
    & pcode & "','" & prsoc & "','" & padresse & "','" & pcp & "')"

    SQL = "INSERT INTO Client (code,rsoc,adresse,cp) VALUES (12,12,12,12)"

它在 dll 中工作(我在其他项目中调用它并且它工作)。
但我必须使用参数。
所以,任何建议!
非常感谢。
PS:“recordset.addnew”也不起作用,并且也引发了错误。

这就是我在 dll 中调用函数的方式:

Private Declare Function FunctionCalled Lib "C:\dlls\vbm2dll\Called.dll" _
(ByVal strValuePassed As String) As String

Private Declare Function AjouterCleint Lib "C:\dlls\vbm2dll\Called.dll" _
 (ByVal pcode As String, ByVal prsoc As String, ByVal padresse As String, ByVal pcp As String) As Boolean
Private Sub Form_load()

    txbValuePassed = "abc"

End Sub
Private Sub cmdCall_Click()
    txbValueReturned = FunctionCalled(txbValuePassed)
    a = AjouterCleint("1104", "1", "1", "1")
    MsgBox a & ""

End Sub

【问题讨论】:

    标签: mysql dll vb6 ado


    【解决方案1】:

    这可能与您将参数传递给 DLL 的方式有关。您显示的代码没有指定ByRefByVal,因此它使用默认值,我认为在VB6 中是ByRef,但您可能没有传递地址。这个:

     Public Function AjouterCleint(ByVal pcode As String, _
                          ByVal prsoc As String, _
                          ByVal padresse As String, _
                          ByVal pcp As String) As Boolean
    

    可能会解决问题。

    编辑

    您的应用程序代码还需要匹配该声明以告诉 VB 如何传递变量:

     [Private|Public] Declare Function AjouterCleint Lib "MyLibName.dll" [Alias "AliasName"] _
             (ByVal pcode As String, _
              ByVal prsoc As String, _
              ByVal padresse As String, _
              ByVal pcp As String) As Boolean
    

    由于 BSTR 基本上仍然是一个指针,您可能必须复制字符串数据,尽管它似乎应该在 VB 中同时适用于双方):

    Private Declare Sub RtlMoveMemory Lib "kernel32" (ptrDst As Any, _
           ptrSrc As Any, ByVal lLen As Long)
    
     Private Function vbstr(ptr As Long) As String
        Dim l As Long
    
        l = lstrlenW(ptr)
        vbstr = String$(l, vbNullChar)
    
        Call RtlMoveMemory(ByVal StrPtr(vbstr), ByVal ptr, l * 2)
    
     End Function
    

    【讨论】:

    • 你是对的,dll描述有错误,参数值为:???? ,??? ,???? , 1。我不知道为什么。我将编辑帖子并向您展示 dll 声明
    • 您的应用程序中的声明很重要 - 需要看到这一点。 DLL 中的声明和声明创建了一种握手...参见编辑
    • 似乎正确,但我的 VB6 生锈了。我相信字符串将作为指针传递,您将不得不使用旧的 VbPtrToStr 技巧,即使用 RtlMoveMemory 将数据复制到新的字符串变量。此时,您必须质疑将其放入 DLL 的价值。我认为这可以避免,因为双方都是 VB6。查看编辑