PostgreSQL ODBC C 程序示例
下面是 Linux 环境下一个简单的 C 程序示例,通过 psqlodbc 连接到 PostgreSQL 数据库,创建一张表 odbc_table。
1. 配置ODBC数据源
编辑 ODBC 数据源配置文件 ~/.odbc.ini,具体配置信息如下:
[pg] Description = PostgreSQL ODBC Driver = PostgreSQL Database = postgres Servername = 127.0.0.1 UserName = admin Password = 123456 Port = 5432 ReadOnly = -2 ConnSettings = set client_encoding to UTF8
2. 编写C程序
C 程序代码文件 sample.c,如下:
/********************************************************************** * FILENAME : CreateTableWithID.c * * DESCRIPTION : * Simple SQL SERVER example to create a basic table with an * identity field * * ODBC USAGE : * Prompts for table name * SQLExecDirect - to execute CREATE TABLE statement * */ #include <stdio.h> #include <stdlib.h> #include <sql.h> #include <sqlext.h> #include <string.h> #define NAME_LEN 64 #define STMT_LEN 128 #define CHECK_ERROR(e, s, h, t) ({\ if (e!=SQL_SUCCESS && e != SQL_SUCCESS_WITH_INFO) {extract_error(s, h, t); goto exit;} \ }) void extract_error(char *fn, SQLHANDLE handle, SQLSMALLINT type) { SQLINTEGER i = 0; SQLINTEGER NativeError; SQLCHAR SQLState[ 7 ]; SQLCHAR MessageText[256]; SQLSMALLINT TextLength; SQLRETURN ret; fprintf(stderr, "\nThe driver reported the following error %s\n", fn); do { ret = SQLGetDiagRec(type, handle, ++i, SQLState, &NativeError, MessageText, sizeof(MessageText), &TextLength); if (SQL_SUCCEEDED(ret)) { printf("%s:%ld:%ld:%s\n", SQLState, (long) i, (long) NativeError, MessageText); } } while( ret == SQL_SUCCESS ); } int main () { SQLHENV henv = SQL_NULL_HENV; // Environment SQLHDBC hdbc = SQL_NULL_HDBC; // Connection handle SQLHSTMT hstmt = SQL_NULL_HSTMT; // Statement handle SQLRETURN retcode; char sqlStmtCreate[] = "CREATE TABLE odbc_table" "(PersonID int NOT NULL," "FirstName varchar(255) NOT NULL," "LastName varchar(255)," "Address varchar(255), City varchar(255))"; // Allocate an environment handle retcode=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_ENV)", henv, SQL_HANDLE_ENV); // We want ODBC 3 support retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0); CHECK_ERROR(retcode, "SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION)", hdbc, SQL_HANDLE_DBC); // Allocate a connection handle retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); CHECK_ERROR(retcode, "SQLAllocHandle", hdbc, SQL_HANDLE_DBC); // Connect to the DSN retcode=SQLDriverConnect(hdbc, NULL, "DSN=pg;", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE); CHECK_ERROR(retcode, "SQLDriverConnect(DSN=DATASOURCE;)", hdbc, SQL_HANDLE_DBC); // Allocate a statement handle retcode=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); CHECK_ERROR(retcode, "SQLAllocHandle(STMT)", hstmt, SQL_HANDLE_STMT); // Execute CREATE TABLE retcode = SQLExecDirect(hstmt, sqlStmtCreate, SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf ("Table Created\n"); } else { printf ("Table Create Failed : \n"); CHECK_ERROR(retcode, "SQLExecDirect(STMT)", hstmt, SQL_HANDLE_STMT); } exit: printf ("\nComplete.\n"); // Free handles // Statement if (hstmt != SQL_NULL_HSTMT) SQLFreeHandle(SQL_HANDLE_STMT, hstmt); // Connection if (hdbc != SQL_NULL_HDBC) { SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } // Environment if (henv != SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0; }
3. 编译执行
其中关于 PostgreSQL ODBC 环境的编译安装配置见链接:PostgreSQL ODBC 编译安装
# 编译 gcc sample.c -o sample -I/data/zhang/app/unixODBC/include -L/data/zhang/app/unixODBC/lib -lodbc # 执行 [zhang@localhost odbc]$ ./sample Table Created Complete.
文章评论
共0条评论