[C语言]如何连接数据库并进行查询? (c 数据库连接 查询)

在软件开发的过程中,大多数应用程序需要与数据库进行交互,用来存储和检索数据。对于学习C语言的开发者来说,掌握如何连接数据库并进行查询是至关重要的。本篇文章将介绍如何使用C语言连接数据库和执行简单查询。

连接数据库

为了在C语言中连接数据库,我们需要加载ODBC库。ODBC(Open Database Connectivity,开放数据库连通性)是一种API(应用程序接口),可提供在不同操作系统和数据库系统之间进行数据交互的标准化界面。我们需要在代码中引入odbcinst.h和sql.h这两个头文件。odbcinst.h是用于ODBC配置的头文件,而sql.h是ODBC的主头文件。

接下来,我们需要创建一个ODBC环境句柄(environment handle)并分配资源。然后,我们需要创建一个连接句柄(connection handle)并分配资源。这些句柄是ODBC API中的重要概念,主要用于管理数据库连接。在创建连接句柄后,我们需要使用SQLDriverConnect函数对数据库进行连接。

下面是代码示例:

“`

#include

#include

#include

#include

#include

SQLHENV env = NULL;

SQLHDBC dbc = NULL;

SQLHSTMT stmt = NULL;

SQLRETURN ret;

SQLCHAR outstr[1024];

SQLALLINT outstrlen;

int mn() {

// Allocate environment handle

ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);

// Set the ODBC version environment attribute

ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

// Allocate connection handle

ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);

// Connect to data source

ret = SQLDriverConnect(dbc, NULL, “DSN=dsn_name;UID=user_name;PWD=password”, SQL_NTS, outstr,

sizeof(outstr), &outstrlen, SQL_DRIVER_COMPLETE);

// Allocate statement handle

ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

// …

// Cleanup

SQLFreeHandle(SQL_HANDLE_STMT, stmt);

SQLDisconnect(dbc);

SQLFreeHandle(SQL_HANDLE_DBC, dbc);

SQLFreeHandle(SQL_HANDLE_ENV, env);

return 0;

}

“`

在上面的示例中,SQLDriverConnect函数的第三个参数包含了连接数据库所需的信息,具体包括数据源名称(DSN)、用户名和密码。

执行查询

成功连接到数据库后,我们可以执行一些简单的查询。查询语句需要被封装在ODBC语句句柄(statement handle)中,并且需要使用SQLExecDirect函数来执行。查询的结果将被存储在ODBC结果句柄(result set handle)中,可以使用SQLFetch函数迭代处理结果。

下面是代码示例:

“`

// Prepare SQL statement

ret = SQLPrepare(stmt, (SQLCHAR*)”SELECT column1, column2 FROM table_name WHERE column3 = ?”, SQL_NTS);

// Bind parameter

int value = 10;

ret = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &value, 0, NULL);

// Execute SQL statement

ret = SQLExecDirect(stmt, (SQLCHAR*)”SELECT column1, column2 FROM table_name WHERE column3 = 10″, SQL_NTS);

// Process result set

SQLCHAR column1[128], column2[128];

SQLLEN rs1_len, rs2_len;

while (SQLFetch(stmt) == SQL_SUCCESS) {

SQLGetData(stmt, 1, SQL_C_CHAR, column1, sizeof(column1), &rs1_len);

SQLGetData(stmt, 2, SQL_C_CHAR, column2, sizeof(column2), &rs2_len);

printf(“Column1: %s, Column2: %s\n”, (char*)column1, (char*)column2);

}

“`

在这个示例中,我们使用SQLPrepare函数准备一个包含参数的查询语句。参数可以使用SQLBindParameter函数绑定。在执行查询语句后,我们使用SQLGetData函数从结果集中检索并处理返回的数据。

相关问题拓展阅读:

数据库-联表查询

SQL使用(一)——联合查询

1.联合查询分类

内连接(inner Join 或 Join)

