概述
随着数据量不断增大,关系型数据库的应用越来越广泛。而MSSQL Server是业界比较常用的关系型数据库之一。本文将介绍如何使用C语言来连接MSSQL数据库,并进行一些基本的数据库操作。
前置条件
安装MSSQL Server
首先,需要在本地计算机上安装MSSQL Server。可以到官网下载相应版本。在完成安装后,需要记住MSSQL数据库实例的名称和连接密码。
安装ODBC驱动
ODBC(Open Database Connectivity)是一种连接数据库的标准,它可以连接不同的数据库,并使用相同的代码来操作。因此,本文使用ODBC来连接MSSQL数据库,需要安装ODBC驱动。Windows系统自带ODBC驱动,可以在Windows控制面板 -> ODBC数据源中进行配置。如果没有安装ODBC驱动,可以在官网中下载相应版本安装后配置。
连接数据库
在使用C语言连接MSSQL数据库之前,需要下载和安装ODBC SDK。可以到官网下载ODBC SDK。
下面是连接MSSQL数据库的示例代码:
#include <stdio.h>
#include <windows.h>
#include <sqlext.h>
int main()
{
SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN ret;
SQLCHAR outstr[1024];
SQLSMALLINT outstrlen;
/* Allocate an environment handle */
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLAllocHandle error!");
return -1;
}
/* Set the ODBC version environment attribute */
ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLSetEnvAttr error!");
SQLFreeHandle(SQL_HANDLE_ENV, env);
return -1;
}
/* Allocate a connection handle */
ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLAllocHandle error!");
SQLFreeHandle(SQL_HANDLE_ENV, env);
return -1;
}
/* Connect to the database */
ret = SQLDriverConnect(dbc, NULL, "DSN=dsnname;UID=uid;PWD=pwd", SQL_NTS,
outstr, sizeof(outstr), &outstrlen,
SQL_DRIVER_COMPLETE);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLDriverConnect error!");
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return -1;
}
/* Allocate a statement handle */
ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLAllocHandle error!");
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return -1;
}
/* Use the connection */
/* Free the statement handle */
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
/* Disconnect from the database */
SQLDisconnect(dbc);
/* Free the connection handle */
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
/* Free the environment handle */
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 0;
}
代码说明:
SQLAllocHandle用于分配相应的句柄。
SQLSetEnvAttr设置ODBC版本属性。
SQLDriverConnect用于连接到数据库。
SQLDisconnect用于断开数据库连接。
SQLFreeHandle用于释放句柄。
数据库操作
查询操作
下面是查询操作的示例代码:
SELECT * FROM table_name
代码说明:
*表示查询所有字段。
FROM后面紧跟着表名。
在C语言中执行查询操作的示例代码如下:
ret = SQLExecDirect(stmt, "SELECT * FROM table_name", SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLExecDirect error!");
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return -1;
}
while (SQLFetch(stmt) != SQL_NO_DATA) {
SQLGetData(stmt, 1, SQL_C_CHAR, col1, sizeof(col1), NULL);
SQLGetData(stmt, 2, SQL_C_CHAR, col2, sizeof(col2), NULL);
}
SQLFreeStmt(stmt, SQL_DROP);
说明:
SQLExecDirect用于执行SQL语句。
SQLFetch用于获取结果集中一行的数据。
SQLGetData用于获取结果集中一列的数据。
SQLFreeStmt用于释放语句句柄。
插入操作
下面是插入操作的示例代码:
INSERT INTO table_name (col1,col2,...) VALUES(val1,val2,...);
代码说明:
col1,col2,...表示需要插入的字段。
val1,val2,...表示需要插入的值。
在C语言中执行插入操作的示例代码如下:
ret = SQLPrepare(stmt, "INSERT INTO table_name (col1,col2) VALUES(?,?)", SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLPrepare error!");
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return -1;
}
ret = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, sizeof(col1), 0, col1, sizeof(col1), NULL);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLBindParameter error!");
SQLFreeStmt(stmt, SQL_DROP);
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return -1;
}
ret = SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, sizeof(col2), 0, col2, sizeof(col2), NULL);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLBindParameter error!");
SQLFreeStmt(stmt, SQL_DROP);
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return -1;
}
ret = SQLExecute(stmt);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLExecute error!");
SQLFreeStmt(stmt, SQL_DROP);
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return -1;
}
SQLFreeStmt(stmt, SQL_DROP);
说明:
SQLPrepare用于准备SQL语句,可以使用?来作为占位符。
SQLExecute用于执行SQL语句。
SQLBindParameter用于绑定参数。
更新操作
下面是更新操作的示例代码:
UPDATE table_name SET col='val' WHERE condition;
代码说明:
col是需要更新的字段,val是更新后的值。
WHERE后面是需要更新的条件。
在C语言中执行更新操作的示例代码如下:
ret = SQLExecDirect(stmt, "UPDATE table_name SET col1='new_val' WHERE col2='val'", SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLExecDirect error!");
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return -1;
}
SQLFreeStmt(stmt, SQL_DROP);
说明:
SQLExecDirect用于执行SQL语句。
删除操作
下面是删除操作的示例代码:
DELETE FROM table_name WHERE condition;
代码说明:
WHERE后面是需要删除的条件。
在C语言中执行删除操作的示例代码如下:
ret = SQLExecDirect(stmt, "DELETE FROM table_name WHERE col2='val'", SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("SQLExecDirect error!");
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return -1;
}
SQLFreeStmt(stmt, SQL_DROP);
说明:
SQLExecDirect用于执行SQL语句。
结束语
本文介绍了如何使用C语言连接MSSQL数据库,并进行一些基本的数据库操作。希望对大家学习C语言和MSSQL数据库有所帮助。