1

これがコードです。
それについてのいくつかのメモ。DStr は、社内の文字列クラスです。CString と同じように機能します。データベースに接続して、パラメータ化されていないクエリを実行できます。また、パラメーターを使用しない場合、この挿入は正常に機能します。cmd->Execute ステートメントは例外をスローします。これは、エラーメッセージを取得している場所です。

    void CEmailArchiveDatabase::TestAddUser( DStr username, DStr displayname )
{

    DStr sql = "INSERT INTO [User] (UserName, DisplayName) VALUES (@Param1, @Param2)";

    _variant_t vUser;
    _variant_t vDisp; 

    vUser.vt = VT_BSTR;
    vUser.bstrVal = username.AllocSysString();
    vDisp.vt = VT_BSTR;
    vDisp.bstrVal = displayname.AllocSysString();

    _CommandPtr cmd = NULL;
    _ConnectionPtr conn = NULL;
    _ParameterPtr prm = NULL;

    DStr connStr = "driver={SQL Server};server=DEMETER\\SQLEXPRESS;database=ExtractoMundo";

    try
    {
        conn.CreateInstance(__uuidof(Connection));
        cmd.CreateInstance(__uuidof(Command));

        if( !(conn->GetState() & adStateOpen) )
        {
            conn->ConnectionString = connStr.AllocSysString();
            conn->Open("", "", "", NULL);
            conn->CursorLocation = adUseClient;
        }   

        cmd->ActiveConnection = conn;
        cmd->CommandText = sql.AllocSysString();
        cmd->CommandType = adCmdText;

        prm = cmd->CreateParameter("@Param1", adLongVarChar, adParamInput, -1, vUser);
        cmd->Parameters->Append(prm);
        prm = cmd->CreateParameter("@Param2", adLongVarChar, adParamInput, -1, vDisp);
        cmd->Parameters->Append(prm);

        _variant_t recAff;

        cmd->Execute(&recAff, NULL, adExecuteNoRecords);

    }
    catch(_com_error &ex)
    {
        //ClearParameters();
        DStr err;
        err += PrintProviderError(conn);
        err += PrintComError(ex);
    }

    SysFreeString(vUser.bstrVal);
    SysFreeString(vDisp.bstrVal);
    SysFreeString(cmd->CommandText);
    SysFreeString(conn->ConnectionString);

}
4

3 に答える 3

3

ADO は、動的クエリで名前付きパラメーターを使用することを拒否します。名前付きパラメーターをパラメーター プレースホルダーに変換する必要があります。

DStr sql = "INSERT INTO [User] (UserName, DisplayName) VALUES (?, ?)";

または代わりにストアド プロシージャを使用します。プロシージャを作成します。

CREATE PROCEDURE spUserInsert
  @Param1 nvarchar(50), 
  @Param2 nvarchar(50) 
AS 
  SET NOCOUNT ON;
  INSERT INTO [User] (UserName, DisplayName) VALUES (@Param1, @Param2)
GO

それを呼び出すようにコードを変更します。

DStr sql = "spUserInsert";
...
cmd->CommandType = adCmdStoredProcedure;
于 2010-03-02T14:44:41.750 に答える
-1

adCmdText の代わりに adCmdStoredProc を使用してみましたか?

于 2009-03-20T15:51:25.247 に答える