| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1250 人关注过本帖
标题:ODBC连接MySQL, 执行基本的SQL语句
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
结帖率:94.72%
收藏
 问题点数:0 回复次数:0 
ODBC连接MySQL, 执行基本的SQL语句
程序代码:
// Connecting_with_SQLConnect.cpp
// compile with: user32.lib odbc32.lib
#include <windows.h>
#include <sqlext.h>
#include <mbstring.h>
#include <stdio.h>
#include <sqltypes.h>

#define MAX_DATA 100
#define MYSQLSUCCESS(rc) ((rc == SQL_SUCCESS) || (rc == SQL_SUCCESS_WITH_INFO) )

class direxec {
   RETCODE rc; // ODBC return code
   HENV henv; // Environment   
   HDBC hdbc; // Connection handle
   HSTMT hstmt; // Statement handle

   unsigned char szData[MAX_DATA]; // Returned data storage
   SDWORD cbData; // Output length of data
   unsigned char chr_ds_name[SQL_MAX_DSN_LENGTH]; // Data source name

public:
   direxec(); // Constructor
   void sqlconn(); // Allocate env, stat, and conn
   void sqlexec(); // Execute SQL statement
   void sqldisconn(); // Free pointers to env, stat, conn, and disconnect
   void error_out(); // Displays errors
};

// Constructor initializes the string chr_ds_name with the data source name.
// "Northwind" is an ODBC data source (odbcad32.exe) name whose default is the Northwind database
direxec::direxec() {
   _mbscpy_s(chr_ds_name, SQL_MAX_DSN_LENGTH, (const unsigned char *)"helloworld");
}

// Allocate environment handle and connection handle, connect to data source, and allocate statement handle.
void direxec::sqlconn() {
   SQLAllocEnv(&henv);
   SQLAllocConnect(henv, &hdbc);
   rc = SQLConnect(hdbc, chr_ds_name, SQL_NTS, NULL, 0, NULL, 0);

   // Deallocate handles, display error message, and exit.
   if (!MYSQLSUCCESS(rc)) {
      SQLFreeConnect(henv);
      SQLFreeEnv(henv);
      SQLFreeConnect(hdbc);
      if (hstmt)
         error_out();
      exit(-1);
   }

   rc = SQLAllocStmt(hdbc, &hstmt);
}

// Execute SQL command with SQLExecDirect() ODBC API.
void direxec::sqlexec() {

    SQLLEN mAffectCount;
    SQLSMALLINT mColCount;

    rc = SQLExecDirect(hstmt, (SQLCHAR*)"INSERT INTO city values (1, 'HeFei', 'IDN', 'AnHui', 10001)", SQL_NTS);
    rc = SQLExecDirect(hstmt, (SQLCHAR*)"INSERT INTO city values (2, 'BengBu', 'IDN', 'AnHui', 10002)", SQL_NTS);
    rc = SQLExecDirect(hstmt, (SQLCHAR*)"INSERT INTO city values (3, 'SuZhou', 'IDN', 'AnHui', 10003)", SQL_NTS);
    rc = SQLExecDirect(hstmt, (SQLCHAR*)"UPDATE  city SET Name = 'HuaiNan' WHERE Name = 'HeFei'", SQL_NTS);
    rc = SQLExecDirect(hstmt, (SQLCHAR*)"DELETE FROM city WHERE Name = 'HuaiNan'", SQL_NTS);

    SQLRowCount(hstmt,&mAffectCount);
    SQLNumResultCols(hstmt,&mColCount);
    SQLCloseCursor(hstmt);
    SQLFreeStmt(hstmt, SQL_UNBIND);

    rc = SQLExecDirect(hstmt, (SQLCHAR*)"SELECT * FROM city", SQL_NTS);
    SQLRowCount(hstmt,&mAffectCount);
    SQLNumResultCols(hstmt,&mColCount);

    int ColIndex;
    char Col[100][2048] = {0};
    SQLCHAR    ColName[100][2048] = {0};
    SQLLEN mCollocate[100] = {0};

    for (ColIndex=0;ColIndex<mColCount;ColIndex++) 
    {
        SQLBindCol(hstmt,ColIndex+1,SQL_C_CHAR,Col[ColIndex],2048,&mCollocate[ColIndex]);
        SQLDescribeCol(hstmt,ColIndex+1,ColName[ColIndex],30,NULL,NULL,NULL,NULL,NULL);
    }

    puts("SQLFetch");

    while ((rc = SQLFetch(hstmt)) != SQL_NO_DATA) 
    {
        printf("%s %s %s %s %s\n", Col[0], Col[1], Col[2], Col[3], Col[4]);
    }

    SQLCloseCursor(hstmt);
    SQLFreeStmt(hstmt, SQL_UNBIND);

    rc = SQLExecDirect(hstmt, (SQLCHAR*)"SELECT * FROM city", SQL_NTS);
    SQLRowCount(hstmt,&mAffectCount);
    SQLNumResultCols(hstmt,&mColCount);

    puts("\nSQLGetData");
    memset(Col, 0, 100*2048*sizeof(char));

    for (int RowIndex=0;RowIndex<mAffectCount;RowIndex++)
    {
        SQLFetch(hstmt);

        for (int ColIndex=0;ColIndex<mColCount;ColIndex++)
        {
            int    TotalGet = 0;
            SQLLEN LenData = 0;
            int    Ret    = 0;

            while(Ret=SQLGetData(hstmt, ColIndex+1, SQL_C_CHAR,Col[ColIndex]+TotalGet,200000,&LenData)!=SQL_NO_DATA)
            {
                break;
            }
        }

        printf("%s %s %s %s %s\n", Col[0], Col[1], Col[2], Col[3], Col[4]);
    }
}

// Free the statement handle, disconnect, free the connection handle, and free the environment handle.
void direxec::sqldisconn() {
   SQLFreeStmt(hstmt,SQL_DROP);
   SQLDisconnect(hdbc);
   SQLFreeConnect(hdbc);
   SQLFreeEnv(henv);
}

// Display error message in a message box that has an OK button.
void direxec::error_out() {
   unsigned char szSQLSTATE[10];
   SDWORD nErr;
   unsigned char msg[SQL_MAX_MESSAGE_LENGTH + 1];
   SWORD cbmsg;

   while (SQLError(0, 0, hstmt, szSQLSTATE, &nErr, msg, sizeof(msg), &cbmsg) == SQL_SUCCESS) {
      sprintf_s((char *)szData, sizeof(szData), "Error:\nSQLSTATE=%s, Native error=%ld, msg='%s'", szSQLSTATE, nErr, msg);
      MessageBox(NULL, (const char *)szData, "ODBC Error", MB_OK);
   }
}

int main () {
   direxec x;   // Declare an instance of the direxec object.
   x.sqlconn();   // Allocate handles, and connect.
   x.sqlexec();   // Execute SQL command
   x.sqldisconn();   // Free handles and disconnect
   getchar();
}


[此贴子已经被作者于2016-1-11 11:41编辑过]

搜索更多相关主题的帖子: color 
2016-01-09 12:03
快速回复:ODBC连接MySQL, 执行基本的SQL语句
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031900 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved