これがコードです。
それについてのいくつかのメモ。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);
}