批处理时怎样得到结果集中多行内容?急急! 我原来的处理方式是:一条消息过来执行一次数据库速度较慢,现在想进行批处理;一次执行多条消息:也就是将执行用户存储过程消息中的字段:但不知怎么解析处理得到的结果集,,然后给每条消息返回相应的应答。在MSDN中说:批处理是重复着dbrpcinit,dbrpcparam()俩函数后执行并返回结果集,现在的疑问是我如何解析结果集到相应的返回参数中。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 部分代码:(原来对结果集的处理是这样)只能处理一条结果 ret = dbrpcexec(m_pProc); if (SUCCEED != ret) { delete pMsgAck; DoExecuteUserProcAck(pMsg, E_SQLSERVER_EXECUTE_FAIL); // Im00810004 = {0x0081, 0x00810004, "DBLIB OBJECT StoreProcedure execute fail. // DBSOURCE %s, StoreProcedure %s.\n"}; CString Info; Info.Format(Im00810004.szDescTemplate, m_pDBSource->GetDbAlias(), ProcedureName); Information(Im00810004.wCategory, Im00810004.dwEventID, Info.GetLength(), 0, (LPCTSTR)Info, NULL); OnError(); return; } ret = dbsqlok(m_pProc); if (SUCCEED != ret) { delete pMsgAck; DoExecuteUserProcAck(pMsg, E_SQLSERVER_SQLOK_FAIL); // Im00810005 = {0x0081, 0x00810005, "DBLIB OBJECT StoreProcedure sqlok fail. // DBSOURCE %s, StoreProcedure %s\n"}; CString Info; Info.Format(Im00810005.szDescTemplate, m_pDBSource->GetDbAlias(), ProcedureName); Information(Im00810005.wCategory, Im00810005.dwEventID, Info.GetLength(), 0, (LPCTSTR)Info, NULL); OnError(); return; } while(1) { ret = dbresults(m_pProc); if (FAIL == ret) { delete pMsgAck; DoExecuteUserProcAck(pMsg, E_SQLSERVER_RESULT_FAIL); // Im00810006 = {0x0081, 0x00810006, "DBLIB OBJECT StoreProcedure result fail. // DBSOURCE %s, StoreProcedure %s.\n"}; CString Info; Info.Format(Im00810006.szDescTemplate, m_pDBSource->GetDbAlias(), ProcedureName); Information(Im00810006.wCategory, Im00810006.dwEventID, Info.GetLength(), 0, (LPCTSTR)Info, NULL); OnError(); return; } if (NO_MORE_RESULTS == ret) break; if (SUCCEED == ret) { // Even if dbrows returns FAIL, you must still process the results // by calling dbnextrow until it returns NO_MORE_ROWS. dbrows(m_pProc); while (1) { ret = dbnextrow(m_pProc); if ((NO_MORE_ROWS == ret) || (FAIL == ret)) break; } } } //pValue = (char*)pParams + pMsg->ParamNum * sizeof(PARAM_STRUCT); pRetValue = (char*)pRetParams + iMsgAckRetParamNum * sizeof(PARAM_STRUCT); int iColNo = 1; iMsgAckDataSize = 0; memcpy(pMsgAck, pMsg, sizeof(MSG_DBPROXY_EXECUTE_USER_PROC_ACK)); pMsgAck->lCommandID = DBPROXY_EXECUTE_USER_PROC_ACK; pMsgAck->lCommandStatus = E_SUCCESS; if (dbhasretstat(m_pProc)) { pMsgAck->ParamNum = iMsgAckRetParamNum; for (int i = 0; i < iMsgAckRetParamNum; i++) { switch(pRetParams[i].DataType) { case D_CHAR: case D_VARCHAR: { memset(pRetValue, 0, pRetParams[i].MaxLen); int iRetLen = dbretlen(m_pProc, iColNo); if (iRetLen < 0) // iColNo 非法 { pRetParams[i].DataLen = 0; break; } if (iRetLen > pRetParams[i].MaxLen-1) iRetLen = pRetParams[i].MaxLen-1; strncpy(pRetValue, (const char*)dbretdata(m_pProc, iColNo), iRetLen); CutBlank(pRetValue); pRetParams[i].DataLen = strlen(pRetValue) + 1; // 包括NULL字符 break; } case D_TEXT: { memset(pRetValue, 0, pRetParams[i].MaxLen); int iRetLen = dbretlen(m_pProc, iColNo); if (iRetLen < 0) // iColNo 非法 { pRetParams[i].DataLen = 0; break; } if (iRetLen > pRetParams[i].MaxLen-1) iRetLen = pRetParams[i].MaxLen-1; strncpy(pRetValue, (const char*)dbretdata(m_pProc, iColNo), iRetLen); pRetParams[i].DataLen = strlen(pRetValue) + 1; // 包括NULL字符 break; } case D_DATETIME: memset(pRetValue, 0, pRetParams[i].MaxLen); if (dbretlen(m_pProc, iColNo) > 0) { memcpy(pRetValue, dbretdata(m_pProc, iColNo), dbretlen(m_pProc, iColNo)); mktotime(m_pProc, pRetValue, NULL, pRetValue); pRetParams[i].DataLen = pRetParams[i].MaxLen; } else pRetParams[i].DataLen = 0; break; case D_BINARY: case D_VARBINARY: { int itmpRetLen = dbretlen(m_pProc, iColNo); if ( itmpRetLen > 0) { memcpy(pRetValue, dbretdata(m_pProc, iColNo), itmpRetLen); pRetParams[i].DataLen = itmpRetLen; } else pRetParams[i].DataLen = 0; } break; default: if (dbretlen(m_pProc, iColNo) > 0) { memcpy(pRetValue, dbretdata(m_pProc, iColNo), dbretlen(m_pProc, iColNo)); pRetParams[i].DataLen = pRetParams[i].MaxLen; } else pRetParams[i].DataLen = 0; } pRetValue += pRetParams[i].DataLen; iMsgAckDataSize += pRetParams[i].DataLen; iColNo++; } } else { pMsgAck->ParamNum = 0; } pMsgAck->lMessageLength = sizeof(MSG_DBPROXY_EXECUTE_USER_PROC_ACK) + pMsgAck->ParamNum * sizeof(PARAM_STRUCT) + iMsgAckDataSize; theApp.SendMessageToApplication((HANDLE)pMsgAck->lSenderHandle, pMsgAck->SendTaskID, pMsgAck, pMsgAck->lMessageLength); dbcancel(m_pProc); 大牛帮忙看看,没思路啊(2) 求一条查询多个类别的语句 如何在查询范围内去除某条件 在视图的定义语句里面能否实现类似存储过程的过程性语句 耗时的存储过程 用Microsoft.Jet.OLEDB.4.0驱动delete一个文本时出错 唉,很着急。Update操作未加where语句 sql中如何加记录 复制与分发中出现失败快速处理 isnull(ExaminationDate1,convert(varchar(10),'0001-01-01' ,120))也报错,咋办? 有人实现了SQL Server的通知服务吗? 如何用变量建表?? SOS (在线等很急)
ret = dbrpcexec(m_pProc); if (SUCCEED != ret)
{
delete pMsgAck; DoExecuteUserProcAck(pMsg, E_SQLSERVER_EXECUTE_FAIL);
// Im00810004 = {0x0081, 0x00810004, "DBLIB OBJECT StoreProcedure execute fail.
// DBSOURCE %s, StoreProcedure %s.\n"};
CString Info;
Info.Format(Im00810004.szDescTemplate, m_pDBSource->GetDbAlias(), ProcedureName);
Information(Im00810004.wCategory, Im00810004.dwEventID, Info.GetLength(), 0,
(LPCTSTR)Info, NULL); OnError();
return;
} ret = dbsqlok(m_pProc); if (SUCCEED != ret)
{
delete pMsgAck; DoExecuteUserProcAck(pMsg, E_SQLSERVER_SQLOK_FAIL);
// Im00810005 = {0x0081, 0x00810005, "DBLIB OBJECT StoreProcedure sqlok fail.
// DBSOURCE %s, StoreProcedure %s\n"};
CString Info;
Info.Format(Im00810005.szDescTemplate, m_pDBSource->GetDbAlias(), ProcedureName);
Information(Im00810005.wCategory, Im00810005.dwEventID, Info.GetLength(), 0,
(LPCTSTR)Info, NULL); OnError();
return;
} while(1)
{
ret = dbresults(m_pProc); if (FAIL == ret)
{
delete pMsgAck;
DoExecuteUserProcAck(pMsg, E_SQLSERVER_RESULT_FAIL);
// Im00810006 = {0x0081, 0x00810006, "DBLIB OBJECT StoreProcedure result fail.
// DBSOURCE %s, StoreProcedure %s.\n"};
CString Info;
Info.Format(Im00810006.szDescTemplate, m_pDBSource->GetDbAlias(), ProcedureName);
Information(Im00810006.wCategory, Im00810006.dwEventID, Info.GetLength(), 0,
(LPCTSTR)Info, NULL); OnError();
return;
} if (NO_MORE_RESULTS == ret)
break;
if (SUCCEED == ret)
{
// Even if dbrows returns FAIL, you must still process the results
// by calling dbnextrow until it returns NO_MORE_ROWS.
dbrows(m_pProc);
while (1)
{
ret = dbnextrow(m_pProc);
if ((NO_MORE_ROWS == ret) || (FAIL == ret))
break;
}
}
} //pValue = (char*)pParams + pMsg->ParamNum * sizeof(PARAM_STRUCT);
pRetValue = (char*)pRetParams + iMsgAckRetParamNum * sizeof(PARAM_STRUCT);
int iColNo = 1;
iMsgAckDataSize = 0; memcpy(pMsgAck, pMsg, sizeof(MSG_DBPROXY_EXECUTE_USER_PROC_ACK));
pMsgAck->lCommandID = DBPROXY_EXECUTE_USER_PROC_ACK;
pMsgAck->lCommandStatus = E_SUCCESS; if (dbhasretstat(m_pProc))
{
pMsgAck->ParamNum = iMsgAckRetParamNum; for (int i = 0; i < iMsgAckRetParamNum; i++)
{
switch(pRetParams[i].DataType)
{
case D_CHAR:
case D_VARCHAR:
{
memset(pRetValue, 0, pRetParams[i].MaxLen);
int iRetLen = dbretlen(m_pProc, iColNo);
if (iRetLen < 0) // iColNo 非法
{
pRetParams[i].DataLen = 0;
break;
}
if (iRetLen > pRetParams[i].MaxLen-1)
iRetLen = pRetParams[i].MaxLen-1; strncpy(pRetValue, (const char*)dbretdata(m_pProc, iColNo), iRetLen);
CutBlank(pRetValue); pRetParams[i].DataLen = strlen(pRetValue) + 1; // 包括NULL字符
break;
} case D_TEXT:
{
memset(pRetValue, 0, pRetParams[i].MaxLen);
int iRetLen = dbretlen(m_pProc, iColNo);
if (iRetLen < 0) // iColNo 非法
{
pRetParams[i].DataLen = 0;
break;
}
if (iRetLen > pRetParams[i].MaxLen-1)
iRetLen = pRetParams[i].MaxLen-1; strncpy(pRetValue, (const char*)dbretdata(m_pProc, iColNo), iRetLen);
pRetParams[i].DataLen = strlen(pRetValue) + 1; // 包括NULL字符 break;
} case D_DATETIME:
memset(pRetValue, 0, pRetParams[i].MaxLen);
if (dbretlen(m_pProc, iColNo) > 0)
{
memcpy(pRetValue, dbretdata(m_pProc, iColNo), dbretlen(m_pProc, iColNo));
mktotime(m_pProc, pRetValue, NULL, pRetValue);
pRetParams[i].DataLen = pRetParams[i].MaxLen;
}
else
pRetParams[i].DataLen = 0;
break; case D_BINARY:
case D_VARBINARY:
{
int itmpRetLen = dbretlen(m_pProc, iColNo);
if ( itmpRetLen > 0)
{
memcpy(pRetValue, dbretdata(m_pProc, iColNo), itmpRetLen);
pRetParams[i].DataLen = itmpRetLen;
}
else
pRetParams[i].DataLen = 0;
}
break; default:
if (dbretlen(m_pProc, iColNo) > 0)
{
memcpy(pRetValue, dbretdata(m_pProc, iColNo), dbretlen(m_pProc, iColNo));
pRetParams[i].DataLen = pRetParams[i].MaxLen;
}
else
pRetParams[i].DataLen = 0;
} pRetValue += pRetParams[i].DataLen;
iMsgAckDataSize += pRetParams[i].DataLen; iColNo++;
}
}
else
{
pMsgAck->ParamNum = 0;
}
pMsgAck->lMessageLength = sizeof(MSG_DBPROXY_EXECUTE_USER_PROC_ACK) +
pMsgAck->ParamNum * sizeof(PARAM_STRUCT) + iMsgAckDataSize; theApp.SendMessageToApplication((HANDLE)pMsgAck->lSenderHandle, pMsgAck->SendTaskID, pMsgAck,
pMsgAck->lMessageLength); dbcancel(m_pProc);