C与MSSQL数据库连接实现快速数据操作

介绍

在Web应用程序中,使用数据库是一个非常常见的任务。通过使用数据库,我们可以轻松地存储,管理和检索数据。在本文中,我们将讨论如何使用C语言与MSSQL数据库连接实现快速数据操作。

什么是MSSQL?

MSSQL(Microsoft SQL Server)是一种关系型数据库管理系统,由Microsoft开发和维护,支持SQL语言。它是一种可扩展性强、功能丰富、安全可靠的数据库服务器软件。

连接MSSQL数据库

在C语言中连接MSSQL数据库,我们需要使用ODBC(Open Database Connectivity)API。ODBC是一个标准的API,用于连接不同类型的数据库。以下是连接MSSQL数据库的步骤:

步骤1:安装ODBC Driver

连接MSSQL数据库需要ODBC Driver。如果您使用的是Windows操作系统,则可以在 官方网站 下载Microsoft ODBC Driver for SQL Server。如果您使用的是Linux操作系统,则可以安装unixODBC和FreeTDS驱动程序。

步骤2:创建DSN

DSN(Data Source Name)是使用ODBC驱动程序连接数据库的一个标准名称。在连接MSSQL数据库之前,我们需要创建一个DSN。我们可以使用ODBC Data Source Administrator工具来创建DSN。

在Windows操作系统中,ODBC Data Source Administrator工具可以在控制面板的Administrative Tools中找到。

在Linux操作系统中,我们可以使用命令行创建DSN。以下是创建DSN的通用命令:

sudo odbcinst -i -d -f /path/to/odbc-driver.ini

sudo odbcinst -i -s -f /path/to/odbc-data-source.ini

步骤3:连接数据库

当DSN创建完成后,我们可以使用ODBC API连接数据库。以下是连接MSSQL数据库的示例:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sql.h>

#include <sqlext.h>

SQLHENV henv;

SQLHDBC hdbc;

SQLHSTMT hstmt;

SQLCHAR *conn_str = (SQLCHAR *)"DSN=mydsn;UID=myuid;PWD=mypwd";

int main()

{

// Allocate environment handle

if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv) != SQL_SUCCESS)

{

printf("Error allocating environment handle.\n");

return 1;

}

// Set ODBC version

if (SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0) != SQL_SUCCESS)

{

printf("Error setting ODBC version.\n");

return 1;

}

// Allocate connection handle

if (SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc) != SQL_SUCCESS)

{

printf("Error allocating connection handle.\n");

return 1;

}

// Connect to database

if (SQLDriverConnect(hdbc, NULL, conn_str, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE) != SQL_SUCCESS)

{

printf("Error connecting to database.\n");

return 1;

}

// Allocate statement handle

if (SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt) != SQL_SUCCESS)

{

printf("Error allocating statement handle.\n");

return 1;

}

// Execute SQL query

SQLCHAR *sql_query = (SQLCHAR *)"SELECT * FROM mytable";

if (SQLExecDirect(hstmt, sql_query, SQL_NTS) != SQL_SUCCESS)

{

printf("Error executing SQL query.\n");

return 1;

}

// Fetch result set

SQLCHAR name[256];

SQLINTEGER age;

while (SQLFetch(hstmt) == SQL_SUCCESS)

{

SQLGetData(hstmt, 1, SQL_C_CHAR, name, sizeof(name), NULL);

SQLGetData(hstmt, 2, SQL_C_LONG, &age, 0, NULL);

printf("Name: %s, Age: %d\n", name, age);

}

// Free handles

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, henv);

return 0;

}

该示例连接到名为“mydsn”的DSN,并使用用户名“myuid”和密码“mypwd”连接到MSSQL数据库。它执行一个简单的查询并打印结果集。

快速数据操作

当我们连接MSSQL数据库后,我们可以使用ODBC API执行各种数据操作,例如插入,更新,删除和查询数据。以下是执行这些操作的示例:

插入数据

要插入数据,我们需要使用SQLPrepare函数为SQL语句准备一个语句句柄,并使用SQLBindParameter函数将参数绑定到该语句句柄。以下是插入数据的示例:

// Prepare SQL statement

SQLCHAR *sql_insert = (SQLCHAR *)"INSERT INTO mytable (name, age) VALUES (?, ?)";

if (SQLPrepare(hstmt, sql_insert, SQL_NTS) != SQL_SUCCESS)

{

printf("Error preparing SQL statement.\n");

return 1;

}

// Bind parameters

SQLCHAR name[256] = "John Smith";

SQLINTEGER age = 30;

