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 回答
0

也许cmd->CreateParameter(_bstr_t("Param1"), ...)

“@”是 SQL Server 特定的运算符,它可能会惹恼你。

于 2009-03-17T21:05:07.800 回答
-1

您是否尝试使用 adCmdStoredProc 而不是 adCmdText?

于 2009-03-20T15:51:25.247 回答