外连接(outer Join)

左外连接(left outer Join 或 left Join)

右外连接(right outer Join 或 right Join)

全外连接(full outer Join 或 full Join)

交叉连接 (cross Join)

结果集链接 (union 和 union all)

2.联合查询介绍

相关数据表如下:

A表

B表

C表

2.1内连接(笑辩Inner Join)

内连接:仅显示两个表中匹配则戚行,即两表中都有才显示孙升陵。

SQL如下:

SELECT  A.id  AS  AID,    A.content  AS  AContent,    B.id  AS  BID,    B.content  AS  BContent  FROM  A  INNERJOIN  B  ON  (A.id = B.id);

1

2

3

4

5

6

7

8

查询结果:

由查询结果可以看出,内连接根据连接条件(A.id=B.id)查询出了A、B两表中都存在的数据信息。2个表的联合查询结果如此,那么3个表甚至更多表联合查询的结果呢?

A、B、C三表联合内查询SQL

SELECTA.idASAID,    A.contentASAContent,    B.idASBID,    B.contentASBContent,    C.idASCID,    C.contentASCContentFROMAINNERJOINBON(A.id = B.id)INNERJOINCON(A.id = C.id)

1

2

3

4

5

6

7

8

9

10

11

查询结果:

啊?怎么多了一行数据?不用惊讶,其实C表中有2个id为1的记录,然而我们怎么理解得到的查询结果呢?

可以把A、B两表的查询结果作为T表(中间结果表),然后T表内连接C表,连接条件为T.A.id=C.id。

简单来说n(n>=2)都可以看做两张表的联合查询,后面的小节将只介绍两个表的联合查询。

2.2外连接(Outer Join)

2.2.1左外连接(Left outer Join)

左外连接:左表有就显示,不论右表。

SQL:

SELECTA.idASAID,    A.contentASAContent,    B.idASBID,    B.contentASBContentFROMALEFTJOINBON(A.id = B.id);

1

2

3

4

5

6

7

8

查询结果:

左连接并不是把B表左连接到A表上,而是把A表作为基准表。由查询结果可以看出,A、B两表左连接,只要A中有结果,无论B表中有无结果,都会被查询出来。

2.2.2右外连接(Right outer Join)

右外连接:右表有就显示,不论左表。

SQL:

SELECTA.idASAID,    A.contentASAContent,    B.idASBID,    B.contentASBContentFROMARIGHTJOINBON(A.id = B.id);

1

2

3

4

5

6

7

8

9

查询结果:

右连接和左连接类似,只是把B表(连接的表)作为基准表。由查询结果可以看出,无论A表是否存在其他数据,只要B表数据存在就会被查询出来。

2.2.3全外连接(Full outer Join)

全外连接:左表/右表,有一个有就显示。

SQL:

SELECTA.idASAID,    A.contentASAContent,    B.idASBID,    B.contentASBContentFROMAFULLOUTERJOINBON(A.id = B.id);

1

2

3

4

5

6

7

8

9

查询结果:

全外连接查询就字面意思也不难看出是查询出两表(A、B)中的所有记录信息。

注:MySQL中不支持全外连接(但是可以union来实现,后面会介绍)。

2.2交叉连接(Cross Join)

SQL:

SELECTA.idASAID,    A.contentASAContent,    B.idASBID,    B.contentASBContentFROMACROSSJOINB;

1

2

3

4

5

6

7

8

9

查询结果:

由结果可以看出,交叉连接是对A、B量表进行笛卡尔积的结果查询出来。即A的每条记录都有和B中所有记录相对应的信息。

2.3 SQL Union

SQL Union用于将多个select结果集进行合并。值得注意的是,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL:

SELECT*FROMAUNIONSELECT*fromB;

1

查询结果:

Union是把2个Select结果集进行合并,由查询结果也不难看出,A、B两表的结果数据进行了合并,并且都被查询出来了。

