c语言怎样连接数据库?
发布网友
发布时间:2022-03-23 23:40
我来回答
共3个回答
热心网友
时间:2022-03-24 01:10
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);
}
热心网友
时间:2022-03-24 02:28
你要连什么数据库啊?
各种数据库的连接方法是不一样的。
oracle,mysql,sqlserver,sqlite,db2等等。很多种。
其中sqlite使用c写的,开源,可以放到你自己的程序中。
要是想研究一下数据库的话,可以看他。
热心网友
时间:2022-03-24 04:02
哥们自己看吧。。。。附一源码
CWinApp theApp;
using namespace std;
CHmbAdoDBRs RfRst;
CString sSql;
CString seq, body, eng, tm, tl, icol, ecol, alc, bhmcdate;
int i;
BOOL DbOpen();
BOOL CkseqtmpSelect();
BOOL CkseqtmpUpdate();
int PrintStatus();
int SockInit();
CHmbAdoDB Sqldb;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int cnt = 0;
int nRetCode = 0;
int page = 1;
int prt_ret;
CString strDate, strTime;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetMoleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
//DataBase Open...
if(DbOpen()) cout << "DataBase Open Open Ok" << endl;
else {
cout << "DataBase Open Error\n" << endl;
return -1;
}
while( 1 ) {
ret = SockInit(); //建立socket连接
if ( ret < 0 ) Sleep(3000);
else break;
}
while( 1 ) {
if ( CkseqtmpSelect() == FALSE ) { // CKSEQTMP FLAG03='0' SELECT
Sleep(3000);
continue;
}
while( 1 ) { // PRINTER STATUS Check
prt_ret = PrintStatus();
if ( prt_ret == 1 ) {
closesocket(sid);
WSACleanup();
while( 1 ) {
ret = SockInit();
if ( ret < 0 ) Sleep(3000);
else break;
}
break;
}
else {
printf("Printer Status Check !!!\n");
Sleep(3000);
}
}
printf("%s-%s-%s-%s-%s-%s-%s-%s-%s\n", seq, body, eng, tm, tl, icol, ecol, alc, bhmcdate);
memset(sbuf, 0x00, sizeof(sbuf));
sprintf(sbuf, "%c%c1", ESC, W);
ret = send( sid, sbuf, strlen(sbuf), 0 );
if ( cnt == 0 || atoi(seq) < 2 ) {
if ( atoi(seq) < 2 ) {
cnt = 0;
page = 1;
memset(sbuf, 0x00, sizeof(sbuf));
sprintf(sbuf, "%c%c%c", FF, CR, LF);
ret = send( sid, sbuf, strlen(sbuf), 0 );
}
memset(sbuf, 0x00, sizeof(sbuf));
sprintf(sbuf, " [ BUMPER ASS'Y WORK ORDER ]%c%c%c%c%c%c", CR, LF, CR, LF, CR, LF);
ret = send( sid, sbuf, strlen(sbuf), 0 );
strDate.Format("%s-%s-%s", bhmcdate.Left(4), bhmcdate.Mid(4,2), bhmcdate.Mid(6,2) );
memset(sbuf, 0x00, sizeof(sbuf));
sprintf(sbuf, " PAGE : %3d DATE : %s%c%c", page, strDate, CR, LF);
ret = send( sid, sbuf, strlen(sbuf), 0 );
memset(sbuf, 0x00, sizeof(sbuf));
// 123456789/123456789/123456789/123456789/123456789/1234567890123456789012345678901234567890
sprintf(sbuf, "========================================================%c%c", CR, LF);
ret = send( sid, sbuf, strlen(sbuf), 0 );
memset(sbuf, 0x00, sizeof(sbuf));
sprintf(sbuf, " SEQ BODY NO BUMP ECOL T/L ENG BHMCTIME%c%c%c%c", CR, LF, CR, LF);
ret = send( sid, sbuf, strlen(sbuf), 0 );
memset(sbuf, 0x00, sizeof(sbuf));
sprintf(sbuf, "========================================================%c%c", CR, LF);
ret = send( sid, sbuf, strlen(sbuf), 0 );
}
strTime.Format("%s:%s", bhmcdate.Mid(8,2), bhmcdate.Mid(10,2) );
memset(sbuf, 0x00, sizeof(sbuf));
sprintf(sbuf, " %-4.4s %-10.10s %-4.4s %-3.3s %-4.4s %-4.4s %-5.5s%c%c%c%c",
seq, body, alc, ecol, tl, eng, strTime, CR, LF, CR, LF);
ret = send( sid, sbuf, strlen(sbuf), 0 );
memset(sbuf, 0x00, sizeof(sbuf));
sprintf(sbuf, "--------------------------------------------------------%c%c", CR, LF);
ret = send( sid, sbuf, strlen(sbuf), 0 );
prt_ret = PrintStatus();
if ( prt_ret == 1 ) {
for ( i=0; i<3; i++ ) {// CKSEQTMP FLAG03 UPDATE
if ( CkseqtmpUpdate() == TRUE ) break;
else Sleep(1000);
}
cnt = cnt + 1;
if ( cnt > 7) { // 8 LINE PRINT
memset(sbuf, 0x00, sizeof(sbuf));
sprintf(sbuf, "%c%c%c", FF, CR, LF);
ret = send( sid, sbuf, strlen(sbuf), 0 );
page = page + 1;
cnt = 0;
}
}
else {
printf("Printer Status Check !!!\n");
}
Sleep(3000);
}
closesocket(sid);
WSACleanup();
Sqldb.Close();
return nRetCode;
}
//////////////////////////////////////////////////////////////////////
// DB OPEN
BOOL DbOpen()
{
if(Sqldb.Open("DSN=bjmole;UID=sa;PWD=bjmole")) {
Sqldb.m_bOpen = TRUE;
return TRUE;
}
else {
return FALSE;
}
}
/////////////////////////////////////////////////////////////////////////////
// CKSEQTMP FLAG03='0' SELECT