首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > IBM DB2 >

请问一个db2 CLI有关问题

2012-02-23 
请教一个db2 CLI问题任务:C的应用程序往DB2数据库中插入cardid,name,idcard(卡号,姓名,身份证号),需要在插

请教一个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语句,主函数和子函数能不能同享一个连接句柄?如果不能的话就要在主函数和子函数中分别定义环境句柄、连接句柄等,当……

热点排行