VC下的数据库操作之--ODBC .

来源:互联网 发布:网络主播商业模式 编辑:程序博客网 时间:2024/05/07 23:12
近日学了VC下的数据库操作,今个先总结下ODBC的使用。

       ODBC以微软自带Access数据库举例:创建一个名为myds.mdb的文件,两个字段ID与NAME,数据自己随便填一些即可。

 

方法1:

       需要手动添加数据源myds

      

[cpp] view plaincopyprint?
  1. #include <stdio.h>   
  2. #include <windows.h>   
  3. #include <sql.h>   
  4. #include <sqlext.h>   
  5. int main()  
  6. {  
  7.     HENV env;  
  8.     HDBC dbc;  
  9.     HSTMT stmt;  
  10.     //1.分配环境句柄   
  11.     SQLAllocEnv(&env);  
  12.     //2.分配连接句柄   
  13.     SQLAllocConnect(env,&dbc);  
  14.     //3.与数据库建立连接   
  15.     SQLConnect(dbc,(SQLCHAR*)"myds",SQL_NTS,NULL,0,NULL,0);  
  16.     //4.发送一个语句句柄   
  17.     SQLAllocStmt(dbc,&stmt);  
  18.     //5.使用语句句柄向数据库发送SQL语句   
  19.     SQLExecDirect(stmt,(SQLCHAR*)"SELECT * FROM myds",SQL_NTS);  
  20.       
  21.     //6.得到查询结果并处理   
  22.     RETCODE code;  
  23.     SQLINTEGER sid;  
  24.     SQLCHAR name[100];  
  25.     memset(name,0,100);  
  26.     SDWORD size;  
  27.     for(code=SQLFetch(stmt);code==SQL_SUCCESS;code=SQLFetch(stmt)){  
  28.         //取出每一列并显示   
  29.         SQLGetData(stmt,1,SQL_C_ULONG,&sid,sizeof(sid),&size);  
  30.         SQLGetData(stmt,2,SQL_C_CHAR,name,sizeof(name),&size);  
  31.         printf("ID=%d,NAME=%s/n",sid,name);  
  32.     }  
  33.     //添加数据   
  34.     HSTMT stmt1;    //不能再使用stmt了   
  35.     SQLAllocStmt(dbc,&stmt1);  
  36.     SQLExecDirect(stmt1,(SQLCHAR*)"INSERT INTO myds VALUES(10,'hahah')",SQL_NTS);  
  37.     SQLEndTran(SQL_HANDLE_DBC,dbc,SQL_COMMIT);  //提交事物  
  38.     //7.释放资源:先创建的最后释放   
  39.     SQLFreeStmt(stmt1,SQL_CLOSE);  
  40.     SQLFreeStmt(stmt,SQL_CLOSE);  
  41.     SQLDisconnect(dbc);  
  42.     SQLFreeConnect(dbc);  
  43.     SQLFreeEnv(env);  
  44.     return 0;  
  45. }  
  

方法2:

        代码内配置数据源myds

       

[cpp] view plaincopyprint?
  1. #include <stdio.h>   
  2. #include <windows.h>   
  3. #include <sql.h>   
  4. #include <sqlext.h>   
  5. #include <odbcinst.h>    
  6. int main()  
  7. {  
  8.     HENV env;  
  9.     HDBC dbc;  
  10.     HSTMT stmt;  
  11.     //1.分配环境句柄   
  12.     SQLAllocEnv(&env);  
  13.     //2.分配连接句柄   
  14.     SQLAllocConnect(env,&dbc);  
  15. /* 
  16.     //3.通过程序来添加数据源:需要添加odbcinst.h头文件 
  17.     SQLConfigDataSource(0, 
  18.         ODBC_ADD_DSN, 
  19.         "Driver do Microsoft Access (*.mdb)",  
  20.         "DSN=myds/0"  
  21.         "DEFAULTDIR=D://rar//rar//Tuesday//odbc/0"  
  22.         "DBQ=D://rar//rar//Tuesday//odbc//myds.mdb/0"); 
  23. */  
  24.     //设置连接的属性   
  25.     SQLSetConnectAttr(dbc,SQL_ATTR_TRACEFILE,"trace.txt",SQL_NTS);//此步必须在前  
  26.     SQLSetConnectAttr(dbc,SQL_ATTR_TRACE,(SQLPOINTER)SQL_OPT_TRACE_ON,SQL_IS_INTEGER);  
  27.   
  28.     //4.与数据库建立连接   
  29.     SQLConnect(dbc,(SQLCHAR*)"myds",SQL_NTS,NULL,0,NULL,0);  
  30.     //5.发送一个语句句柄   
  31.     SQLAllocStmt(dbc,&stmt);  
  32.     //6.使用语句句柄向数据库发送SQL语句   
  33.     SQLExecDirect(stmt,(SQLCHAR*)"SELECT * FROM myds",SQL_NTS);  
  34.       
  35.     //7.得到查询结果并处理   
  36.     RETCODE code;  
  37.     SQLINTEGER sid;  
  38.     SQLCHAR name[100];  
  39.     memset(name,0,100);  
  40.     SDWORD size;  
  41.     for(code=SQLFetch(stmt);code==SQL_SUCCESS;code=SQLFetch(stmt)){  
  42.         //取出每一列并显示   
  43.         SQLGetData(stmt,1,SQL_C_ULONG,&sid,sizeof(sid),&size);  
  44.         SQLGetData(stmt,2,SQL_C_CHAR,name,sizeof(name),&size);  
  45.         printf("ID=%3d , NAME=%s/n",sid,name);  
  46.     }  
  47.     //添加数据   
  48.     HSTMT stmt1;    //不能再使用stmt了   
  49.     SQLAllocStmt(dbc,&stmt1);  
  50.     SQLExecDirect(stmt1,(SQLCHAR*)"INSERT INTO myds VALUES(10,'hahah')",SQL_NTS);  
  51.     SQLEndTran(SQL_HANDLE_DBC,dbc,SQL_COMMIT);  //提交事物  
  52.     //8.释放资源:先创建的最后释放   
  53.     SQLFreeStmt(stmt1,SQL_CLOSE);  
  54.     SQLFreeStmt(stmt,SQL_CLOSE);  
  55.     SQLDisconnect(dbc);  
  56.     SQLFreeConnect(dbc);  
  57.     SQLFreeEnv(env);  
  58.     return 0;  
  59. }  

