C语言在SQL Server中的应用

1. 简介

SQL Server是微软公司开发的一款关系型数据库管理系统,支持T-SQL语言。C语言是一种通用的编程语言,适用于系统编程和应用程序开发。

在实际应用中,有时候需要将C语言应用到SQL Server中,以实现一些复杂的操作和功能。

2. C语言与SQL Server的互操作性

2.1 使用ODBC API

ODBC(Open Database Connectivity)是一种开放式数据库连接标准,可以为各种类型的数据库提供统一的访问接口。ODBC API是ODBC标准的实现,SQL Server支持ODBC API。

可以在C语言中使用ODBC API连接SQL Server数据库,并执行SQL语句。下面是一个简单的示例:

#include <windows.h>

#include <sql.h>

#include <sqlext.h>

SQLHANDLE henv;

SQLHANDLE hdbc;

SQLHANDLE hstmt;

SQLCHAR *szConnStr = (SQLCHAR *) "DRIVER={SQL Server};SERVER=myServer;DATABASE=myDatabase;UID=myUser;PWD=myPass";

SQLCHAR *szSqlStr = (SQLCHAR *) "SELECT * FROM myTable";

int main()

{

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0);

SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

SQLDriverConnect(hdbc, NULL, szConnStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);

SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

SQLExecDirect(hstmt, szSqlStr, SQL_NTS);

// fetch data

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, henv);

return 0;

}

上面的示例中,通过ODBC API连接了SQL Server数据库,执行了一条查询语句,并释放了资源。

2.2 使用T-SQL

除了使用ODBC API,还可以在C程序中直接嵌入T-SQL语句,以操作SQL Server数据库。需要注意的是,嵌入的T-SQL语句必须是合法的,否则可能导致错误。

下面是一个简单的示例:

#include <stdio.h>

#include <sql.h>

#include <sqlext.h>

int main()

{

SQLHANDLE henv;

SQLHANDLE hdbc;

SQLHANDLE hstmt;

SQLCHAR *szConnStr = (SQLCHAR *) "DRIVER={SQL Server};SERVER=myServer;DATABASE=myDatabase;UID=myUser;PWD=myPass";

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0);

SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

SQLDriverConnect(hdbc, NULL, szConnStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);

SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

SQLCHAR *szSqlStr = (SQLCHAR *) "INSERT INTO myTable (name, age) VALUES ('John', 25)";

SQLExecDirect(hstmt, szSqlStr, SQL_NTS);

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, henv);

return 0;

}

3. C语言应用案例

3.1 查询数据并输出到文件

以下示例演示了如何使用C语言连接SQL Server数据库,查询数据,并将结果输出到文件中。

#include <stdio.h>

#include <windows.h>

#include <sql.h>

#include <sqlext.h>

int main()

{

SQLHANDLE henv;

SQLHANDLE hdbc;

SQLHANDLE hstmt;

SQLCHAR *szConnStr = (SQLCHAR *) "DRIVER={SQL Server};SERVER=myServer;DATABASE=myDatabase;UID=myUser;PWD=myPass";

SQLCHAR *szSqlStr = (SQLCHAR *) "SELECT Name, Age, Gender FROM myTable";

SQLRETURN retcode;

FILE *fp;

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0);

SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

SQLDriverConnect(hdbc, NULL, szConnStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);

SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

// execute sql statement

retcode = SQLExecDirect(hstmt, szSqlStr, SQL_NTS);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)

{

// output result to file 'result.txt'

fp = fopen("result.txt", "w");

while (SQLFetch(hstmt) == SQL_SUCCESS)

{

SQLCHAR szName[32], szGender[8];

SQLINTEGER iAge;

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

SQLGetData(hstmt, 2, SQL_C_LONG, &iAge, sizeof(int), NULL);

SQLGetData(hstmt, 3, SQL_C_CHAR, szGender, sizeof(szGender), NULL);

fprintf(fp, "Name: %s, Age: %d, Gender: %s\n", szName, iAge, szGender);

}

fclose(fp);

}

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, henv);

return 0;

}

3.2 执行存储过程

以下示例演示了如何使用C语言连接SQL Server数据库,执行存储过程,并输出执行结果。

#include <stdio.h>

#include <windows.h>

#include <sql.h>

#include <sqlext.h>

int main()

{

SQLHANDLE henv;

SQLHANDLE hdbc;

SQLHANDLE hstmt;

SQLCHAR *szConnStr = (SQLCHAR *) "DRIVER={SQL Server};SERVER=myServer;DATABASE=myDatabase;UID=myUser;PWD=myPass";

SQLCHAR *szProcStr = (SQLCHAR *) "{CALL MyProc()}";

SQLRETURN retcode;

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0);

SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

SQLDriverConnect(hdbc, NULL, szConnStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);

SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

// execute stored procedure

retcode = SQLExecDirect(hstmt, szProcStr, SQL_NTS);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)

{

// output result

SQLLEN cRecords = 0, cBytes = 0;

SQLGetData(hstmt, 1, SQL_C_SLONG, &cRecords, sizeof(cRecords), NULL);

SQLGetData(hstmt, 2, SQL_C_SLONG, &cBytes, sizeof(cBytes), NULL);

printf("Procedure executed successfully: %d records affected, %d bytes returned.\n", cRecords, cBytes);

}

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, henv);

return 0;

}

3.3 创建表格

以下示例演示了如何使用C语言连接SQL Server数据库,创建一个新的表格。

#include <stdio.h>

#include <windows.h>

#include <sql.h>

#include <sqlext.h>

int main()

{

SQLHANDLE henv;

SQLHANDLE hdbc;

SQLHANDLE hstmt;

SQLCHAR *szConnStr = (SQLCHAR *) "DRIVER={SQL Server};SERVER=myServer;DATABASE=myDatabase;UID=myUser;PWD=myPass";

SQLCHAR *szSqlStr = (SQLCHAR *) "CREATE TABLE myNewTable (id INT PRIMARY KEY NOT NULL, name CHAR(30) NOT NULL, age INT NOT NULL)";

SQLRETURN retcode;

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0);

SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

SQLDriverConnect(hdbc, NULL, szConnStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);

SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

// execute sql statement

retcode = SQLExecDirect(hstmt, szSqlStr, SQL_NTS);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)

{

printf("New table created successfully.\n");

}

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, henv);

return 0;

}

4. 总结

C语言是一种通用的编程语言,可以应用于系统编程和应用程序开发。在SQL Server中,可以使用C语言通过ODBC API或嵌入T-SQL语句的方式操作数据库,实现一些复杂的操作和功能。

在实际应用开发中,需要根据具体的业务需求选择合适的方案和技术。

数据库标签