SQLLEN name_length = SQL_NTS;

if (SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(name), 0, name, sizeof(name), &name_length) != SQL_SUCCESS)

{

printf("Error binding parameter 1.\n");

return 1;

}

if (SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &age, 0, NULL) != SQL_SUCCESS)

{

printf("Error binding parameter 2.\n");

return 1;

}

// Execute SQL statement

if (SQLExecute(hstmt) != SQL_SUCCESS)

{

printf("Error executing SQL statement.\n");

return 1;

}

该示例将一个名为“John Smith”的人的年龄为30岁的行插入到“mytable”表中。

更新数据

要更新数据,我们需要使用SQLPrepare函数为SQL语句准备一个语句句柄,并使用SQLBindParameter函数将参数绑定到该语句句柄。以下是更新数据的示例:

// Prepare SQL statement

SQLCHAR *sql_update = (SQLCHAR *)"UPDATE mytable SET age=? WHERE name=?";

if (SQLPrepare(hstmt, sql_update, SQL_NTS) != SQL_SUCCESS)

{

printf("Error preparing SQL statement.\n");

return 1;

}

// Bind parameters

SQLCHAR name[256] = "John Smith";

SQLINTEGER age = 31;

SQLLEN name_length = SQL_NTS;

if (SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &age, 0, NULL) != SQL_SUCCESS)

{

printf("Error binding parameter 1.\n");

return 1;

}

if (SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(name), 0, name, sizeof(name), &name_length) != SQL_SUCCESS)

{

printf("Error binding parameter 2.\n");

return 1;

}

// Execute SQL statement

if (SQLExecute(hstmt) != SQL_SUCCESS)

{

printf("Error executing SQL statement.\n");

return 1;

}

该示例将名为“John Smith”的人的年龄更新为31岁。

删除数据

要删除数据,我们需要使用SQLPrepare函数为SQL语句准备一个语句句柄,并使用SQLBindParameter函数将参数绑定到该语句句柄。以下是删除数据的示例:

// Prepare SQL statement

SQLCHAR *sql_delete = (SQLCHAR *)"DELETE FROM mytable WHERE name=?";

if (SQLPrepare(hstmt, sql_delete, SQL_NTS) != SQL_SUCCESS)

{

printf("Error preparing SQL statement.\n");

return 1;

}

// Bind parameter

SQLCHAR name[256] = "John Smith";

SQLLEN name_length = SQL_NTS;

if (SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(name), 0, name, sizeof(name), &name_length) != SQL_SUCCESS)

{

printf("Error binding parameter.\n");

return 1;

}

// Execute SQL statement

if (SQLExecute(hstmt) != SQL_SUCCESS)

{

printf("Error executing SQL statement.\n");

return 1;

}

该示例将名为“John Smith”的人的行从“mytable”表中删除。

查询数据

要查询数据,我们需要使用SQLPrepare函数为SQL语句准备一个语句句柄,并使用SQLBindCol函数将结果列绑定到变量。以下是查询数据的示例:

// Prepare SQL statement

SQLCHAR *sql_select = (SQLCHAR *)"SELECT * FROM mytable WHERE age<?";

if (SQLPrepare(hstmt, sql_select, SQL_NTS) != SQL_SUCCESS)

{

printf("Error preparing SQL statement.\n");

return 1;

}

// Bind parameter

SQLINTEGER age = 40;

if (SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &age, 0, NULL) != SQL_SUCCESS)

{

printf("Error binding parameter.\n");

return 1;

}

// Bind result columns

SQLCHAR name[256];

SQLINTEGER age_result;

if (SQLBindCol(hstmt, 1, SQL_C_CHAR, name, sizeof(name), NULL) != SQL_SUCCESS)

{

printf("Error binding column 1.\n");

return 1;

}

if (SQLBindCol(hstmt, 2, SQL_C_LONG, &age_result, 0, NULL) != SQL_SUCCESS)

{

printf("Error binding column 2.\n");

return 1;

}

// Execute SQL statement

if (SQLExecute(hstmt) != SQL_SUCCESS)

{

printf("Error executing SQL statement.\n");

return 1;

}

// Fetch result set

while (SQLFetch(hstmt) == SQL_SUCCESS)

{

printf("Name: %s, Age: %d\n", name, age_result);

}

该示例从“mytable”表中查询年龄小于40岁的所有人,并打印结果集。

结论

通过使用C语言与MSSQL数据库连接,我们可以轻松地进行快速数据操作,例如插入,更新,删除和查询数据。使用ODBC API,我们可以连接不同类型的数据库,而不必担心连接细节。

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

数据库标签