我被要求支持的3d party C ++应用程序首先检查存储过程是否存在,然后再调用任何存储过程:
CWSConnectionPtr spConn = DB::CreateConnection(bstrConnID);
_CommandPtr spCmd(__uuidof(Command));
spCmd->PutRefActiveConnection(spConn.GetPtr()); // resets connection
spCmd->PutCommandText(bstrQueryName);
spCmd->PutCommandType(adCmdStoredProc);
spCmd->GetParameters()->Refresh(); // generates SP call for params
if(spCmd->GetParameters()->GetCount() == 0)
{
LOG_ERROR((_T("Stored procedure not found: %s"), (LPCTSTR)bstrQueryName));
_THROW_ERROR(E_FAIL, IDS_MSG_SP_NOT_FOUND);
}
在SQL Server后端,每个存储过程调用转换为以下调用:
exec sp_procedure_params_rowset N'procName',1,N'dbo',NULL
ADO连接对象在连接字符串中使用provider=SQLOLEDB
。
在应用程序进一步投入填充参数值之前,有没有更快的方法来确保我们要调用的过程,有时候使用大型BLOB?