codbc連接資料庫
1、配置ODBC數據源。
2、使用SQL函數進行連接。
對於1、配置數據源,配置完以後就可以編程操作資料庫了。
對於2、使用SQL函數進行連接,參考代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
void main()
{
HENV henv; //環境句柄
HDBC hdbc; //數據源句柄
HSTMT hstmt; //執行語句句柄
unsigned char datasource[]="數據源名稱"; //即源中設置的源名稱
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
, &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身份驗證,第二、三參數可以是
⑵ c語言怎樣連接資料庫
1、配置ODBC數據源。
2、使用SQL函數進行連接。
對於1、配置數據源,配置完以後就可以編程操作資料庫了。
對於2、使用SQL函數進行連接,參考代碼如下:
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
void main()
{
HENV henv; //環境句柄
HDBC hdbc; //數據源句柄
HSTMT hstmt; //執行語句句柄
unsigned char datasource[]="數據源名稱"; //即源中設置的源名稱
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
, &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身份驗證,第二、三參數可以是
,也可以是任何字串
//SQL_NTS 即 "
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);
//遍歷結果集到相應緩沖區 queryData
SQLFetch(hstmt);
/*
*對遍歷結果的相關操作,如顯示等
*/
//注意釋放順序,否則會造成未知錯誤!
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
⑶ 我用VC程序建立ODBC方式資料庫連接,用CRecordSet關聯了兩個表,請問我這么向資料庫中插入數據。
CDatabase類用與和資料庫進行連接、斷開、插入...的操作。
CRecordSet類用與在資料庫中讀取數據。
你想向資料庫中插入數據,就用CDatabase類就可以了。
SQL語句你知道嗎?就是「insert into」什麼的。
例如:
CDatabase* m_Database;
//你已經和資料庫連接上了是嗎?沒有的話先連接上。
// m_Database->OpenEx(str, CDatabase::noOdbcDialog));
// str 是數據源。
//然後就向庫中插入數據吧!
CString strSQL;
strSQL.Format("//一條SQL語句,就是insert into");
m_Database->ExecuteSQL(strSQL);
//這樣就OK了。
⑷ 請問如何配置ODBC連接遠程的SQL Server資料庫
這好像不是你資料庫設置的問題,而是區域網的問題,你試試看,在控制面板>管理工具>本地安全策略,中啟動你和對方的guest帳號,網路訪問方式改為經典-本地訪問 ,在拒絕從網路訪問這台計計算機中刪除所有的,拒絕做為伺服器登陸中清空所有的,然後關閉windows防火牆,
區域網內winXP(professional)的訪問是個經常困擾大家的不大不小的問題,上次說我不夠詳細,你現在可以按以下的方法試一下,如果不成功,也可照此方法來解決區域網中經常出現的莫名奇妙的錯誤!!!我也是做DBMS的,出現的很多問題,貌似資料庫故障,其實不然!!
一、首先啟用guest來賓帳戶;
二、控制面板→管理工具→本地安全策略→本地策略→用戶權利指派里,「從網路訪問此計算機」中加入guest帳戶,而「拒絕從網路訪問這台計算機」中刪除guest帳戶;
三、我的電腦→工具→文件夾選項→查看→去掉「使用簡單文件共享(推薦)」前的勾;
四、設置共享文件夾;
五、控制面板→管理工具→本地安全策略→本地策略→安全選項里,把「網路訪問:本地帳戶的共享和安全模式」設為「僅來賓-本地用戶以來賓的身份驗證」(可選,此項設置可去除訪問時要求輸入密碼的對話框,也可視情況設為「經典-本地用戶以自己的身份驗證」);
六、右擊「我的電腦」→「屬性」→「計算機名」,該選項卡中有沒有出現你的區域網工作組名稱,如「work」等。然後單擊「網路 ID」按鈕,開始「網路標識向導」:單擊「下一步」,選擇「本機是商業網路的一部分,用它連接到其他工作著的計算機」;單擊「下一步」,選擇「公司使用沒有域的網路」;單擊「下一步」按鈕,然後輸入你的區域網的工作組名,如「work」,再次單擊「下一步」按鈕,最後單擊「完成」按鈕完成設置。
一般經過以上步驟,基本可以解決。如果不行,再往下看:
七、檢查本地連接是否被禁用,右擊「本地連接」→「啟用」;
八、關閉網路防火牆;
九、檢查是否啟用了域,是否加入了該域並檢查域設置;
十、檢查是否關閉了server服務;
十一、檢查本地連接IP、子網掩碼、網關及DNS設置是否有誤;
十二、「本地連接」→屬性→常規,檢查是否安裝了「Microsoft網路文件和列印機共享」、「Microsoft網路客戶端」以及TCP/IP協議;
十三、某些區域網游戲和軟體須安裝NetBEUI協議。而且網上有文章說,在小型區域網中,微軟在WinXP中只支持的TCP/IP協議和NWLink IPX/SPX/NetBIOS兼容協議表現不盡如人意,在小型區域網(擁有200台左右電腦的網路)中NetBEUI是佔用內存最少、速度最快的一種協議。
安裝方法:
①放入Windows XP安裝光碟,到「valueaddMsft et etbeui」目錄下將Netnbf.inf復制C:\Windows\INF中;
②將Nbf.sys復制到C:\Windows\System32\Drivers中;
③開始→控制面板→網上鄰居」→「網路連接」→「本地連接」(就是你目前使用中的區域網連接)上按右鍵→「屬性」→「常規」→「安裝」→「通訊協議」→→「添加」,此時就可以看到「NetBEUI Protocol」這一項(此項原來是沒有的),選取NetBEUI之後,按確定就OK了。
十四、作為網路瀏覽伺服器的電腦由於病毒、配置低運行慢以及死機等原因導致網路上的計算機列表得不到更新,使得某些機器有時候在網上鄰居中找不到。
解決辦法:最簡單的辦法是重啟各種網路設備和電腦,或者關閉個別有上述問題的電腦上的網路瀏覽伺服器功能,方法如下:
win2000/XP下禁用Computer Browser服務
十五、給系統打上補丁。WinXP訪問網上鄰居的速度較慢,這是WinXP的一個Bug,當我們打開網上鄰居時,操作系統首先會從計劃任務中進行查找,因此就大大影響了訪問的速度,除非您已經安裝了SP1補丁才不會存在這個問題。
可以手工解決這一問題。從注冊表中找到「\HKEY_LOCAL_MACHINE\
SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\NameSpace」,這里有一個名為「{D6277990-4C6A-11CF-8D87-00AA0060F5BF}」的子鍵,該子鍵指向「計劃任務(Scheled Tasks)」,將它直接刪除即可。
十六、先卸載網卡驅動,重啟再重裝;
十七、硬體問題,檢查網卡、網線、集線器、路由器等,在檢查之前,最好先重啟一下網路設備(集線器、交換機、路由器)看能否解決;
十八、病毒(木馬)原因。升級病毒庫安全模式下全盤殺毒。
⑸ C++如何連接ODBC
#ifdef WIN32
#include <windows.h>
#include <odbcinst.h>
#include <sqlext.h>
#else
#include <mysql.h>
#include <unistd.h>
#define SQLHANDLE static MYSQL
#endif
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
SQLHANDLE hDBEnv, hDBC;
int DB_Open(char * dbcn, char * usr, char * pwd)
{
int r;
#ifdef WIN32
r = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hDBEnv);
if(r) return 0;
r = SQLSetEnvAttr(hDBEnv,SQL_ATTR_ODBC_VERSION,
(void*)SQL_OV_ODBC3,0);
if(r) return 0;
r = SQLAllocHandle(SQL_HANDLE_DBC, hDBEnv, &hDBC);
if(r) return 0;
r = SQLConnect(hDBC,
(unsigned char *)dbcn, strlen(dbcn),
(unsigned char *)usr, strlen(usr),
(unsigned char *)pwd, strlen(pwd));
return r==SQL_SUCCESS || r==SQL_SUCCESS_WITH_INFO;
#else
mysql_init(&hDBC);
MYSQL * rx = mysql_real_connect(
&hDBC, dbcn, usr, pwd, NULL, 0, NULL, 0);
if(!rx) return 0;
return 1;
#endif
}//end DB_Open
int DB_Exec(char * sql)
{
#ifdef WIN32
SQLHANDLE hStatement = NULL;
SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStatement);
SQLExecDirect(hStatement,(unsigned char *)sql, strlen(sql));
SQLCloseCursor(hStatement);
SQLFreeHandle(SQL_HANDLE_STMT, hStatement);
hStatement = NULL;
#else
mysql_real_query (&hDBC, sql, strlen(sql));
#endif
return 1;
}//end DB_Exec
int DB_Close(void)
{
#ifdef WIN32
SQLDisconnect(hDBC);
SQLFreeHandle(SQL_HANDLE_DBC, hDBC);
SQLFreeHandle(SQL_HANDLE_ENV, hDBEnv);
#else
mysql_close(&hDBC);
#endif
return 1;
}//DB_Close()
#ifndef WIN32
typedef struct tagMySQLRecordset {
MYSQL_RES * hRecord;
void * * row;
int * size;
int cols;
} MYSQLRecordset;
#endif
void DB_CleanQuery(void *hRecordset)
{
if(!hRecordset) return;
#ifdef WIN32
__try {
SQLCloseCursor(hRecordset);
SQLFreeHandle(SQL_HANDLE_STMT, hRecordset);
hRecordset = NULL;
}__finally{
return;
}//end try
#else
MYSQLRecordset * hRec = (MYSQLRecordset *) hRecordset;
mysql_free_result (hRec->hRecord);
free(hRec->row); hRec->row = NULL;
free(hRec->size); hRec->size = NULL;
free(hRec); hRec = NULL;
#endif
}//end DB_CleanQuery
int DB_Next(void * hRecordset)
{
int r=0; if(!hRecordset) return 0;
#ifdef WIN32
r = SQLFetch(hRecordset);
r = r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO;
if(!r) {
DB_CleanQuery(hRecordset);
}//end if
#else
MYSQLRecordset * hRec = (MYSQLRecordset *) hRecordset;
MYSQL_ROW row = mysql_fetch_row (hRec->hRecord);
if(row) {
for(int i=0; i<hRec->cols; i++) {
memcpy(hRec->row[i], row[i], hRec->size[i]);
}//next i
r = 1;
}else{
DB_CleanQuery(hRecordset);
r = 0;
}//end if
#endif
return r;
}//end DB_Next
int DB_params_count(const char * fmt)
{
int i=0, j=0;
while(fmt[i]) {
if(fmt[i]=='%') j++;
i++;
}//end while
return j;
}//end DB_params_count
void * DB_Query(char *sql, const char *fmt, ...)
{
int r=0;
int cols = DB_params_count(fmt);
if(cols<1) return NULL;
#ifdef WIN32
SQLHANDLE hStatement = NULL;
SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStatement);
r = SQLExecDirect(hStatement,(unsigned char *)sql, strlen(sql));
r = r==SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO;
if(!r) {
return NULL;
}//end if
#else
r = mysql_real_query (&hDBC, sql, strlen(sql));
if(r) return NULL;
MYSQL_RES * rec = NULL;
rec = mysql_store_result (&hDBC);
if(!rec) return NULL;
MYSQLRecordset * hStatement
= (MYSQLRecordset *)malloc(sizeof(MYSQLRecordset));
if(!hStatement) return NULL;
memset(hStatement, 0, sizeof(MYSQLRecordset));
hStatement->hRecord = rec;
hStatement->cols = cols;
hStatement->row = (void **)malloc(cols * sizeof(void *));
memset(hStatement->row, 0, cols * sizeof(void *));
hStatement->size = (int *)malloc(cols * sizeof(int));
memset(hStatement->size, 0, cols * sizeof(int));
#endif
va_list ap; va_start(ap, fmt);
void * var; char buf[32];
int i=0,j=0,k=0,sz=0; char c=0;
int len = strlen(fmt); int bad=1;
#ifdef WIN32
int col=1;
#else
int col=0;
#endif
while(fmt[i]) {
c = fmt[i++];
if(c != '%') continue;
c = fmt[i++];
var = va_arg(ap, void *);
if(c == 'd') {
#ifdef WIN32
SQLBindCol(hStatement, col, SQL_C_SLONG, var, 4,NULL);
#else
hStatement->row[col] = var;
hStatement->size[col] = sizeof(long);
#endif
col++;
continue;
}//end if
if(c == 'f') {
#ifdef WIN32
SQLBindCol(hStatement, col, SQL_C_FLOAT, var, 4,NULL);
#else
hStatement->row[col] = var;
hStatement->size[col] = sizeof(float);
#endif
col++;
continue;
}//end if
memset(buf, 0, 32); bad=1;
for(j=i-1; j<len; j++) {
c = fmt[j];
if(c>='0' && c<='9') buf[j-i+1]=c;
if(c=='s') {bad=0; k=j+1; break;}
}//next j
if(bad) return NULL;
sscanf(buf, "%d", &sz);
#ifdef WIN32
SQLBindCol(hStatement, col, SQL_C_CHAR, var, sz, NULL);
#else
hStatement->row[col] = var;
hStatement->size[col] = sz;
#endif
col++;
i = k;
}//end while
va_end(ap);
return hStatement;
}//end DB_Rec
⑹ C++如何連接ODBC
private System.Data.SqlClient.SqlConnection getConnection(){
System.Data.SqlClient.SqlConnection conn=new System.Data.SqlClient.SqlConnection("server=.;uid=sa;pwd=8912737;database=ddd");
return conn;
}
public bool checkUser(string name,string pwd){
bool boo=false;
System.Data.SqlClient.SqlConnection conn=this.getConnection();
string sql=string.Format("select * from UserInfo where LoginName='{0}'",name);
System.Data.SqlClient.SqlDataAdapter adap=new System.Data.SqlClient.SqlDataAdapter(sql,conn);
System.Data.DataSet ds=new System.Data.DataSet();
adap.Fill(ds);
if(ds.Tables[0].Rows.Count!=0 && ds.Tables[0].Rows[0][2].Equals(pwd))
{
boo=true;
}
return boo;
}
private static string conn="server=.;database=資料庫名字;integrated security=sspi";
這就是連接資料庫的字元串
sqlconnection cn=new sqlconnection(conn);
sqlcommand cmd=new sqlcommand(sql語句,cn);
就ok了
也可以不用sqlcommand,用SqlDataAdapter
⑺ 請教一個ODBC連接progress資料庫的問題
Windows 客戶端:
1、在 C:\windows\system32\drivers\etc\services 文件中加入一行:
merant 50000/tcp # merant ODBC
註:這跟上面在 Linux 伺服器中的配置是一樣的,必須與伺服器端一致,上面使用了 50000 埠,這里也使用 50000 埠。
2、配置數據源,添加一個數據源,各選項參數如下:
[General]
Data Source Name:給數據源取名,便於在程序中引用
Description:數據源描述說明,隨便寫
Database Name:資料庫的名字,比如 mfgprod
User ID:可不填(這個用戶名是 Progress 資料庫自己的用戶名,不是 Windows 或 Linux 用戶,也不是 MFG/PRO 用戶,如果資料庫設置為拒絕匿名訪問的話就要填寫)
[Oid/Oib Options]
Protocol:TCP (連接類型,就是你在 services 文件中設定的連接類型)
Service Name:埠名稱,在 services 文件中加的 merantODBC 的埠名稱,如 merant(其實直接用埠號也可以,這樣就不用在 services 文件中定義埠了)
Host Name:伺服器的名稱或IP(建議用IP,否則還要在 hosts 文件中加解析)
[Database Options]
Database Access Mode:Via Server (連接方式,分 Direct 和 Via Server,最好使用 Via Server,如果使用 Direct 的話,直接在 Database path 里填入資料庫所在的物理路徑即可,以下各項不需再填)
Protocol:TCP (這里應該是你資料庫的埠類型,我還沒弄清楚,一般填 TCP 即可)
Service Name:啟動資料庫的埠名(注意,這是你的資料庫本身的埠名,即你在伺服器端用 mfgutil 工具所設定的埠,不要問我 mfgutil 怎麼用,實在不知道,可以查看一下資料庫在 MFG/PRO 里對應的 .pf 文件,裡面有寫的)
Host Name: 伺服器的名稱或IP(推薦IP)
最後,點 Test Connect 測試連接即可,成功的話會顯示 Connect establish。
其實用 ODBC 連接 Progress 並不復雜,總的來說就是在伺服器端啟動 ODBC 服務,然後在客戶端使用 ODBC 軟體連接,而其它的步驟只是為了方便它而已,比如定義埠,或者添加搜索路徑(沒多大影響,本教程中省略此步)等,最關鍵就是要在伺服器端成功啟動 ODBC。
⑻ ODBC 連接資料庫
學編程千萬別用數據源,下面是純SDK寫法。看一下終身受益
首先應該導入:#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")
具體操作如下:
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connection));
pConn.CreateInstance("ADODB.connection");
CString conn="Provider=microsoft.jet.oledb.4.0;data source=txl.mdb"
if(FAILED(pConn->Open((_bstr_t)conn,"","",-1)))
{
AfxMessageBox("連接失敗");
return;
}
pConn->Close();
pConn.Release();
CoUninitialize();
⑼ c語言程序通過ODBC連接Oracle資料庫
參考答案: 東飛伯勞西飛燕,黃姑織女時相見。