|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
mysql使用内部操作字符集gbk来进行操作,即执行"SELECT*FROMtestWHEREname=xxxor1=1/*LIMIT1";从而注入成功ado|存储历程|心得
在一个项目中,我必要用到存储历程来会见数据,为了供应一个对照分歧的接口以便挪用,我没有利用CreateParameter(),而是挪用CommandPtr的Refresh()函数先从数据库中查询参数.
_ConnectionPtrm_pConn;
m_pConn.CreateInstance(__uuidof(Connection));
m_pConn->Open("driver={SQLServer};server=127.0.0.1;DATABASE=pub;UID=sa;PWD=","","",0);
_CommandPtrm_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
_RecordsetPtrm_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pCommand->ActiveConnection=m_pConn;
m_pCommand->CommandText="SP_XX";//存储历程名
m_pCommand->PutCommandType(adCmdStoredProc);
m_pCommand->Parameters->Refresh();//从数据库查询参数信息
接上去就能够对每个参数赋值了:
longcnt=m_pCommand->Parameters->GetCount();//获得参数的个数
for(longk=1;k<cnt;k++)
{//因为ADO中以为前往值是第一个参数,因而这里用k=1滤失落第一个参数
m_pCommand->Parameters->GetItem(k)->Value=XXX;//按存储历程的参数按次给参数赋值
}
如今能够实行这个存储历程了
m_pRecordset=m_pCommand->Execute(0,0,adCmdStoredProc);
这个时分,假如接上去用
_variant_tret_val=m_pCommand->Parameters->GetItem((long)0)->Value;
那末将得不到值
而假如像上面如许挪用的话就能够失掉前往值了
m_pRecordset->Close();
_variant_toutput_para=m_pCommand->Parameters->GetItem((long)0)->Value;
MSADO.net给这一征象的复兴是:
Youcanthinkofastoredprocedureasafunctioninyourcode.Thefunctiondoesn’treturnavalueuntilithasexecutedallofitscode.Ifthestoredprocedurereturnsresultsandyouhaven’tfinishedprocessingtheseresults,thestoredprocedurehasn’treallyfinishedexecuting.Untilyou’veclosedtheDataReader,thereturnandoutputparametersofyourCommandwon’tcontainthevaluesreturnedbyyourstoredprocedure.
也就是说Execute()函数应当当作是直到m_pRecordset关失落今后才会准确前往.
关于输入参数的处置也和这一样,由于前往值自己就是当做输入参数来处置的.
经由过程这类办法,我们能够失掉一个存储历程的前往值和了局集,并且关于一切的存储历程都能够一样利用,不用为某个特定的存储历程往写代码,具有必定的通用性.
对于insert和delete,event中包含了插入/删除的记录的所有字段的值(太爽了。。) |
|