基于C语言的MSSQL实例教学

概述

随着数据量不断增大,关系型数据库的应用越来越广泛。而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数据库有所帮助。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

数据库标签