Ⅰ C/C++用一個連接多線程並發訪問資料庫會不會有問題
加個原子鎖吧,盡量非同步訪問
Ⅱ mysql中能在C程序中通過嵌入式SQL訪問資料庫么
先看結構體
----------------------------------------------
以下代碼塊是用來連接資料庫的通訊過程,要連接MYSQL,必須建立MYSQL實例,通過mysql_init初始化方能開始進行連接.
typedefstructst_mysql{
NETnet;/*Communicationparameters*/
gptrconnector_fd;/*ConnectorFdforSSL*/
char*host,*user,*passwd,*unix_socket,
*server_version,*host_info,*info,*db;
unsignedintport,client_flag,server_capabilities;
unsignedintprotocol_version;
unsignedintfield_count;
unsignedintserver_status;
unsignedlongthread_id;/*Idforconnectioninserver*/
my_ulonglongaffected_rows;
my_ulonglonginsert_id;/*idifinsertontablewithNEXTNR*/
my_ulonglongextra_info;/*Usedbymysqlshow*/
unsignedlongpacket_length;
enummysql_statusstatus;
MYSQL_FIELD*fields;
MEM_ROOTfield_alloc;
my_boolfree_me;/*Iffreeinmysql_close*/
my_boolreconnect;/*setto1ifautomaticreconnect*/
structst_mysql_optionsoptions;
charscramble_buff[9];
structcharset_info_st*charset;
unsignedintserver_language;
}MYSQL;
這個結構代表返回行的一個查詢的(SELECT,SHOW,DESCRIBE,EXPLAIN)的結果。返回的數據稱為「數據集」,用過資料庫的朋友應該對資料庫中查詢後得到的結果集不會陌生,在C的API里對應的就是MYSQL_RES了,從資料庫讀取數據,最後就是從MYSQL_RES中讀取數據。
typedefstructst_mysql_res{
my_ulonglongrow_count;
unsignedintfield_count,current_field;
MYSQL_FIELD*fields;
MYSQL_DATA*data;
MYSQL_ROWS*data_cursor;
MEM_ROOTfield_alloc;
MYSQL_ROWrow;/*Ifunbufferedread*/
MYSQL_ROWcurrent_row;/*buffertocurrentrow*/
unsignedlong*lengths;/*columnlengthsofcurrentrow*/
MYSQL*handle;/*forunbufferedreads*/
my_booleof;/*Usedmymysql_fetch_row*/
}MYSQL_RES;
----------------------------------------------
再看函數:
C語言操作mysql數據常用函數
所需頭文件:#include<mysql/mysql.h>
功能:獲得或初始化一個MYSQL結構
函數原型:MYSQL*mysql_init(MYSQL*mysql)
函數返回值:一個被始化的MYSQL*句柄
備註:在內存不足的情況下,返回NULL
所需頭文件:#include<mysql/mysql.h>
函數功能:關閉一個伺服器連接,並釋放與連接相關的內存
函數原型:voidmysql_close(MYSQL*mysql);
函數傳入值:MYSQL:類型的指針
函數返回值:無
所需頭文件:#include<mysql/mysql.h>
函數功能:連接一個MySQL伺服器
函數原型:MYSQL*mysql_connect(MYSQL*mysql,constchar*host,constchar*user,constchar*passwd);
函數傳入值:mysql表示一個現存mysql結構的地址
host表示MYSQL伺服器的主機名或IP
user表示登錄的用戶名
passwd表示登錄的密碼
函數返回值:如果連接成功,一個MYSQL*連接句柄:如果連接失敗,NULL
備註:該函數不推薦,使用mysql_real_connect()代替
所需文件:#include<mysql/mysql.h>
函數功能:MYSQL*mysql_real_connect(MYSQL*mysql,constchar*host,constchar*user,constchar*passwd,constchar*db,unsignedintport,constchar*unix_socket,unsignedintclient_flag);
函數傳入值:mysql表示一個現存mysql結構的地址
host表示MYSQL伺服器的主機名或IP
user表示登錄的用戶名
passwd表示登錄的密碼
db表示要連接的資料庫
port表示MySQL伺服器的TCP/IP埠
unix_socket表示連接類型
client_flag表示MySQL運行ODBC資料庫的標記
函數返回值:如果連接成功,一個MYSQL*連接句柄:如果連接失敗,NULL
所需頭文件:#include<mysql/mysql.h>
函數功能:返回最新的UPDATE,DELETE或INSERT查詢影響的行數
函數傳入值:MYSQL:類型指針
函數返回值:大於零的一個整數表示受到影響或檢索出來的行數。零表示沒有區配查序中WHERE子句的記錄或目前還沒有查詢被執行;-1表示查詢返回一個錯誤,或對於一個SELECT查詢
所需頭文件:#include<mysql/mysql.h>
函數功能:對指定的連接執行查詢
函數原型:intmysql_query(MYSQL*mysql,constchar*query);
函數傳入值:query表示執行的SQL語句
函數返回值:如果查詢成功,為零,出錯為非零。
相關函數:mysql_real_query
所需頭文件:#include<mysql/mysql.h>
函數功能:為無緩沖的結果集獲得結果標識符
函數原形:MYSQL_RES*mysql_use_result(MYSQL*mysql);
函數傳入值:MYSQL:類型的指針
函數返回值:一個MYSQL_RES結果結構,如果發生一個錯誤發NULL
#incluee<mysql/mysql.h>
檢索一個結果集合的下一行
MYSQL_ROWmysql_fetch_row(MYSQL_RES*result);
MYSQL_RES:結構的指針
下一行的一個MYSQL_ROW結構。如果沒有更多的行可檢索或如果出現一個錯誤,NULL
#include<mysql/mysql.h>
返回指定結果集中列的數量
unsignedintmysql_num_fields(MYSQL_RES*res);
MYSQL_RES結構的指針
結果集合中欄位數量的一個無符號整數
#include<mysql/mysql.h>
創建一個資料庫
intmysql_create_db(MYSQL*mysql,constchar*db);
MYSQL:類型的指針
db:要創建的資料庫名
如果資料庫成功地被創建,返回零,如果發生錯誤,為非零。
#include<mysql/mysql.h>
選擇一個資料庫
intmysql_select_db(MYSQL*mysql,constchar*db);
MYSQL:類型的指針
db:要創建的資料庫名
如果資料庫成功地被創建,返回零,如果發生錯誤,為非零。
----------------------------------------------
再看例子:
很多人用到MySQL來開發一些項目,有時為了性能,我們會直接用C語言來開發相關的模塊,尤其在我們的web應用中,雖然PHP、JSP等腳本均提供了MySQL的介面,但是顯然直接使用C語言具有更好的安全性和性能,Michael以前用PHP開發的多個項目中就使用了C語言編寫的這類介面,然後再編譯到php裡面,供php腳本直接使用,這方面的話題就不多說了,下面主要說一下在linux下如何用C語言連接MySQL資料庫,並且讀取裡面的數據返回,同時如何進行編譯。
這里的大部分代碼參考了MySQL發行包裡面的.c源文件,大家也可以去裡面找找相關的代碼,下面這段代碼實現了連接到本地MySQL伺服器上9tmd_bbs_utf8資料庫,從數據表tbb_user中根據輸入的userid取得該用戶的用戶名並列印輸出到終端。
#ifdefined(_WIN32)||defined(_WIN64)//為了支持windows平台上的編譯
#include<windows.h>
#endif
#include<stdio.h>
#include<stdlib.h>
#include"mysql.h"//我的機器上該文件在/usr/local/include/mysql下
//定義資料庫操作的宏,也可以不定義留著後面直接寫進代碼
#defineSELECT_QUERY"selectusernamefromtbb_userwhereuserid=%d"
intmain(intargc,char**argv)//char**argv相當於char*argv[]
{
MYSQLmysql,*sock;//定義資料庫連接的句柄,它被用於幾乎所有的MySQL函數
MYSQL_RES*res;//查詢結果集,結構類型
MYSQL_FIELD*fd;//包含欄位信息的結構
MYSQL_ROWrow;//存放一行查詢結果的字元串數組
charqbuf[160];//存放查詢sql語句字元串
if(argc!=2){//檢查輸入參數
fprintf(stderr,"usage:mysql_select<userid> ");
exit(1);
}
mysql_init(&mysql);
if(!(sock=mysql_real_connect(&mysql,"localhost","dbuser","dbpwd","9tmd_bbs_utf8",0,NULL,0))){
fprintf(stderr,"Couldn'tconnecttoengine! %s ",mysql_error(&mysql));
perror("");
exit(1);
}
sprintf(qbuf,SELECT_QUERY,atoi(argv[1]));
if(mysql_query(sock,qbuf)){
fprintf(stderr,"Queryfailed(%s) ",mysql_error(sock));
exit(1);
}
if(!(res=mysql_store_result(sock))){
fprintf(stderr,"Couldn'tgetresultfrom%s ",mysql_error(sock));
exit(1);
}
printf("numberoffieldsreturned:%d ",mysql_num_fields(res));
while(row=mysql_fetch_row(res)){
printf("Theruserid#%d'susernameis:%s ",atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0])))?"NULL":row[0]));
puts("queryok! ");
}
mysql_free_result(res);
mysql_close(sock);
exit(0);
return0;//.為了兼容大部分的編譯器加入此行
}
編譯的時候,使用下面的命令
gcc-omysql_select./mysql_select.c-I/usr/local/include/mysql-L/usr/local/lib/mysql-lmysqlclient(-lz)(-lm)後面兩個選項可選,根據您的環境情況
運行的時候,執行下面的命令
./mysql_select1
將返回如下結果:
numberoffieldsreturned:1
Theruserid#1'susernameis:Michael
queryok!
Ⅲ 我們可以通過c/s模式訪問資料庫的應用是哪些
Oracle、Sybase、Informix。伺服器友攜採用高性能的PC、工作站或小型機,並採用大型數據好森伏庫系統,Oracle、Sybase、Informix可以通過cs模式訪問資料庫。資料庫是一個長期存儲在計算機內的、有組織的、可共享的、統一管理的大量數據的春備集合。
Ⅳ C++中ADO訪問資料庫方法
這個過程有點復雜,詳細請參閱孫鑫《VC++深入詳解》最後一章,HOOK和資料庫訪問技術,那裡講得更明白!
#include
<iostream>
#include
<string>
using
namespace
std;
//導入ADO動態鏈接庫,必須的
#import
"c:\行殲program
files\common
files\沖念system\ado\msado15.dll"no_namespace
rename("EOF","adoEOF")
void
main()
{
_ConnectionPtr
m_pConnection;
//創建智能指針,必須的
m_pConnection.CreateInstance(__uuidof(Connection));
//或
m_pConnection.CreateInstance("ADODB.Connection");
CoInitialize(NULL);
//初始化COM,必須的
try
{
//連接字元串,Student為資料庫名
m_pConnection->ConnectionString="Provider=SQLOLEDB.1;Password=sa;Persist
Security
Info=True;User
ID=sa;Initial
Catalog=Student";
m_pConnection->Open("
","
","
",adModeUnknown);
//調用Open方法
cout<<"1"<<endl;
}
catch(_com_error
e)
//捕獲連接異常
{
cout<<"資料庫初始化錯誤!
"<<endl;
return
;
}
cout<<"連接成功!"<<endl;
_RecordsetPtr
pRst(__uuidof(Recordset));
pRst=m_pConnection->Execute("select
*
from
student",NULL,adCmdText);//使檔判沖用Execute方法,student為表名
if(!pRst>adoEOF)
pRst>MoveFirst();
else
{
cout<<"表內數據為空"<<endl;
return;
}
//
讀入庫中各欄位並加入列表框中
_variant_t
var;
string
strName;
while(!pRst>adoEOF)
{
var
=
pRst>GetCollect("Name");
if(var.vt
!=
VT_NULL)
strName
=
(LPCSTR)_bstr_t(var);
pRst>MoveNext();
}
//關閉
pRst->Close();
m_pConnection->Close();
pRst.Release();
m_pConnection->Release();
CoUninitialize();
//釋放COM
}
Ⅳ 外網A電腦如何通過區域網B電腦跳轉訪問C電腦資料庫,C電腦不能上網
遠程桌面連接到B,然後通過B訪問C的資料庫,
不可以遠程塵做桌面,那就用 遠派皮衡程應用平台,連接到B,B事先安裝遠程應用服務端,該軟體收費軟體,需花錢
或者,路由器支持VPN,開啟VPN,握鍵並設置賬號,A電腦通過撥號連接B的VPN,連接到B的網路中,具體請網路搜索 VPN設置
Ⅵ ubuntu下用C語言訪問資料庫出現『mysql_init』未定義的引用的錯誤
只要libmysqlclient.so在/usr/lib/mysql 中,-L/usr/lib/mysql -lmysqlclient 就是link libmysqlclient.so
所以,你應該找一下libmysqlclient.so的安裝位置,比如安裝在/usr/lib/i386-linux-gnu
鏈接libmysqlclient.so,就是-L/usr/lib/i386-linux-gnu -lmysqlclient
另外,這種版編譯出現的問題,權請貼出具體的輸出,不要泛泛的講。泛泛的講別人根本不明白是那裡出了問題。。。
Ⅶ C語言訪問SQLite資料庫報錯
我用sqlite3.7.10都沒有任何問題,不過我沒試過樓主直接用dos的這個方法。
另外就回是自己做的lib文件要放答倒lib文件夾里,sqlite3.dll文件要放到system32文件夾里,64位操作系統要放到syswow64文件夾里,這里要注意並不是每個版本的sqlite3.dll文件都適合自己的機器,我也是試了好多次才成功。
不知道能不能幫到你,剛才是我的全部理解了。
Ⅷ 怎樣用vc++ 6.0訪問SQL Server資料庫
常用VC、MFC訪問資料庫常用的技術是
導入ADO庫
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "adoEOF")
2、用導入的動態庫的指針操作資料庫.
打開資料庫連接
_ConnectionPtr m_pConn; // 資料庫連接指針
// 創建Conneciton對象
m_pConn.CreateInstance(_T("ADODB.Connection"));
用ConnectionPtr 的open方法m_pConn->Open(_bstr_t(m_sConn),
_T(""), _T(""), lOptions));
m_sConn為你連接資料庫的信息,你應該按照你的要求打開資料庫
然後你用打開的那個連接進行操作資料庫。比如
_RecordsetPtr pRec = m_pConn->Execute(_bstr_t(pszSql), NULL, CmdText);
pszSql 就你要操作資料庫的SQL語句。在這個SQL語句里你可以創建表、更新表等。
用ADO訪問的時候要求初始他COM庫和釋放COM對象
// 初始化COM環境(庫)
::CoInitialize(NULL);
//釋放COM對象
::CoUninitialize();
ODBC訪問資料庫
配置ODBC數據源:打開控制面板下的「數據源」,彈出「ODBC數據源管理器」,選擇DSN選項卡-》添加->你選擇你的SQL Server選項,單擊完成。如圖然後你再按照向導提示添加。
代碼中用ODBC訪問資料庫你得加上afxdb.h頭文件,
用CDataBase 類連接資料庫、CRecordSet類查詢記錄。
現在在VC訪問資料庫常用的是ADO訪問,你可以找一下我前面的回答有ADO訪問資料庫的步驟。
CDataBase m_cODBCDb;
用CDataBase類的OpenEx()函數打開資料庫連接。連接字元串你自己構造一下。
定義一個與上面資料庫相關的查詢對象
CRecordSet m_cODBCRec(&m_cODBCDb);
用這個查詢對象的open方法就可以執行SQL語句與資料庫交互了;
Ⅸ c/c++寫伺服器一般用什麼方式訪問資料庫的
要做伺服器端的話資料庫就是放在你的服務盯脊猜器上的, 資料庫會提供相應的訪問介面野逗, 具體使用方式可以搜一下"C++連接資料庫"之類的
http是客戶端訪問伺服器凱型才用得到, 直接操作資料庫的總是伺服器端而不是客戶端