C语言实现连接SQL数据库查询——一步步教您完成! (c 实现连接sql数据库查询)
随着互联网技术的快速发展,数据库这一组件在各种软件开发过程中显得越来越重要。对于C语言开发者来说,在应用程序中使用数据库查询是一种很常见的需求。而这就需要使用数据库连接器来访问数据库并执行操作。本文将一步步为大家介绍如何使用C语言连接SQL数据库并进行查询操作。
一、首先要下载并安装SQL Server
要想连接SQL数据库,并从C语言编写的程序中查询数据,首先需要在本地电脑上安装SQL Server。SQL Server是一种常见的关系型数据库管理系统,它是由Microsoft开发的,可支持Windows和Linux平台。在安装SQL Server之前,需要确定计算机是否已安装.NET Framework及SQL Server Native Client等依赖项。这些依赖项可以从Microsoft官方网站上下载并安装。
二、在Visual Studio中创建新项目
要在C语言程序中使用SQL Server,需要使用Microsoft提供的ODBC API。ODBC全称为“Open Database Connectivity”,即开放式数据库连接,是Microsoft开发的数据库连接API。在创建项目前,确保已下载并安装Visual Studio。
1. 打开Visual Studio
2. 选择“创建项目”
3. 在“新建项目”页面上,选择“Win32控制台应用程序”,然后单击“下一步”
4. 在“Win32应用程序向导”上,选择“控制台应用程序”,并选择“空白项目”,勾选“空项目”,然后选择“完成”。
三、创建数据库表
在本例中,将使用C语言程序连接到一个名为“sample”的SQL Server数据库。在这个数据库中,我们将创建一个名为“customer”的新表,包含有关客户的数据。在创建此表之前,需要确保已在本地计算机上安装SQL Server和SQL Server Management Studio。
1. 启动SQL Server Management Studio
2. 登录到SQL Server数据库,选择“新建查询”窗口
3. 在刚刚创建的数据库”sample”中创建一个新表:
CREATE TABLE Customer
(
ID INT,
Name VARCHAR(50),
Address VARCHAR(100),
City VARCHAR(50),
State VARCHAR(50),
Zipcode INT
)
4. 在Customer表中插入一些数据以便后续测试。
INSERT INTO Customer
VALUES (1, ‘张三’, ‘北京市朝阳区’, ‘北京’, ‘北京’, 100001),
(2, ‘李四’, ‘上海市浦东新区’, ‘上海’, ‘上海’, 202301),
(3, ‘王五’, ‘深圳市南山区’, ‘深圳’, ‘广东’, 300001),
(4, ‘刘六’, ‘成都市青羊区’, ‘成都’, ‘四川’, 400001)
四、在C语言程序中连接到数据库并查询数据
接下来,我们将使用ODBC API和C语言编写一个程序,用于连接到 “sample” 数据库中的“Customer”表,并查询其中的所有数据。
1. 目标:查询“sample”数据库中“customer”表中的所有行。
2. 进行以下操作:
(1) 创建ODBC连接句柄
(2) 打开ODBC连接
(3) 设置ODBC语句句柄
(4) 创建SQL语句
(5) 执行SQL查询
(6) 将查询结果读入缓冲区
(7) 关闭ODBC连接
3. C语言代码实现
#include
#include
#include
#define RETCODE SQLRETURN
int mn(int argc, char *argv[])
{
RETCODE rc;
// Allocate Environment Handle
HENV henv = SQL_NULL_HENV;
rc= SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
{
printf(“ERROR: Unable to allocate environment handle.\n”);
return 0;
}
// Set the ODBC version for environment
rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, NULL);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
{
printf(“ERROR: Unable to set ODBC version.\n”);
return 0;
}
// Allocate Connection Handle
HDBC hdbc = SQL_NULL_HDBC;
rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
{
printf(“ERROR: Unable to allocate database handle.\n”);
return 0;
}
// Connect using SQL Server Native Client 11.0 ODBC Driver
// Change the server name here to the name of the SQL Server instance
SQLCHAR* connString = (SQLCHAR*) “DRIVER={SQL Server Native Client 11.0};SERVER=DESKTOP-8RTRGDQ\\SQLEXPRESS;DATABASE=sample;UID=XXX;PWD=YYY;”;
rc = SQLDriverConnectA(hdbc, NULL, connString, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
{
printf(“ERROR: Unable to connect to database.\n”);
return 0;
}
// Allocate Statement Handle
HSTMT hstmt = SQL_NULL_HSTMT;
rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
{
printf(“ERROR: Unable to allocate statement handle.\n”);
return 0;
}
// Execute Statement
SQLCHAR* sql = (SQLCHAR*) “SELECT * FROM Customer”;
rc = SQLExecDirectA(hstmt, sql, SQL_NTS);
if(rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
{
printf(“ERROR: Unable to execute SQL statement.\n”);
return 0;
}
// Bind Columns to Variables
int id;
char name[50];
char address[100];
char city[50];
char state[50];
int zipcode;
printf(“ID\tName\tAddress\t\tCity\tState\tZipcode\n”);
printf(“——————————————————-\n”);
while(SQLFetch(hstmt) == SQL_SUCCESS)
{
rc = SQLGetData(hstmt, 1, SQL_C_LONG, &id, sizeof(id), NULL);
rc = SQLGetData(hstmt, 2, SQL_C_CHAR, name, sizeof(name), NULL);
rc = SQLGetData(hstmt, 3, SQL_C_CHAR, address, sizeof(address), NULL);
rc = SQLGetData(hstmt, 4, SQL_C_CHAR, city, sizeof(city), NULL);
rc = SQLGetData(hstmt, 5, SQL_C_CHAR, state, sizeof(state), NULL);
rc = SQLGetData(hstmt, 6, SQL_C_LONG, &zipcode, sizeof(zipcode), NULL);
printf(“%d\t%s\t%s\t%s\t%s\t%d\n”, id, name, address, city, state, zipcode);
}
// Free Statement Handle
rc = SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
{
printf(“ERROR: Unable to free statement handle.\n”);
return 0;
}
//Disconnect the databse
rc = SQLDisconnect(hdbc);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
{
printf(“ERROR: Unable to disconnect the database.\n”);
return 0;
}
//Free the Connection Handle
rc = SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
{
printf(“ERROR: Unable to free database handle.\n”);
return 0;
}
//Free the Environment Handle
rc = SQLFreeHandle(SQL_HANDLE_ENV, henv);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
{
printf(“ERROR: Unable to free environment handle.\n”);
return 0;
}
return 1;
}
五、编译并执行代码
在Visual Studio中编译代码并执行,结果如下所示:
ID Name Address City State Zipcode
——————————————————-
1 张三 北京市朝阳区 北京 北京 100001
2 李四 上海市浦东新区 上海 上海 202301
3 王五 深圳市南山区 深圳 广东 300001
4 刘六 成都市青羊区 成都 四川 400001
六、