问题描述:
我需要做一个数据入库的程序,别人给我发字符串逗号分隔,表示数据库列值,第一个为数据库表的id,我把数据插入数据库。为什么说全动态的呢?是我不想把sql语句写到程序里面,这样在数据库有调整增加,字段,减少的程序都不用改数据库了。但是这样程序就不知道数据库的信息了,就需要通过oledb来获取数据库信息。我的做法:
我做了一个配置文件,里面配置了sql语句,但参数的,如:insert into table1 (field1,field2) values(?,?),然后配置了字符串和列的对应关系。根据这些来入库。程序描述:
我是实用vc oledb template来做的。
1、读取配置文件。
2、打开数据库
3、创建session
4、创建command,是用CDynamicParameterAccessor。
   command::Prepare,
   command::BindParameters 绑定参数
   command::GetParamCount  获取参数个数信息
   command::GetParamType   获取每一个参数类型
   然后根据参数个数和类型信息,给参数赋值。
5、command::open()执行插入。问题:
以上做法遇到两个问题:
1、在使用odbc数据源时,BindParameters的时候,通过ICommandWithParameters::GetParameterInfo获取参数信息的时候dwFlags中没有指明是DBPARAMFLAGS_ISINPUT,这样绑定信息里面eParamIO就是0了,见:atldbcli.h 5133行,5156行。这样在去调用IAccessor::CreateAccessor,传进去的dwAccessorFlags就是DBACCESSOR_ROWDATA,而不是BACCESSOR_PARAMETERDATA,见:1122, 1130行,在执行sql就出错了,报accessor类型不对。2、在使用oracle的时候,Provider=OraOLEDB.Oracle,调用ICommandWithParameters::GetParameterInfo就直接出错了,报DB_E_PARAMUNAVAILABLE,是不是oracle不支持查询参数信息呢?不知道是不是我什么地方写错了,以上方式只是是用sqlserver,Provider=SQLOLEDB.1;initial catalog=xxx测试没问题,如果以上两个问题确实如此,那么获取参数信息的方法岂不是用处就很有限了吗?
我对oledb不是很熟,希望熟悉的人给解答一下非常感谢。