获取表 字段列表
方法一:
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) | 取得流的输出变量的字段列表。 仅对下列有效:
函数返回otl_column_desc结构体的指针。otl_column_desc类型如下:
OTL定义了如下的类型与相应的数据库类型相对应:
除了返回结构体的指针外,该函数还返回一个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();
结果:
实例代码是自己写的实现别的功能,其中需要读取字段属性。