方法3:

        使用MFC编程

       

  1. #include <afxdb.h>   
  2. #include <stdio.h>   
  3. class MyRecordSet : public CRecordset  
  4. {  
  5. public:  
  6.     CString m_name;  
  7.     CString m_id;  
  8. //  int m_id;   
  9. public:  
  10.     MyRecordSet(CDatabase *db):CRecordset(db){  
  11.         m_nFields = 2;  //字段的数目  
  12.     }  
  13.     void DoFieldExchange(CFieldExchange* pFX){  
  14.         pFX->SetFieldType(CFieldExchange::outputColumn);  
  15.         RFX_Text(pFX, "ID", m_id);      //ID与NAME顺序不能错  
  16. //      RFX_Int(pFX,"ID", m_id);   
  17.         RFX_Text(pFX, "NAME", m_name);  
  18.     }  
  19. };  
  20. void query()  
  21. {  
  22.     try{  
  23.     //1.与指定数据源建立连接   
  24.     CDatabase db;  
  25.     db.OpenEx("DSN=myds;UID=;PWD=");  
  26.     //2.数据库操作   
  27.     //查询   
  28.     MyRecordSet rs(&db);  
  29.     rs.Open(CRecordset::dynaset,"SELECT * FROM myds",  
  30.         CRecordset::none  
  31.         //CRecordset::readOnly  
  32.         );//发送SQL语句   
  33.     CString id;  
  34.     CString name;  
  35.     while(!rs.IsEOF()){  
  36.         rs.GetFieldValue((short)0,id);  
  37.         rs.GetFieldValue((short)1,name);  
  38.         printf("%s , %s/n",id,name);  
  39.         rs.MoveNext();  
  40.     }  
  41.     //更新--update   
  42.     rs.MoveFirst();  
  43.     rs.Edit();  
  44.     rs.m_name = "zhang";    //因为这里才创建了子类MyRecordSet  
  45.     rs.Update();  
  46.     //第二次查询   
  47.     printf("/n2nd query:/n");  
  48.     rs.m_strFilter = "id>5";  
  49.     rs.Requery();  
  50.     while(!rs.IsEOF()){  
  51.         rs.GetFieldValue((short)0,id);  
  52.         rs.GetFieldValue((short)1,name);  
  53.         printf("%s , %s/n",id,name);  
  54.         rs.MoveNext();  
  55.     }  
  56.     //3.关闭   
  57.     rs.Close();  
  58.     db.Close();  
  59. }  
  60. catch (CDBException *e) {  
  61.     printf("%s",e->m_strError);  
  62. }  
  63. }  
  64. void add()  
  65. {  
  66.     CDatabase db;  
  67.     try{  
  68.         db.OpenEx("DSN=myds;UID=;PWD=");  
  69.         //事务处理   
  70.         db.BeginTrans();  
  71.         db.ExecuteSQL("INSERT INTO myds VALUES(15,'what')");  
  72.         db.ExecuteSQL("INSERT INTO myds VALUES(20,'sss')");  
  73.         db.CommitTrans();  
  74.     }  
  75.     catch (CDBException *e) {  
  76.         printf("%s",e->m_strError);  
  77.         db.Rollback();  
  78.     }  
  79. }  
  80.   
  81. int main()  
  82. {  
  83. //  add();   
  84.     query();  
  85.     return 0;  
  86. }  

原创粉丝点击