读书人

请问一个db2 CLI有关问题

发布时间: 2012-02-23 22:01:35 作者: rapoo

请教一个db2 CLI问题
任务:C的应用程序往DB2数据库中插入cardid,name,idcard(卡号,姓名,身份证号),需要在插入操作前检查数据中是否有相同的身份证号。用CLI的话我只会让检查和插入操作在同一模块进行,如果将检查工作单独写一个函数的话:
nt CheckObj(char *tb,char *obj,char *value)
{
/*检查身份证号是否已存在*/
int RetCode;
extern ConHandle;
extern StmtHandle;
extern SQLStmt[255];

/*定义查询语句句柄*/
RetCode = SQLAllocHandle(SQL_HANDLE_STMT,ConHandle,&StmtHandle);

strcpy((char*)SQLStmt, "select * from ? where ?=? ");
RetCode = SQLPrepare(StmtHandle,SQLStmt,SQL_NTS);

RetCode = SQLBindParameter(StmtHandle,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,sizeof(tb),0,tb,0,0);/*绑定参数tb与 '? '*/

RetCode = SQLBindParameter(StmtHandle,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,sizeof(obj),0,obj,0,0);/*绑定参数idcard与 '? '*/

RetCode = SQLBindParameter(StmtHandle,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,sizeof(Value),0,value,0,0);/*绑定参数value与 '? '*/

RetCode = SQLExecute(StmtHandle);

RetCode = SQLFetch(StmtHandle);
if(SQL_NO_DATA != RetCode)
return NORECODE;

SQLStmt[0] = '\0 ';
SQLFreeHandle(SQL_HANDLE_STMT,StmtHandle);

return 0;
}

//
int InsertCounter(void)
{
SQLHANDLEEnvHandle=0;
SQLHANDLEConHandle=0;
SQLHANDLEStmtHandle=0;
SQLRETURNRetCode=SQL_SUCCESS;

SQLCHARSQLStmt[255];
char *cardid;
char *name;
char *idcard;

/*定义环境句柄*/
SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&EnvHandle);

/*声明db2版本*/
SQLSetEnvAttr(EnvHandle,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,SQL_IS_UINTEGER);

/*定义连接句柄*/
SQLAllocHandle(SQL_HANDLE_DBC,EnvHandle,&ConHandle);

/*连接数据库test*/
RetCode = SQLConnect(ConHandle,(SQLCHAR *) "usercd ",
SQL_NTS,(SQLCHAR *) "myinst ",
SQL_NTS,(SQLCHAR *) "112112 ",
SQL_NTS);

RetCode = CheckObj( "counter ", "idcard ",idcard);
if(NORECODE == RetCode)
printf( "idcard not exists ");
}/*省略部全纠错与句柄释放的语句*/

编译器会报错误和警告:


warning:passing argument 3 of 'SQLALLocHandle ' from incomatible pointer type
warning:passing argument 2 of 'SQLPrepare ' from incomatible pointer type

这里其实还是有p wh 问题没弄明白:
1.在一个模块中定义了四个句柄后,在他的子模块中能不能照用;如果能,该怎么用,如果不能,还有其他什么方法么


[解决办法]
第一个问号,第二个问号显然不能绑定,只能是显示的表名, 列名。动态传表名,列名,你可以拼sql语句。
绑定只能绑定值,而不是列名。
[解决办法]
如果我没理解错的话,这就是一普通父子函数共享变量的问题啊,跟数据库都没关系了
两种方法
1 在父函数中声明和获取,然后通过子函数参数穿进去
2 声明成全局变量

探讨
引用:

没有仔细看你的例子。但可以肯定的是,父函数和子函数是可以共享连接句柄的。父函数中获得的任何资源子函数都可以使用。
引用:
我的意思是在一个要执行SQL语句的函数中调另一个子函数,该子函数也同样要执行一些SQL语句,主函数和子函数能不能同享一个连接句柄?如果不能的话就要在主函数和子函数中分别定义环境句柄、连接句柄等,当……

读书人网 >IBM DB2

热点推荐