none
ADO로 MySQL의 stored procedure를 호출할 때 output parameter 값이 제대로 출력되지 않습니다. RRS feed

  • 질문

  • MySQL 5.7 에서 다음과 같은 stored procedure를 생성했습니다.
    -----------------------------------------------------------------------------
    CREATE PROCEDURE `cursor_test`(out o_int int, out o_string varchar(20))
    BEGIN
    declare v_cursor cursor for select 2;
    open v_cursor;
    set o_int = 123;
    set o_string = "chaeyk";
    END
    -----------------------------------------------------------------------------
    그리고 C++ 코드는 다음과 같이 작성해서 호출할 때 output parameter의 값이 제대로 출력되지 않습니다.
    MySQL에서 OLEDB driver를 정식으로 제공하지 않기 때문에
    CherryCitySoftware에서 제공하는 OLEDB driver를 사용했습니다.
    (https://cherrycitysoftware.com/Products/MySqlProvider)
    -----------------------------------------------------------------------------
    #include <stdio.h>
    #include <tchar.h>
    #include <string>
    #include <Windows.h>
    #include <tchar.h>
    #include <oledb.h>
    #include <conio.h>
    #include <icrsint.h>
    #import "C:\\Program Files (x86)\\Common Files\\System\\ado\\msado60.tlb" no_namespace rename("EOF","EndOfFile")
    ...

    _ConnectionPtr pConnection;
    pConnection.CreateInstance(__uuidof(Connection));
    _bstr_t bstrConnection = "Provider=MySQL Provider; Data Source=xxxx; Initial Catalog=yyyy; Activation=xxxx";
    _bstr_t bstrUser = "user";
    _bstr_t bstrPass = "pass";
    pConnection->Open(bstrConnection, bstrUser, bstrPass, adModeUnknown);
    pConnection->CursorLocation = adUseClient;
    pConnection->PutCommandTimeout(300);
    _CommandPtr cmd;
    cmd.CreateInstance(__uuidof(Command));
    cmd->ActiveConnection = pConnection;
    cmd->CommandType = adCmdStoredProc;
    cmd->CommandText = _bstr_t(L"cursor_test");
    cmd->Parameters->Append(cmd->CreateParameter(_bstr_t(L"o_int"), adInteger, adParamOutput, 4, _variant_t(_bstr_t(L"0"))));
    cmd->Parameters->Append(cmd->CreateParameter(_bstr_t(L"o_string"), adVarWChar, adParamOutput, 4096, _variant_t(_bstr_t(L""))));
    cmd->Execute(NULL, NULL, adCmdStoredProc);
    _variant_t v = pCmd->Parameters->Item[_variant_t("o_string")]->Value;
    _bstr_t bstr = (_bstr_t) v;
    const char* str = (const char*) bstr;
    printf_s("o_string=%s\n", name, str);
    -----------------------------------------------------------------------------
    여기서 o_string 값이 엉터리 값으로 출력됩니다.
    C#에서 cherrycitysoftware의 OLEDB provider를 사용할 때는 잘동작하는 것을 확인했습니다.
    C# 코드는 다음과 같습니다.
    ---------------------------------------------------------------------------------
    string connectionString = "Provider=MySQL Provider; Data Source=xxxxx; User ID = yyyyy; Password = zzzzz; Initial Catalog=aaaaa; Activation=bbbbb";
    using (var connection = new OleDbConnection(connectionString))
    {
        var command = new OleDbCommand("call cursor_test(?, ?)", connection);
        command.Parameters.AddWithValue("o_int", 0).Direction = ParameterDirection.Output;
        command.Parameters.Add("o_string", OleDbType.VarChar, 100).Direction = ParameterDirection.Output;
        connection.Open();
        command.ExecuteNonQuery();
        Console.WriteLine("i:{0}, s:{1}", command.Parameters["o_int"].Value, command.Parameters["o_string"].Value);
    }
    ---------------------------------------------------------------------------

    C#에서 잘 동작하는 provider가 C++에서는 잘 동작하지 않는 이유가 궁금합니다.
    2017년 4월 17일 월요일 오후 12:11