一 、_variant_t和_bstr_t
这两个类分别封装并管理VARIANT和BSTR这两种数据类型
(1)VARIANT和BSTR这两种类型是COM中使用的数据类型。
(2)为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。
(3)通过_variant_t和_bstr_t这两个类,就可以方便的把C++类型变量转换成COM中的变量了。
二、ADO异常捕获—— Error对象
(1)Error对象包含了ADO数据操作时发生错误的详细描述
ADO的任何对象都可以产生一个或者多个数据提供者错误,当错误发生时,这些错误对象被添加到Connection对象的Errors集合里。
当另外一个ADO对象产生一个错误时,Errors集合里的Error对象会被清除,新的Error对象将被添加到Errors集合里。
注意:每个 Error 对象都代表特定的提供者错误而不是 ADO 错误,ADO 错误被记载到运行时的例外处理机制中。
(2)通过 Error 对象的属性可获得每个错误的详细信息,其中包括以下内容:
- Description 属性,包含错误的文本。
- Number 属性,包含错误常量的长整型整数值。
- Source 属性,标识产生错误的对象。在向数据源发出请求之后,如果 Errors 集合中有多个 Error 对象,则将会用到该属性。
- SQLState 和 NativeError 属性,提供来自 SQL 数据源的信息
三、取得一个字段的值的方法
(1)表示取得第0个字段的值
pRecordset->get_Collect(long(index)); 或者 m_pRecordset->GetCollect(_variant_t(long(0));
(2)直接使用列名获取该字段的值
pRecordset->get_Collect("COLUMN_NAME"); 或者 m_pRecordset->GetCollect("Name");
四、错误发现
(1)ADO "IDispatch error #3092" 错误解决:
在采用ADO访问ORACLE数据库的时候,出现IDispatch error #3092错误的原因之一是在SQL语句中使用了保留关键字。比如表的名称位user就会出现这种错误。
比如:CString judge = "select ID,POSITION,TEMPERATURE fromTEMPCONSTANTINFO" 就有可能报错,把ID关键字用单括号括起来就没问题了。即改成select [ID],POSITION,TEMPERATURE from TEMPCONSTANTINFO"。一般来说,SQL 语句中的字符串常量需要用’单引号’括起来。
另一种原因就是写的SQL语句有语法错误。需要检查是否有拼写错误,或者其他错误。
(2)ADO "IDispatch error #3159" 错误
解决:
出现这样的错误,意思是:要插入的内容长度超过了我定义的字段长度,应该修改字段定义的长度。然后我对数据库表进行了检查,果然,由于采集到的数据中有个别值特别大的double型数据,它的double类型有时会超过我在数据库中所设定的NUMBER(7,4),超过这个就无法正常的插入了。
然后我改成了NUMBER(16,8),这样就再也不会出现这种错误了。