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语句的方式操作数据库,实现一些复杂的操作和功能。
在实际应用开发中,需要根据具体的业务需求选择合适的方案和技术。