博客网 >

      在用vc开发IMS之类的管理系统,使用ODBC API函数打开数据库是其中一种方法。有人认为ODBC API函数给人一种颇复杂的感觉,因为有句柄和ODBC数据类型之类陌生的概念。但看过书之后,我感觉使用ODBC API函数打开数据库思路还是很清晰的,并不会给人一种无从下手的感觉。

      现在我试着以ODBC API函数SQLConnect()为例说明使用ODBC API函数打开数据库的思路。

1.定义环境句柄、连接句柄和语句句柄。

2.分配环境句柄

3.设置ODBC环境属性

4.分配连接句柄

5.设置连接属性

6.使用SQLConnect()连接到数据库

7.分配语句句柄

8.处理数据

9.释放语句句柄

10.断开和数据源的连接

11.释放连接句柄

12.释放环境句柄

下面是我的测试程序(在VC6.0编译通过)。首先我使用SQL Sever2000建立了一个数据库,名为“gis”.

#include<windows.h>

#include <sqlext.h>

#include<iostream.h>

int main()
{
 SQLHENV henv;              //定义环境句柄
 SQLHDBC  hdbc;             //定义连接句柄
    SQLHSTMT  hstmt;       //定义语句句柄
 SQLRETURN  retcode;    //定义ODBC API运行返回值 

 retcode=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);//分配环境句柄
 if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)//假如分配成功
 {

//设置ODBC环境属性
  retcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
  if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)
  {
   retcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//分配连接句柄
   if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)
   {

//  设置连接属性,设置连接时间为5秒。
  retcode=SQLSetConnectAttr(hdbc,SQL_LOGIN_TIMEOUT,(SQLPOINTER)5,0);
     if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)
    {
    retcode=SQLConnect(hdbc,(SQLCHAR*)"gis",SQL_NTS,(SQLCHAR*)"",SQL_NTS,(SQLCHAR*)"",SQL_NTS);//使用SQLConnect()连接到数据库
    if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)
    {
//分配语句句柄     

retcode=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
     if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)
    cout<<"open database successly! \n";//提示连接成功(此处可添加处理数据的语句)
    }
    }
    SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//释放语句句柄
    SQLDisconnect(hdbc);//断开和数据源的连接
   }
  }
  SQLFreeHandle(SQL_HANDLE_DBC,hdbc);// 释放连接句柄
 }
 SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄
 return 0;
}

值得注意的两个问题:

1.头文件问题。#include<windows.h>和#include <sqlext.h>都是不可缺少的。

2.设置连接属性语句的类型转换问题。一些网叶如http://www.czvc.com/view.asp?id=203

这一句是这样的:SQLSetConnectAttr(hdbc, (void*)SQL_LOGIN_TIMEOUT, 5, 0);
但我测试过了,这一句会出错。SQLSetConnectAttr原型如下:

SQLRETURN SQLSetConnectAttr(
SQLHDBCConnectionHandle,
SQLINTEGERAttribute,
SQLPOINTERValuePtr,
SQLINTEGERStringLength);

可以看到第二个参数的类型是SQLINTEGER,并非(void*)。

<< 不吐不快 ------《鬼子来了... / 大人决定小孩的命运? >>

专题推荐

不平凡的水果世界

不平凡的水果世界

平凡的水果世界,平凡中的不平凡。 今朝看水果是水果 ,看水果还是水果 ,看水果已不是水果。这境界,谁人可比?在不平凡的水果世界里,仁者见仁,智者见智。

中国春节的那些习俗

中国春节的那些习俗

正月是农历新年的开始,人们往往将它看作是新的一年年运好坏的兆示期。所以,过年的时候“禁忌”特别多。当然,各个地方的风俗习惯不一样,过年的禁忌也是不一样的。

评论
0/200
表情 验证码:

clever101

  • 文章总数0
  • 画报总数0
  • 画报点击数0
  • 文章点击数0
个人排行
        博文分类
        日期归档