SQL有没有一个供C调用的API函数集?我喜欢用C的函数来编程.
SQL有DLL库吗?

解决方案 »

  1.   

    在sql中online book查找Api,应该能找到,以前我曾经做过,但源程序不见了
    sigh!
      

  2.   

    DBLIB
    MSDN里还有很多例子。
      

  3.   

    C API数据类型包括:MYSQL(数据库连接句柄)、MYSQL_RES(查询返回结果集)、MYSQL_ROW(行集)、MYSQL_FIELD(字段信息)、MYSQL_FIELD_OFFSET(字段表的偏移量)、my_ulonglong(自定义的无符号整型数)等;C API提供的函数包括:mysql_close()、mysql_connect()、mysql_query()、mysql_store_result()、mysql_init()等,其中mysql_query()最为重要,能完成绝大部分的数据库操控。下面将具体讨论数据库操作类CDatabase通过C API的实现以及在VC中的应用。3.1 CDatabase类的实现CDatabase类封装了MySQL数据库的功能,因此不具备通用性,只能在对MySQL的应用程序中使用。下面将根据C++要求及规范给出CDatabase类的具体结构以及相关简要介绍:
    class CDatabase  
    {
    public:
        BOOL UnLockTable();                     //解锁
        BOOL LockTable(char* TableName,char* PRIORITY);     //加锁
        int Reload();                           //重新登陆,非零时返回错误信息
        char* GetState();                       //服务器状态
        char* GetServerInfo();                  //服务器信息
        int GetProtocolInfo();                  //协议信息
        char* GetHostInfo();                        //主机信息
        char * GetClientInfo();                 //客户机信息
        char* GetFieldName(int FieldNum);       //字段名
        BOOL IsEnd();                           //是否最后
        int DropDB(char *db);                   //删除数据库,非零时返回错误信息
        void SeekData(int offset);              //查找指定数据
        int CreateDB(char *db);                 //创建数据库,非零时返回错误信息
        void FreeRecord();                      //释放结果集
        unsigned int GetFieldNum();             //得到字段数
        BOOL ConnectDB(Database_Param *p);      //连接数据库
        MYSQL_ROW GetRecord();                  //得到结果(一个记录)
        my_ulonglong GetRowNum();               //得到记录数
        BOOL SelectDB(Data_Param *para);            //选择数据库
        BOOL UpdateRecord(Data_Param *para);        //更新记录
        BOOL SelectRecord(Data_Param *para);        //选择记录
        BOOL InsertRecord(Data_Param *para);        //插入记录
        BOOL DelRecord(Data_Param *para);       //删除记录
        BOOL SelectAll(Data_Param *para);       //选择所有记录
        char * OutErrors();                     //输出错误信息
        CDatabase();                                //初始化数据库
        virtual ~CDatabase();                   //关闭数据库连接
     
    private:
        MYSQL mysql;                                //数据库连接句柄
        MYSQL_RES *query;                       //结果集
        MYSQL_ROW row;                          //记录集
        MYSQL_FIELD *field;                     //字段信息(结构体)
        BOOL FindSave(char *str);               //查找并保存结果集
    };通过CDatabase类中定义的这些功能函数,我们可以通过远程或本机完成对MySQL数据库的绝大部分操控,并且由于定义了解锁和加锁功能,使得应用程序能够多线程或多进程地访问数据库,大大提高了效能。以上函数的具体功能都是通过调用C API函数实现的。 
    3.2 CDatabase类在VC中的应用第一步 建立初始化MySQL对象,并且将其初始化。即定义CDatabase类对象,这样程序就会自动调用构造函数CDatabase(),完成初始化。构造函数实现如下:CDatabase::CDatabase ()
    {
      mysql_init (&mysql);
    }
    完成初始化只需定义CDatabase类对象,即CDatabase base;
    第二步 连接服务器,并连接需要的数据库。即调用ConnectDB(Database_Param *p)函数,结构体Database_Param中存放数据库参数,包括主机名、用户名、密码、数据库名等。该函数如返回TRUE表示连接成功,否则表示失败。连接函数实现如下: BOOL CDatabase::ConnectDB(Database_Param *p)
    {
    if(!mysql_real_connect(&mysql,p->host,p->user,p->password,p->db,p->port,p->unix_socket,p->client_flag))
    {     
      OutErrors();      // 输出错误信息
      return false;
    }
        return true;
    }第三步 对数据库进行加锁。即调用LockTable(char* TableName,char* PRIORITY),对相应的表TableName完成相应属性PRIORITY的加锁,使程序兼容多线程功能。 加锁函数实现如下: BOOL CDatabase::LockTable(char* TableName,char* PRIORITY)
    {
        char str[50];
        sprintf(str,"LOCK TABLES %s %s",TableName,PRIORITY);
        if(mysql_query(&mysql,str))
            return false;
        return true;
    }
    第四步 完成数据库操作。即根据需要调用UpdateRecord(Data_Param *para)、SelectRecord(Data_Param *para)、InsertRecord(Data_Param *para)、DelRecord(Data_Param *para)等操作。其中的结构体Data_Param中存放数据库操作参数。上述两个结构体的定义在global.h中。 InsertRecord函数实现如下,其它实现方法相似: BOOL CDatabase::InsertRecord(Data_Param *para)
    {
      char str[80];
      sprintf(str,"insert into %s values(%s)",para->tab_name,para->insert_val);
      if(mysql_query(&mysql,str))
        return false;
      return true;
    }第五步 解锁数据库。即调用UnLockTable(),完成对上述被加锁的表的解锁。 解锁函数实现如下: BOOL CDatabase::UnLockTable()
    {   
      if(mysql_query(&mysql,"UNLOCK TABLES"))
         return false;
      return true;
    }第六步 关闭数据库连接。即调用析构函数~CDatabase(),关闭数据库,并自动释放初始化时定义的CDatabase类对象。 析构函数如下: CDatabase::~CDatabase()
    {   
      if(query)
         mysql_free_result(query);
      mysql_close(&mysql);
    }
    注意:在编译程序时,必须加入MySQL的库文件libmySQL.lib。