Exec-6ren">
gpt4 book ai didi

c++ - 在 C++ 中使用 ADO 执行参数化查询时,为什么我不断收到 "Must declare the Scalar variable "@Param 1""?

转载 作者:行者123 更新时间:2023-11-30 04:40:55 24 4
gpt4 key购买 nike

这是代码。
关于它的一些注意事项。 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);

}

最佳答案

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;

关于c++ - 在 C++ 中使用 ADO 执行参数化查询时,为什么我不断收到 "Must declare the Scalar variable "@Param 1""?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/655957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com