_ConnectionPtr pConn;
pConn.CreateInstance(_T("ADODB.Connection"));
_CommandPtr pCmd;
pCmd.CreateInstance(_T("ADODB.Command"));
_ParameterPtr pParam;
pParam.CreateInstance(_T("ADODB.Parameter")); if(FAILED(pConn->Open(_bstr_t("......"),_T(""),_T(""),adConnectUnspecified)))
return FALSE; pCmd->ActiveConnection = pConn; pCmd->CommandText = _T("UPDATE WL_Bill SET nModifyNum = 4 WHERE ID = @id");
pCmd->CommandType = adCmdText;
_variant_t vValue;
long nBillID = 1400000;
vValue.vt=VT_I4;
vValue.lVal = nBillID;
pParam = pCmd->CreateParameter(_T("@id"),adInteger, adParamInput,sizeof(long));
pParam->Value = vValue;
pCmd->Parameters->Append(pParam);
try
{
pCmd->Execute(NULL,NULL,adCmdText);
}
catch(_com_error &e)
{
pConn->Close();
pConn->Release();
TRACE("出现错误:%s",e.ErrorMessage());
}
pConn->Close();
pConn->Release();为什么执行到try里面会出错?
解决方案 »
- Windows中消息的先后
- socket如何实现服务器端手动发信息给客户端??
- 关于VC操作PowerPoint的一个问题
- 帮忙看看这段代码错在哪里!
- 求vc++技术内幕 中文版 下载
- 谁做过像<东方影都>和<windows Media player>或是金山中那种多形状的窗体的例子,求此列子
- 问二个小问题
- 在线等:奇简单的怪问题
- 看来大家还不困哪,那就再请教一个问题:如何取得ListCtrl中选中项中某一子项的内容(不是第一项,如第三项)?
- 在安装MSDN后,如何在VFP、VC中通过在线帮助中直接调用MSDN
- 关于directshow flv文件的解码器在哪里可以下载到?
- 教师节,祝老师节日快乐!
Execute返回这个东西
DB_E_ERRORSINCOMMAND
pCmd->CommandText = _T("UPDATE WL_Bill SET nModifyNum = 4 WHERE ID = ?");
pCmd->CommandType = adCmdText;
_variant_t vValue;
long nBillID = 1400000;
vValue.vt=VT_I4;
vValue.lVal = nBillID;
pParam = pCmd->CreateParameter(_T("ID"),adInteger, adParamInput,sizeof(long));
pParam->Value = vValue;
pCmd->Parameters->Append(pParam);
试试这个?
错误依旧。
执行SQl 语句不能这么写!
return FALSE;
不是连接的问题。我判断过。
我把带参的SQL换成普通的SQL语句就没问题了。
///////////////////////////////////////////////
// PrintProviderError Function //
///////////////////////////////////////////////void PrintProviderError(_ConnectionPtr pConnection)
{
// Print Provider Errors from Connection object.
// pErr is a record object in the Connection's Error collection.
ErrorPtr pErr = NULL; if( (pConnection->Errors->Count) > 0)
{
long nCount = pConnection->Errors->Count;
// Collection ranges from 0 to nCount -1.
for(long i = 0; i < nCount; i++)
{
pErr = pConnection->Errors->GetItem(i);
TRACE(_T("\tError number: %x\t%s"), pErr->Number,
(LPCTSTR)pErr->Description);
}
}
}//////////////////////////////////////
// PrintComError Function //
//////////////////////////////////////void PrintComError(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description()); // Print Com errors.
TRACE(_T("Error\n"));
TRACE(_T("\tCode = %08lx\n"), e.Error());
TRACE(_T("\tErrorMessage = %s\n"), (LPCTSTR)e.ErrorMessage());
TRACE(_T("\tSource = %s\n"), (LPCTSTR) bstrSource);
TRACE(_T("\tDescription = %s\n"), (LPCTSTR) bstrDescription);
}///////////////////////////////////////////////
// ExecuteSQL Function //
///////////////////////////////////////////////
void ExecuteSQL()
{
CoInitialize(NULL);
HRESULT hr = S_OK; // Define string variables.
_bstr_t strCnn("Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=Participants;Data Source=(local)"); // Define ADO object pointers.
// Initialize pointers on define.
_ConnectionPtr pConnection = NULL;
_CommandPtr pCmd = NULL;
_RecordsetPtr pRst = NULL;
_ParameterPtr pParam = NULL; try
{
// Open connection.
pConnection.CreateInstance(__uuidof(Connection));
pConnection->Open (strCnn, "", "", adConnectUnspecified); // Please note that question , a question represents a parameter
_bstr_t strSQL("update p1 set phonenumber='3344' where id=?;"); // Create command object.
pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = pConnection;
pCmd->CommandText = strSQL;
pCmd->CommandType = adCmdText; // Append some parameters
// According to statements to maintain the order and type parameters.
// In this case, the parameter names can be customized.
pCmd->Parameters->Append(pCmd->CreateParameter(_T("@id"),adVarChar, adParamInput,(long)10, _T("ID002"))); _variant_t vRecordAffected;
vRecordAffected.vt = VT_I4;
vRecordAffected.lVal = 0L; pCmd->Execute(vRecordAffected.GetAddress(),NULL,adCmdText);
TRACE(_T("nRecordAffected=%d\r\n"), vRecordAffected.lVal); // Clean up objects before exit.
pCmd.Release(); if (pRst)
{
if (pRst->State == adStateOpen)
pRst->Close();
pRst.Release();
} if (pConnection)
{
if (pConnection->State == adStateOpen)
pConnection->Close();
pConnection.Release();
}
}
catch (_com_error &e)
{
PrintProviderError(pConnection);
PrintComError(e);
}
::CoUninitialize();
}
notes: 说明几点,在执行批SQL语句和单语句,传递参数使用问号,一个问号一个参数,在append时,要注意参数的类型和顺序,因为没有具体的参数名对应。为了可读性,才在append的时候传递参数名称。顺便提一下。楼主在答复问题时,能够尽可能的提供更多的调试过程和debug信息,这样更有助于得到解决和更积极的回复。这里只是个建议。上述代码在VS2008+SQL2005.中调试通过,部分代码参考ADO手册。
谢谢这位朋友的解答,问题解决了,而且你下面的话也很有用,受教了,结贴!
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"