1. 简介
操作关系型数据库是企业级应用程序中必不可少的一环。MS SQL服务器是微软公司开发的关系型数据库管理系统,被广泛应用于企业中。本篇文章将介绍使用C语言编写MS SQL查询程序。
2. 安装ODBC驱动
在使用C语言操作MS SQL服务器之前,需要先安装对应的ODBC驱动。可以在微软官网上下载32位或64位版本的驱动程序并安装。下载地址为:
https://www.microsoft.com/en-US/download/details.aspx?id=36434
安装完成后,在控制面板中找到ODBC数据源(64位)或ODBC数据源(32位)并打开,如下图所示:
选择System DSN,然后点击添加,如下图所示:
选择SQL Native Client 11.0驱动程序,并点击完成,如下图所示:
设置数据源名称,描述及服务器信息,如下图所示:
选择Test Connecton检查是否连接成功,如下图所示:
如果成功,则可以点击确定完成设置。这样就完成了ODBC驱动的安装和配置。
3. 编写C程序
3.1 初始化数据库连接
#include
#include
#include
#include
int main(){
//初始化ODBC环境句柄
SQLHENV henv;
SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
//初始化数据库连接句柄
SQLHDBC hdbc;
SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
//连接数据库
SQLCHAR *dsn = (SQLCHAR *)"DSN=data1;UID=sa;PWD=123";
SQLRETURN ret = SQLConnectA(hdbc,dsn,SQL_NTS,NULL,SQL_NULL_HANDLE,SQL_NULL_HANDLE);
if(ret == SQL_ERROR || ret == SQL_INVALID_HANDLE){
printf("Connect fail.\n");
return 1;
}
return 0;
}
上述代码片段完成了ODBC环境句柄的初始化和数据库连接句柄的初始化,并连接了数据库。其中dsn
是ODBC驱动数据源名称,UID
是连接数据库的用户名,PWD
是连接数据库的密码。
3.2 执行SQL查询语句
在连接完成后,我们可以使用SQL语句查询数据库中的数据。下面的函数ExecSqlQuery
可以用来执行SQL查询语句。
int ExecSqlQuery(SQLHDBC hdbc,char *sSql){
SQLHSTMT hstmt;
SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
int ret = SQLExecDirectA(hstmt,(SQLCHAR*)sSql,SQL_NTS);
if(ret == SQL_ERROR || ret == SQL_INVALID_HANDLE){
SQLFreeHandle(SQL_HANDLE_STMT,hstmt);
printf("SQL query error.\n");
return 1;
}
int nColumn = 0;
SQLRETURN ret2 = SQLNumResultCols(hstmt,&nColumn);
if(ret2 == SQL_ERROR || ret2 == SQL_INVALID_HANDLE){
SQLFreeHandle(SQL_HANDLE_STMT,hstmt);
printf("SQL query column error.\n");
return 2;
}
SQLCHAR szName[100];
for(int i=1;i<=nColumn;i++){
SQLULEN uColumnSize=0;
SQLSMALLINT DataType=0;
SQLSMALLINT NameLen=0;
SQLDescribeColA(hstmt,i,szName,sizeof(szName),&NameLen,&DataType,&uColumnSize,NULL,NULL);
printf("%s\t",szName);
}
printf("\n\n");
while(1){
ret = SQLFetch(hstmt);
if(ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO){
break;
}
for(int i=1;i<=nColumn;i++){
char szData[1024] = {0};
SQLGetData(hstmt,i,SQL_C_CHAR,szData,sizeof(szData),NULL);
printf("%s\t",szData);
}
printf("\n");
}
SQLFreeHandle(SQL_HANDLE_STMT,hstmt);
return 0;
}
在执行完SQL查询语句后,我们需要逐行读取查询结果,可以使用函数SQLFetch
和SQLGetData
来实现。这两个函数均由ODBC提供。下面是具体使用方法:
使用函数SQLGetData
获取指定行和列上的结果。
使用函数SQLFetch
获取下一行。
当函数SQLFetch
返回值不是SQL_SUCCESS
或SQL_SUCCESS_WITH_INFO
时,表示查询结果已经全部读取完成。
下面是一个例子:
void main()
{
SQLHENV henv;
SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
SQLHDBC hdbc;
SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
SQLCHAR *dsn = (SQLCHAR *)"DSN=data1;UID=sa;PWD=123";
SQLRETURN ret = SQLConnectA(hdbc,dsn,SQL_NTS,NULL,SQL_NULL_HANDLE,SQL_NULL_HANDLE);
if(ret == SQL_ERROR || ret == SQL_INVALID_HANDLE){
printf("Connect fail.\n");
return;
}
ExecSqlQuery(hdbc,"SELECT * FROM Products");
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
}
上述代码片段使用了前面提到的函数ExecSqlQuery
执行了SQL查询语句SELECT * FROM Products
,并打印出查询结果。
4. 总结
本篇文章介绍了使用C语言操作MS SQL服务器的基本步骤。主要内容包括安装ODBC驱动、配置数据源、连接数据库和执行SQL查询等。这些知识点对于企业级应用程序开发都非常重要,希望对读者有所帮助。