OTL 连接数据库,获取字段列表属性

获取表 字段列表

方法一:

 

OTL stream class 介绍

      otl_strean 类 具体的实现了OTL 流的概念。任何的SQL语句、SQL语句块和存储过程都能通过otl_stream进行处理。

     传统的数据库API处理SQL语句的时候,需要绑定变量与占位符。所以,开发者需要声明主数组在程序中So, the developer has to declare host arrays in the program,解析语句 parse the statement,调用绑定变量 变量绑定到占位符上、执行SQL、读取输出的变量等等. 之后就是如此的循环。所有的这些都是在otl_strean 类中自己执行。 tl_stream类提供了与数据库交互自动化最大性能。该性能仅取决于一个参数-缓冲区大小。缓冲区是用于存放SQL执行过程中的逻辑行数。

 

注:在timesten7.0.2或以上版本的数据库中,定义了OTL_TIMESTEN_UNIX或OTL_TIMESTEN_WINDOWS宏的时候,缓冲区大小可以设置为0。此时表示默认使用数据库的最佳缓冲区大小。一般情况下是一个元素大小。具体更多信息请参考数据库的手册。

一个SQL语句在otl_stream里面至少需要一个输入或输出占位符,对于没有占位符的SQL语句,它将被作为常量的SQL语句作为另一种方式执行。

从OTL4.0.115版本开始后,缓冲区大小的类型为整形,以前的版本全是短整形。如果需要支持旧版本的代码,请在编译代码前添加定义OTL_STREAM_LEGACY_BUFFER_SIZE_TYPE宏。

 

otl_column_desc * describe_select(int & desc_len)

取得流的输出变量的字段列表。

仅对下列有效:

  • straight SELECT statement (OCIx, ODBC, and DB2-CLI)
  • Referenced cursor (OCIx)
  • Result set returned via a stored procedure call (ODBC for MS SQL Server and Sybase, DB2-CLI for DB2)

函数返回otl_column_desc结构体的指针。otl_column_desc类型如下:

序号

成员变量

说明

1

char * name

字段名

2

int dbtype

该值依赖于特定的数据库。对于OCI或ODBC有不同的值,详细请参见数据库。

3

int otl_var_dbtype

OTL定义的字段类型编码

4

int dbsize

字段长度

5

int scale

数值类型的精度

6

int prec

数值类型的小数位

7

int nullok

指定字段是否为空

8

int charset_form

仅在定义了OTL_UNICODE和OTL_ORA9I/OTL_ORA10G宏时候有效。

1:单字节

2:双字节

3:其他

9

int char_size

仅在定义了OTL_UNICODE和OTL_ORA9I/OTL_ORA10G宏时候有效。

字段长度(按字母),在OTL_ORA8I情况下该值为0,因为相应的属性不被支持。

OTL定义了如下的类型与相应的数据库类型相对应:

序号

OTL类型常量

OTL类型编码

对应的数据库类型

1

otl_var_bigint

20

MS SQL SERVER/DB2/MYSQL/POSTGRESQL里面的bigint类型(singed 64 bit integer)

2

otl_var_blob

12

oracle8/9/10/11里面的blob类型

3

otl_var_char

1

NULL结尾的字符类型

4

otl_var_clob

11

oracle8/9/10/11里面的clob类型

5

otl_var_db2date

17

db2 date类型

6

otl_var_db2time

16

db2 time类型

7

otl_var_double

2

8字节长度的浮点型

8

otl_var_float

3

4字节长度的浮点型

9

otl_var_int

4

有符号的32位整形

10

otl_var_long_int

7

对于LLP64的C++编译器是32位有符号整形;对于LP-64编译器,则是64位有符号整形

11

otl_var_ltz_timestamp

19

对于ORACLE 9I/10G/11G,带有TIME ZONE的TIMESTAMP类型

12

otl_var_raw

23

RAW, BINARY, VARBINARY, BYTEA, VARCHAR BYTE, CHAR BYTE类型

13

otl_var_raw_long

10

ORACLE里面的LONG RAW;MS SQL SERVER/SYBASE里面的IMAGE;DB2里面的BLOB类型

14

otl_var_short

6

16位有符号整型

15

otl_var_timestamp

8

ORACLE的TIMESTAMP;

DB2的TIMESTAMP;

MS SQL的DATETIME/DATETIME2/TIME/DATE;

SYBASE的TIMESTAMP类型

16

otl_var_tz_timestamp

18

ORACLE下的带timezone的timestamp

17

otl_var_unsigned_int

5

无符号32位整型

18

otl_var_varchar_long

9

ORACLE里面的LONG;

MS SQL里面的TEXT;

DB2的CLOB类型

除了返回结构体的指针外,该函数还返回一个desc_len的参数。该参数表示返回的字段列表的长度。该函数返回的结构的指针不用用户删除,流里面在析构的时候会处理删除任务。

 

实现例子

		otl_stream streamData;
		streamData.open(1, strsql.c_str(), *pDB);

		int nlistlen = 1;
 
 		otl_column_desc* desc = NULL; 
		desc = streamData.describe_select(nlistlen);
		streamData.describe_select(nlistlen);
		cout<<"nlistlen = "<<nlistlen<<endl;

 		cout<<desc->name<<endl;
		cout<<(desc->name + 16)<<endl;
		cout<<(desc->name + 32)<<endl;
		cout<<(desc->name + 48)<<endl;

结果如下:

之前一直想用这个方法,这一个例子中每个列属性占16为,相邻的属性并不是用空格隔开的,而是乱码。最后回头在看这个函数数才发现每个字段属性是占16位。现在的问题是还没有找到确定每个字段所占大小。先记录下载以备后面研究。 最近才接触OTL,一切都是自己在摸索。

 

 

方法二:

otl_var_desc * describe_next_out_var()说明  来源于: http://blog.sina.com.cn/s/blog_79d599dc0100rkq7.html

otl_var_desc * describe_next_out_var()

取得下一步输出变量。“下一个”指的是从流中读取了以后,下一个读出来的输出变量。比如调用了otl_stream::operator<<()后,有时候我们想要知道下一步输出变量的类型。如果没有下一个变量的时候,函数返回0.

实例:

		otl_stream streamData;
		streamData.open(1, strsql.c_str(), *pDB);

		int nlistlen = 1;
		
 		otl_column_desc* desc = streamData.describe_select(nlistlen);
		streamData.describe_select(nlistlen);

		string strTemp = "";
		vector<string> vctAttribute;
		map<string, string> mapTemp;
		int nkey = 0;
		while( !streamData.eof() )
		{
			mapTemp.clear();
			nkey++;
			for(int i = 0; i < nlistlen; i++)
			{
				if(1 == nkey)
				{
					otl_var_desc* desck = streamData.describe_next_out_var();
					vctAttribute.push_back(desck->name);
				}

				strTemp = "";
				streamData>>strTemp;
				mapTemp.insert(pair<string, string>(vctAttribute[i], strTemp));
				int nkk = 0;
	
				
			}
			vctData.push_back(mapTemp);
		}

		streamData.close();


结果:

实例代码是自己写的实现别的功能,其中需要读取字段属性。

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值