使用vc6+ado
有如下问题:
1.怎么调用db2存储过程?
2.怎么用绑定变量做数据插入?就是写一个insert into test values(?),然后利用绑定变量(CreateParameters)填入需要插入的值?
3.怎么解决一个大文本字符串插入过长的问题,当超过了sql语句的限制长度,导致插入会失败,如果是一个大文本,需要将其中的内容存入clob字段中?怎么才能正确插入,另外db2也有插入字串长度的限制,这些能否有参数可以调整?
4.如果如上情况插入限制这么大,那么插入图片视频这些更大的blob型,将如何处理?
希望知道的朋友能给个指导!欢迎大家讨论

解决方案 »

  1.   

    http://www-128.ibm.com/developerworks/cn/views/db2/tutorials.jsp?cv_doc_id=85239
      

  2.   

    谢谢回复
    我用的是ado,不是ado.net
      

  3.   

    转载别人写的:
    ------------------------------------
    ------------------------------------
    1 进行ADO编程的必备步骤:引入msado15.dll #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")//避免与文件的结束符号混淆,将EOF改为adoEOF 当然要记得在所有#include之后加入啊
    2 也是必备的:初始化Com库 ::CoInitialize(NULL);///初始化COM库3 建立数据库连接 _ConnectionPtr m_pConnection;//连接数据库的Com智能指针,可以自动Release ^_^
     m_pConnection.CreateInstance("ADODB.Connection");//建立实例返回HRESULT 所以最好if一下看看成功否4 连接数据库 m_pConnection->Open("Driver={SQL Server};Server=localhost;Database=Northwind;UID=sa;PWD=wxy","","",adModeUnknown);
     
     最好用Try的,可以捕获错误啊,例如 try
     {
     m_pConnection->Open("Driver={SQL Server};Server=localhost;Database=Northwind;UID=sa;PWD=wxy","","",adModeUnknown);  .........//其他数据库操作
     }
     catch(_com_error e)
     {
      //处理错误吧
     }5 创建执行存储过程的命令对象 _CommandPtr m_pCommand;//还是智能指针
     m_pCommand.CreateInstance("ADODB.Command");//实例
     m_pCommand->ActiveConnection = m_pConnection;//设置连接,别忘了啊
     m_pCommand->CommandText = "Test";//存储过程为Test 假设我的存储过程如下:
      CREATE PROCEDURE Test 
      @id int,
      @Name varchar(20),
      @sdate datetime,
      @ret char(1) output
       AS
      insert into VCStorproc values(@id,@Name,@sdate)
      if @@error=0
       set @ret=1
      else
       set @ret=0
      go  6 建立传入存储过程的参数 存储过程Test中输入参数id,name,sdate 输出参数ret  记住他们的类型和大小啊 下面就来创建4个参数 VC中用_ParameterPtr智能指针来建立参数,具体如下: _ParameterPtr m_pParam;
     m_pParam.CreateInstance("ADODB.Parameter"); _ParameterPtr m_pParam1;//附加数字的命名习惯不好别学我啊
     m_pParam1.CreateInstance("ADODB.Parameter"); _ParameterPtr m_pParam2;
     m_pParam2.CreateInstance("ADODB.Parameter");  _ParameterPtr m_pParamRet;
     m_pParamRet.CreateInstance("ADODB.Parameter"); 别高兴还没有真正的建立好参数 m_pParam = m_pCommand->CreateParameter("id",adInteger,adParamInput,-1,(_variant_t)"10");//给参数设置各属性
     m_pCommand->Parameters->Append(m_pParam);//加入到Command对象的参数集属性中 m_pParam1 = m_pCommand->CreateParameter("Name",adVarChar,adParamInput,20,(_variant_t)"songwenfeng");
     m_pCommand->Parameters->Append(m_pParam1); m_pParam2 = m_pCommand->CreateParameter("sdate",adVarChar,adParamInput,32,(_variant_t)"2004-6-8");
     m_pCommand->Parameters->Append(m_pParam2);
     
     //**************
      这里有个问题:就是DateTime数据类型要用adVarChar来传递,由于我们的时间格式为XXXX-XX-XX XX:XX:XX所以32位足够了,有时我们会用adDate或adDBDate类型来传递DateTime,这就是导致error #3015的原因之一,当然用它来传递应该是可以的,但是小弟至今没有成功过,哪位大虾知道告诉小弟一声啊
    *******//
     m_pParamRet=m_pCommand->CreateParameter("ret",adChar,adParamOutput,1);
     m_pCommand->Parameters->Append(m_pParamRet);
     大功告成,执行吧 m_pCommand->Execute(NULL,NULL,adCmdStoredProc); 
     //***
     第一个参数是被影响的记录数是一个VARIANT的指针变量,需要的话设个变量取过来就是了 但是MSDN说
     The RecordsAffected parameter applies only for action queries or stored procedures. RecordsAffected does not return the number of records returned by a result-returning query or stored procedure. To return this information, use the RecordCount property。就是说有返回值的存储过程是不会返回影响的记录数的,要使用RecordCount属性 第二个参数是指向Parameters的VARIANT指针,是可选的,既然设置好了参数指针就把它设为NULL吧。MSDN说
    A Variant array of parameter values passed with an SQL statement. (Output parameters will not return correct values when passed in this argument.)用这个参数的话输出参数将不会返回正确的值。微软是不是挺有意思
    *************//
     数据库里已经有了一条新记录了,看看 id name  sdate
     10 songwenfeng 2004-6-87 最后一步,关闭连接,释放Com,走人!! m_pConnection->Close();
     CoUninitialize();
      

  4.   

    你写的是sql server的存储过程的调用,sql server我调用没问题的
    我问的是db2的