如果2个Select结果集中存在相同的结果,用Union则会把相同的记录进行合并,查询结果中仅仅会显示一条。那么如果想都显示出来,把Union换成Union All 即可。

Union实现Full outer Join:

1.首先获取A、B表中id的不同组合。

SQL:

CREATEVIEWvasSELECTA.idfromAUNIONSELECTB.idfromB;

1

视图内存如下:

2.以视图V为基本表,Left Join A、B表即可。

SQL:

SELECTA.id,    A.content,    B.id,    B.contentFROMvLEFTJOINAON(A.id = v.id)LEFTJOINBON(B.id = v.id);

1

2

3

4

5

6

7

8

9

查询结果如下:

帮忙用C++实现与数据库的连接

用VC中的MFC吧,很好上手

#include

/* 连接数据库 */

CDatabase db;

BOOL bRtn;

try {

bRtn = db.OpenEx(“DSN=数据源名;UID=sa”, CDatabase::noOdbcDialog);

}catch (CDBException *pDBEx) {

pDBEx->ReportError();

}catch (CMemoryException *pMemEx) {

pMemEx->ReportError();

}

if (!bRtn)

printf(“连接数据库失败!”);

/* 操作结束后,关闭数据库 */

db.Close();

添加记录操作

#include

CDatabase db;

BOOL bRtn;

CString sql;

/* 1、连接数据库,见(1) */

/* 2、生成INSERT语句,丛肆稿赋给sql,例如: */

sql = “insert into student_table (s_sID, s_sName, s_sAge) values (‘001’, ‘ZhangSan’, 20);” ;

/* 3、往数据库中添加纪录 */

try {

db.ExecuteSQL(sql);

} catch (CDBException *pDBEx) {

pDBEx->ReportError();

}

/* 4、关闭数据库 */

db.Close();

删除记录操作

#include

CDatabase db;

BOOL bRtn;

CString sql;

/* 1、连接数据库,见(1) */

/* 2、生成DELETE语句,赋给sql,例如: */

sql = “delete from student_table where s_SID =’001’;” ;

/* 3、从数据库中删除纪录 */

try {

db.ExecuteSQL(sql);

} catch (CDBException *pDBEx) {

pDBEx->ReportError();

}

/* 4、关闭数据库 */

db.Close();

修改记录操作

#include

CDatabase db;

BOOL bRtn;

CString sql;

/* 1、连接数据库,见(1) */

/* 2、生成UPDATE语句,赋给sql,例如: */

sql = “update from student_table set s_sName=‘LiSi’,s_sAge=21 where s_SID =‘001’;” ;

/* 3、更新数据库中的纪录 */

try {

db.ExecuteSQL(sql);

} catch (CDBException *pDBEx) {

pDBEx->ReportError();

}

/* 4、关闭数据库 */

db.Close();

查询、统计操作

#include 渗孝

CDatabase db;

BOOL bRtn;

CString sql;

/* 1、连雹渣接数据库,见(1) */

/* 2、生成查询/统计语句,赋给sql,例如: */

sql = “Select * From student_table where s_sAge=20;” ;

/* 3、打开记录集,查询/统计 */

CMyRecordset rs(&db);

try {

bRtn = rs.Open(CRecordset::snapshot,sql);

} catch(CDBException *pDBEx) {

pDBEx->ReportError();

} catch(CMemoryException *pMemEx) {

pMemEx->ReportError();

}

if(!bRtn) {

AfxMessageBox(“Query table failed!”,MB_OK|MB_ICONERROR);

return ;

}

/* 4、逐条获取查询结果 */

for(rs.MoveFirst();!rs.IsEOF();rs.MoveNext()) {

// TODO: Add code here

}

/* 5、关闭记录集、数据库 */

rs.Close();

db.Close();

注:对连接查询,可以先创建视图,再对视图进行查询。

关于c 数据库连接 查询的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » [C语言]如何连接数据库并进行查询? (c 数据库连接 查询)