只說下碰到的幾個問題:
1.unixodbc版本不一致的問題。
[08004][unixodbc][oracle][odbc][ora]ora-12154: tns:could not resolve the connect identifier specified
[isql]error: could not sqlconnect
2.資料來源首先查詢系統dsn,找不到再查詢使用者dsn
3.連線遠端oracle服務需要配置正確的tnsname,.odbc.ini中的 servername = 【網路服務名tnsname】
4.oracle自帶的unixodbc預設查詢位置為/etc
5.用unixodbc官網提供的查詢示例進行查詢測試。gcc query.c –o query –i/$(指定)/incude –l$(指定)/lib –lodbc
6.依賴關係:libodbc.so動態開啟驅動 libsqora.so.11.1,驅動libsqora.so.11.1依賴libodbcinst.so
isql依賴libodbc.so,間接依賴驅動libsqora.so.11.1(動態開啟的)。
c客戶端依賴libodbc.so,間接依賴驅動libsqora.so.11.1(動態開啟的)。
7.query.c原始碼:
#include #include #include #include #include sqlhenv v_od_env; // handle odbc environment
long v_od_erg; // result of functions
sqlhdbc v_od_hdbc; // handle connection
char v_od_stat[10]; // status sql
sqlinteger v_od_err;
sqllen v_od_len;
sqlinteger v_od_id;
sqllen v_od_rowanz;
sqlsmallint v_od_mlen,v_od_colanz;
char v_od_msg[200],v_od_buffer[200];
sqlhstmt v_od_hstmt;
int main(int argc,char *argv)
v_od_erg=sqlsetenvattr(v_od_env, sql_attr_odbc_version, (void*)sql_ov_odbc3, 0);
if ((v_od_erg != sql_success) && (v_od_erg != sql_success_with_info))
v_od_erg = sqlallochandle(sql_handle_dbc, v_od_env, &v_od_hdbc);
if ((v_od_erg != sql_success) && (v_od_erg != sql_success_with_info))
sqlsetconnectattr(v_od_hdbc, sql_login_timeout, (sqlpointer *)5, 0);
v_od_erg = sqlconnect(v_od_hdbc, (sqlchar*) "zyx", sql_nts,
(sqlchar*) "cbadevdb", sql_nts,
(sqlchar*) "cbadevdb", sql_nts);
if ((v_od_erg != sql_success) && (v_od_erg != sql_success_with_info))
printf("connected !\n");
v_od_erg=sqlallochandle(sql_handle_stmt, v_od_hdbc, &v_od_hstmt);
if ((v_od_erg != sql_success) && (v_od_erg != sql_success_with_info))
sqlbindcol(v_od_hstmt,1,sql_c_char, &v_od_buffer,150,&v_od_len);
sqlbindcol(v_od_hstmt,2,sql_c_ulong,&v_od_id,150,&v_od_len);
v_od_erg=sqlexecdirect(v_od_hstmt,"select name,id from stu order by id",sql_nts);
if ((v_od_erg != sql_success) && (v_od_erg != sql_success_with_info))
v_od_erg=sqlnumresultcols(v_od_hstmt,&v_od_colanz);
if ((v_od_erg != sql_success) && (v_od_erg != sql_success_with_info))
printf("number of columns %d\n",v_od_colanz);
v_od_erg=sqlrowcount(v_od_hstmt,&v_od_rowanz);
if ((v_od_erg != sql_success) && (v_od_erg != sql_success_with_info))
printf("number of rows %d,%d\n",v_od_rowanz,v_od_erg);
v_od_erg=sqlfetch(v_od_hstmt);
while(v_od_erg != sql_no_data)
;sqlfreehandle(sql_handle_stmt,v_od_hstmt);
sqldisconnect(v_od_hdbc);
sqlfreehandle(sql_handle_dbc,v_od_hdbc);
sqlfreehandle(sql_handle_env, v_od_env);
return(0);
}
Visual C 中的ODBC程式設計
一 mfc提供的odbc資料庫類 visual c 的mfc基類庫定義了幾個資料庫類。在利用odbc程式設計時,經常要使用到 cdatabase 資料庫類 crecordset 記錄集類 和crecordview 可視記錄集類 cdatabase類物件提供了對資料來源的連線,通過它可以對資料來源進行...
Visual C 中的ODBC程式設計
microsoft developer studio為大多數標準的資料庫格式提供了32位odbc驅動器。這些標準資料格式包括有 sql server access paradox dbase foxpro excel oracle以及microsoft text。如果使用者希望使用其他資料格式,則需...
Oracle的32位ODBC驅動
最近需要powerdesigner逆向工程,資料庫是64位的oracle。但是pd只能使用32位的odbc驅動程式。折騰半天,特此留念。參考文章 將instantclient basic和instantclient odbc解壓到同一資料夾下。如f instantclient 12 2 因為我已經安...