C语言 SDK编程之数据库编程--ODBC数据源 API的使用

一、windows下数据库的编程接口有以下几种 
  ODBC   API 
  DAO 
  OLEDB 
  ADO 
  ADO.NET 
  
  其中odbc是函数形式的接口 
  dao,oledb,ado是com组件 
  ado.net是.net平台下的编程接口 
  mfc提供了odbc和dao的数据库类CDatabase、CDaoDatabase 
  atl提供了oledb的模板类 

二、ODBC API在SDK编程中的使用

以下例为说明:

#include<windows.h>  

#include<sql.h> 
#include<sqlext.h> 
void   main()  

{

    HENV   henv;  //环境句柄
    HDBC   hdbc;  //数据源句柄
    HSTMT   hstmt;  //执行语句句柄
    unsigned   char   datasource[]="数据源名称";  //即ODBC源中设置的源名称

    unsigned   char   user[]= "用户名";  //数据库的帐户名

    unsigned   char   pwd[]= "密码";  //数据库的密码
    unsigned   char   search[]="select   xm   from   stu   where   xh=0"; 
    SQLRETURN   retcode; //记录各SQL函数的返回情况

    // 分配环境句柄
   
retcode= SQLAllocEnv(&henv);  // 等介于 SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

    // 设置ODBC环境版本号为3.0
   
retcode= SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

    // 分配连接句柄
   
retcode= SQLAllocConnect(henv,&hdbc); // 等介于 SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

    //设置连接属性,登录超时为*rgbValue秒(可以没有)
     // SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)(rgbValue), 0);

    //直接连接数据源

    // 如果是windows身份验证,第二、三参数可以是NULL,也可以是任何字串

    //SQL_NTS 即 "Null-Terminated   String" 
   
retcode= SQLConnect(hdbc,datasource, SQL_NTS, user, SQL_NTS , pwd, SQL_NTS ); 

    //分配语句句柄
   
retcode= SQLAllocStmt(hdbc,&hstmt);  // 等介于 SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

    //直接执行查询语句
    retcode=SQLExecDirect(hstmt,search,SQL_NTS); 

    //将数据缓冲区绑定数据库中的相应字段(i是查询结果集列号,queryData是绑定缓冲区,BUFF_LENGTH是缓冲区长度)

    SQLBindCol(hstmt, i, SQL_C_CHAR, queryData[i-1], BUFF_LENGTH, 0);

    //遍历结果集到相应缓冲区

    SQLFetch(hstmt);  


    /*

     *对遍历结果的相关操作,如显示等

     *

     */


    //注意释放顺序,否则会造成未知错误!
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    SQLDisconnect(hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
  }  

三、ADO可以直接使用SDK编程,只要导入ADO库就行

#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF","adoEOF")   //导入ADO库

#include   <windows.h> 

#include   <stdio.h> 
   

void   main() 

  try 
  { 
  LPCTSTR   DatabaseFile="C://Program Files//Microsoft SQL Server//MSSQL.2//MSSQL//Data//Student.mdf"; 
  WIN32_FIND_DATA wfd; 
  HANDLE hFile   =   FindFirstFile(DatabaseFile,&wfd); 
  if(hFile   ==   INVALID_HANDLE_VALUE) 
  { 
  printf("Cannot   Find   the   database   file/n"); 
  system("pause"); 
  return; 
  } 
  
  CoInitialize(NULL); 
  HRESULT hr; 
  _ConnectionPtr MyConnection; 
  
  MyConnection.CreateInstance(__uuidof(Connection)); 
  hr =   MyConnection->Open(_bstr_t("Provider=Microsoft.Jet.OLEDB.4.0;Data   Source=C://Program Files//Microsoft SQL Server//MSSQL.2//MSSQL//Data//Student.mdf"), 
  _bstr_t(""), 
  _bstr_t(""), 
  adModeUnknown); 
  if(MyConnection   ==   NULL) 
  { 
  printf("Could   not   acquire   a   Connection   interface"); 
  system("pause"); 
  return; 
  } 
  
  _CommandPtr  pCommand; 
  pCommand.CreateInstance(__uuidof(Command)); 
  pCommand->ActiveConnection=MyConnection; 
  pCommand->CommandText="select * from Stu"; 
  
  _RecordsetPtr  pRecordset; 
  pRecordset.CreateInstance(__uuidof(Recordset)); 
  pRecordset->CursorLocation   =   adUseClient; 
  pRecordset->Open((IDispatch*)pCommand, 
  vtMissing, 
  adOpenStatic, 
  adLockBatchOptimistic, 
  adCmdUnknown); 
  
  _variant_t column; 
  while(!pRecordset->adoEOF) 
  { 
  column=pRecordset->GetCollect("管理员"); 
  if(column.vt   !=   VT_NULL) 
  printf((char*)_bstr_t(column)); 
  printf("/t"); 
  column=pRecordset->GetCollect("密码"); 
  if(column.vt   !=   VT_NULL) 
  printf((char*)_bstr_t(column)); 
  printf("/n"); 
  pRecordset->MoveNext(); 
  
  } 
  
  printf("hello   world!/n"); 
  MyConnection->Close(); 
  system("pause"); 
  CoUninitialize(); 
  } 
  catch(_com_error   &e) 
  { 
  _bstr_t bstrError(e.ErrorMessage()); 
  LPTSTR   strError   =   (char*)bstrError; 
  printf(strError); 
  printf("/n"); 
  
  system("pause"); 
  } 

转载于:https://my.oschina.net/dake/blog/196633

猜你喜欢

转载自blog.csdn.net/weixin_34067980/article/details/91508762