[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函数从结果集中检索并处理返回的数据。

相关问题拓展阅读:

  • 数据库-联表查询
  • 帮忙用C++实现与数据库的连接

数据库-联表查询

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

香港服务器首选树叶云,2H2G首月10元开通。
树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/275482.html<

(0)
运维的头像运维
上一篇2025-05-10 05:30
下一篇 2025-05-10 05:31

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注