==================================声明==================================

本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。

未经作者同意请勿修改(包括本声明),保留法律追究的权利。

未经作者同意请勿用于出版、印刷或学术引用。

本文不定期修正完善,为保证内容正确,建议移步原文处阅读。

本文链接:http://www.cnblogs.com/wlsandwho/p/4370912.html

=======================================================================

 之前一直是有几个参数就创建一个_ParameterPtr对象

 1         TESTHR(pParam1.CreateInstance(TEXT("ADODB.Parameter")));
 2 
 3         pParam1=pCmd->CreateParameter(TEXT(""),adInteger,adParamInput,sizeof(int));
 4         pParam1->Value=_variant_t(nNo);
 5         pCmd->Parameters->Append(pParam1);
 6 
 7         TESTHR(pParam2.CreateInstance(TEXT("ADODB.Parameter")));
 8 
 9         pParam2=pCmd->CreateParameter(TEXT(""),adInteger,adParamInput,sizeof(int));
10         pParam2->Value=_variant_t(nId);
11         pCmd->Parameters->Append(pParam2);
12 
13         TESTHR(pRecordset.CreateInstance(TEXT("ADODB.Recordset")));
14 
15         pRecordset=pCmd->Execute(NULL,NULL,adCmdText);

现在想来试了一下,重复利用同一个也是可以的。

 1         TESTHR(pParam1.CreateInstance(TEXT("ADODB.Parameter")));
 2 
 3         pParam1=pCmd->CreateParameter(TEXT(""),adInteger,adParamInput,sizeof(int));
 4         pParam1->Value=_variant_t(nNo);
 5         pCmd->Parameters->Append(pParam1);
 6 
 7         pParam1=pCmd->CreateParameter(TEXT(""),adInteger,adParamInput,sizeof(int));
 8         pParam1->Value=_variant_t(nId);
 9         pCmd->Parameters->Append(pParam1);
10 
11         TESTHR(pRecordset.CreateInstance(TEXT("ADODB.Recordset")));
12 
13         pRecordset=pCmd->Execute(NULL,NULL,adCmdText);

但仔细观察,就会发现,有的代码是直接在Append里面使用CreateParameter函数:

1         TESTHR(pParam1.CreateInstance(TEXT("ADODB.Parameter")));
2 
3         pCmd->Parameters->Append(pCmd->CreateParameter(TEXT(""),adInteger,adParamInput,sizeof(int),_variant_t(nNo)));
4         pCmd->Parameters->Append(pCmd->CreateParameter(TEXT(""),adInteger,adParamInput,sizeof(int),_variant_t(nId)));
5 
6         TESTHR(pRecordset.CreateInstance(TEXT("ADODB.Recordset")));
7 
8         pRecordset=pCmd->Execute(NULL,NULL,adCmdText);

考虑到COM的原理(继承和虚函数表之类的讲不了,自行参阅《COM技术内幕》),这样也是可行的

 1         IDispatchPtr pDispObj;
 2         pDispObj=pCmd->CreateParameter(TEXT(""),adInteger,adParamInput,sizeof(int),_variant_t(nNo));
 3         pCmd->Parameters->Append(pDispObj);
 4 
 5         pDispObj=pCmd->CreateParameter(TEXT(""),adInteger,adParamInput,sizeof(int),_variant_t(nId));
 6         pCmd->Parameters->Append(pDispObj);
 7 
 8         TESTHR(pRecordset.CreateInstance(TEXT("ADODB.Recordset")));
 9 
10         pRecordset=pCmd->Execute(NULL,NULL,adCmdText);

 =======================================================================

如此,便不用为十几个参数的存储过程忧心了。个人感觉还是下面的好。

pCmd->Parameters->Append(pCmd->CreateParameter(TEXT("参数名"),adInteger,adParamInput,sizeof(int),_variant_t(nId)));

 

 

================================随便说点什么===============================

把所学所用记录下来,积累从点滴做起。

“千里之堤,溃于蚁穴”的道理我还是懂的。