免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2381 | 回复: 6
打印 上一主题 下一主题

请教ODBC编程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-12 10:12 |只看该作者 |倒序浏览
问题:sql语句通过ODBC访问数据库
执行SQLFetch()之后是否必须释放连接啊,
首先执行下面代码
//STA1="select FSUID FROM tb_fsu where telnum=1234567"
retcode=SQLPrepare(hstmt1,STA1,SQL_NTS);
retcode=SQLExecute(hstmt1);
retcode=SQLBindCol(hstmt1,1,SQL_C_CHAR,FSUID,50,&FsuInd);
retcode=SQLFetch(hstmt1);
if(retcode==SQL_SUCCESS || retcode==SQL_SUCCESS_WITH_INFO)
{
CString dd=FSUID;
// AfxMessageBox(dd);
}
在执行完这段代码后,我想继续执行另外一个SQL语句,就是
重新定义一个SQL语句STA2,然后
retcode=SQLPrepare(hstmt1,STA2,SQL_NTS);
retcode=SQLExecute(hstmt1);
发现SQLPrepare(hstmt1,STA2,SQL_NTS)执行不成功,不知为什么


急问,谢谢

论坛徽章:
0
2 [报告]
发表于 2004-03-12 10:52 |只看该作者

请教ODBC编程问题

我想,如果是在一个函数中执行的话,你可以不用再打开连接。但如果你要在另一个函数中再用sql语句时,必须重新连接,而且在连接前,你必须断开对同一个数据库访问其其它连接(不是同一个数据库,没关系),这和线程有关。

论坛徽章:
0
3 [报告]
发表于 2004-03-12 11:01 |只看该作者

请教ODBC编程问题

我刚好做了个
看看我的部分原码:
#include <odbc/sql.h>;
#include <odbc/sqlext.h>;
#include <odbc/sqltypes.h>;
rc = SQLAllocEnv(&henv);                                 
if (rc) printf("allocate envrionment handle fail !! \n";
rc = SQLAllocConnect(henv,&hdbc);                        
if (rc) printf("allocate connection handle fail !! \n";
rc = SQLConnect(hdbc,(UCHAR *)DSN,SQL_NTS,(UCHAR *)UID,SQL_NTS,(UCHAR *)PWD,SQL_NTS);
checkrc(RTN_OK, NULL, hdbc, NULL);  

    intervalLoop = 2;
    sprintf(buf,"%s%s",sql,SimpleDateFormat);
    strcpy((char *)str1,buf);
    rc = SQLExecDirect(cmdp1,str1,SQL_NTS);
    checkrc(RTN_OK,NULL,NULL,cmdp1);
   
    rc = SQLBindCol(cmdp1,  1,SQL_C_SSHORT,&item1, sizeof(SWORD),&szbc1);
    rc = SQLBindCol(cmdp1,  2,SQL_C_CHAR ,&item2, sizeof(SWORD),&szbc2);   
    rc = SQLBindCol(cmdp1,  3,SQL_C_CHAR ,&item3, sizeof(SWORD),&szbc3);
    rc = SQLBindCol(cmdp1,  4,SQL_C_CHAR ,&item4, sizeof(SWORD),&szbc4);
    rc = SQLBindCol(cmdp1,  5,SQL_C_CHAR ,&item5, sizeof(SWORD),&szbc5);
    rc = SQLBindCol(cmdp1,  6,SQL_C_CHAR ,&item6, sizeof(SWORD),&szbc6);
    rc = SQLBindCol(cmdp1,  7,SQL_C_CHAR ,&item7, sizeof(SWORD),&szbc7);
    rc = SQLBindCol(cmdp1,  8,SQL_C_CHAR ,&item8, sizeof(SWORD),&szbc;
    rc = SQLBindCol(cmdp1,  9,SQL_C_CHAR ,&item9, sizeof(SWORD),&szbc9);
    rc = SQLBindCol(cmdp1, 10,SQL_C_CHAR ,&item10,sizeof(SWORD),&szbc10);
    rc = SQLBindCol(cmdp1, 11,SQL_C_CHAR ,&item11,sizeof(SWORD),&szbc11);
   
   
    while (rc = SQLFetch(cmdp1))
                 {        
                 sprintf(SendSN    ,"%d",item1);
                 sprintf(ItemId    ,"%s",item2);                 
                 sprintf(SpNumber  ,"%s",item3);
                 sprintf(UserNumber,"%s",item4);
                 sprintf(FeeNumber ,"%s",item5);
                 sprintf(FeeType   ,"%s",item6);
                 sprintf(ReportFlag,"%s",item7);
                 sprintf(MsgCode   ,"%s",item;
                 sprintf(Msg       ,"%s",item9);
                 sprintf(MtFlag    ,"%s",item10);
                 sprintf(ExtData   ,"%s",item11);                
                 sprintf(CommandId ,"%04s",SendSN);
                 sprintf(MsgId ,"%s%06s",SimpleDateFormat,SendSN);
}
rc = SQLFreeStmt(cmdp1, SQL_CLOSE);
checkrc(RTN_OK,NULL,NULL,cmdp1);

论坛徽章:
0
4 [报告]
发表于 2004-03-12 13:53 |只看该作者

请教ODBC编程问题

SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); //分配连接句柄
SQLConnect(hdbc, (SQLCHAR*) "baccy", SQL_NTS,(SQLCHAR*) "sa", SQL_NTS,(SQLCHAR*) szPassword, SQL_NTS);
SQLAllocHandle( SQL_HANDLE_STMT,hdbc,&hstmt);
SQLExecDirect(hstmt,(SQLCHAR *)SqlStr,SQL_NTS);
SQLFetch(hstmt);
SQLGetData(hstmt, 4, SQL_C_DEFAULT, &OrderAmount, sizeof(long), &err_code);


SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLAllocHandle( SQL_HANDLE_STMT,hdbc,&hstmt);

应该是这样的顺序吧。

论坛徽章:
0
5 [报告]
发表于 2004-03-12 14:45 |只看该作者

请教ODBC编程问题

您的意思是每次执行完select语句都要先释放句柄,然后在分配句柄,再进行其他操作,对吗?

论坛徽章:
0
6 [报告]
发表于 2004-03-12 15:59 |只看该作者

请教ODBC编程问题

没错,如果你不释放的话,分配的多了肯定会有问题。因为odbc要维护一套重环境句柄到连接句柄在到语句句柄的树行结构。

论坛徽章:
0
7 [报告]
发表于 2004-03-16 10:15 |只看该作者

请教ODBC编程问题

为什么'delete,insert update"这样的SQL语句就可以在申请一次句柄后,重复执行这样的SQL语句啊:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP