国产DM4数据库ODBC编程指南
而这一切正因为ODBC,学习与掌握好ODBC,对于数据库应用系统的开发可以起到很好的帮助作用。
如何使用C++ Builder进行更广泛深入的数据库编程不在本手册的谈论范围之内,读者感兴趣可参考C++ Builder编程指南。
4.4 在PowerBuilder中通过ODBC访问DM4
PowerBuilder也是目前广泛使用的数据库应用系统主流开发工具,下面我们通过图例介绍如何在PowerBuilder中通过ODBC访问DM4数据库管理系统。
运行PowerBuilder8.0,其集成开发环境界面如图4.11所示。
图4.11PowerBuilder集成开发环境
点击DBProfile命令,得到如图4.12所示的对话框。
图4.12DBProfile对话框
选中ODBODBC,点击New按钮,如图4.13所示进行ODBCDBProfile的配置。
图4.13DBProfile配置
点击OK按钮,创建DM4DBProfile成功,如图4.14所示。
图4.14DBProfile配置成功
选中DM4,点击Connect按钮,点击Database命令,得到如图4.15所示的界面。
图4.15连接DM4数据源成功
客户就可以对DM4数据库进行访问了,如访问商场登记表,如图4.16所示。
图4.16浏览DM4数据源中的表数据
也可以浏览数据库的一些元信息,如图4.17所示。
图4.17浏览数据库元信息
这里简要介绍了在PowerBuilder中如何通过ODBC访问DM4数据库。PowerBuilder同样也是一个功能十分强大的数据库可视化开发工具,掌握它对设计与开发应用系统有着十分重要的帮助。读者如果感兴趣,可以参考PowerBuilder开发指南。
5 使用存储过程和函数
DM4允许用户创建和使用存储模块,下面介绍如何在DM4ODBC应用中使用存储过程和函数。
5.1 存储过程与函数字典信息的获取
DM4 ODBC3.0支持字典函数SQLProcedures的调用,用户可以调用此函数来获取DM4存储过程与函数的字典信息。
调用方法如下:
SQLProcedures(stmt,“SYSTEM”,SQL_NTS,“SYSDBA”,SQL_NTS,“TEST_PROC”,SQL_NTS);
返回字典信息格式如表5.1。
表5.1:字典信息说明表
编号 字典项 相关说明
1 PROCEDURE_CAT 存储模块编目信息
2 PROCEDURE_SCHEM 存储模块模式信息
3 PROCEDURE_NAME 存储模块名
4 NUM_INPUT_PARAMS DM4暂时没有返回此项信息
5 NUM_OUTPUT_PARAMS DM4暂时没有返回此项信息
6 NUM_RESULT_SETS DM4暂时没有返回此项信息
7 REMARKS DM4暂时没有返回此项信息
8 PROCEDURE_TYPE 存储模块的类型
DM4 ODBC3.0支持字典函数SQLProcedureColums的调用,用于返回存储模块的参数信息。
调用方法如下:
SQLProcedureColumns(stmt,“SYSTEM”,SQL_NTS,“SYSDBA”,SQL_NTS,“TEST_PROC”,SQL_NTS,NULL,0);
返回字典信息格式如表5.2。
表5.2:字典信息说明表
编号 字典项 相关说明
1 PROCEDURE_CAT 存储模块编目信息
2 PROCEDURE_SCHEM 存储模块模式信息
3 PROCEDURE_NAME 存储模块名
4 COLUMN_NAME 参数名
5 COLUMN_TYPE 参数的类型,即为输入参数还是输出参数
6 DATA_TYPE 参数的SQL数据类型
7 TYPE_NAME 参数的类型名
8 COLUMN_SIZE 参数的精度
9 BUFFER_LENGTH 参数所占用的字符长度
10 DECIMAL_DIGITS 参数的刻度
11 NUM_PREC_RADIX 仅对数值类型有效,仅为10或者2,如果为10表示为精确数字,如果为2表示为非精确数字
12 NULLABLE 参数是否接收空值标志
13 REMARK 参数说明
14 COLUMN_DEF 参数的缺省值
15 SQL_DATA_TYPE 参数的SQL数据类型
16 SQL_DATETIME_SUB 日期时间类型或者时间间隔类型的子代码
17 CHAR_OCTET_LENGTH 字符数据类型以字节计算的最大长度,非字符类型返回空值
18 ORDINAL_POSITION 参数的顺序
19 IS_NULLABLE 参数是否包含空值
5.2 存储模块的创建
用户可以使用SQLExecDirect函数执行创建存储模块的SQL语句来创建存储模块,如下例所示:
SQLExecDirect(stmt, (SQLCHAR *)“create or replace procedure test_proc (c1 in int) ”
“as ”
“declare c2 int ”
“begin ”
“c2 := c1 + 100 ”
“end;”, SQL_NTS);
5.3 存储模块的调用
调用存储模块的方法可以分为两种情况。
1.立即调用
如果存储过程需要设置参数,那么在调用存储模块的时候就已经为为所有的IN、INOUT类型的参数进行了赋值,带有OUT属性的参数的值是通过取得存储过程结果集的方法获取的。立即执行存储过程的示例如下:
SQLExecDirect(stmt,(SQLCHAR*)”calltest_proc(123);”,SQL_NTS);
2.参数调用
这种调用方法指的是在调用模块的时候,其参数值用问号来代替,发送给服务器之后,服务器返回参数的准备信息,用户依据服务器返回的参数描述信息进行参数绑定,然后执行,其参数的处理方法与普通的参数处理方法相同。
DM4支持存储模块返回多个结果集的处理,多结果集的切换通过SQLMoreResult函数切换,下面通过一个实例来说明如何使用。
#include
#include
#include
#include
#include
HENV env;
HDBC dbc;
HSTMT stmt;
RETCODE ret;
short i;
short cols;
char colname[129];
char coldata[256];
void main(void)
{
SQLAllocHandle(SQL_HANDLE_ENV, NULL, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
SQLConnect(dbc, (SQLCHAR *)"DM4", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS);
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
SQLExecDirect(stmt, (SQLCHAR *)"drop table test_table1;", SQL_NTS);
SQLExecDirect(stmt, (SQLCHAR *)"drop table test_table2;", SQL_NTS);
SQLExecDirect(stmt, (SQLCHAR *)"create table test_table1 (t1col int);", SQL_NTS);
SQLExecDirect(stmt, (SQLCHAR *)"insert into test_table1 values(100);", SQL_NTS);
SQLExecDirect(stmt, (SQLCHAR *)"create table test_table2 (t2col varchar(10));", SQL_NTS);
SQLExecDirect(stmt, (SQLCHAR *)"insert into test_table2 values('hello!');", SQL_NTS);
SQLExecDirect(stmt, (SQLCHAR *)"create or replace procedure test_proc as begin select * from test_table1 select * from test_table2 end;", SQL_NTS); SQLExecDirect(stmt, (SQLCHAR *)"call test_proc;

