1. 简介
随着科技的不断进步,互联网数据量呈现不断攀升之势,而关系型数据库(如MSSQL)的应用也逐渐普及。C语言是常用编程语言,也支持操作MSSQL数据库,可以使用ODBC(开放式数据库连接)或ADO(活动数据对象)连接MSSQL。
2. 安装ODBC驱动程序
ODBC驱动程序是操作MSSQL数据库的重要方式之一,安装ODBC驱动程序后,C语言就能够连接到MSSQL并执行SELECT、INSERT或UPDATE等SQL语句。
2.1 下载ODBC驱动程序
下载ODBC驱动程序并执行安装程序,常用的ODBC驱动程序包括“ODBC Driver for SQL Server”和“ODBC Driver for Microsoft Access”。可以从Microsoft官方网站下载对应版本,安装过程中需要按照提示进行,完成后需要在控制面板->ODBC数据源中添加连接信息。
2.2 添加ODBC数据源
在Windows中,可以在控制面板中找到“ODBC数据源”图标,双击进入后可以添加ODBC数据源,也可以在C语言代码中使用SQLConnect函数来建立ODBC数据源连接。
//使用ODBC连接数据库
#define SQL_RESULT_LEN 240
#define SQL_RETURN_CODE_LEN 1000
#define SQL_COLUMN_NAME_LEN 64
#define SQL_QUERY_LEN 100
void SELECT_UsingODBC(char *query)
{
SQLHENV env; //定义ODBC环境
SQLHDBC dbc; //定义ODBC数据库连接
SQLHSTMT stmt; //定义ODBC语句指针
SQLRETURN ret; //定义ODBC函数返回值
SQLCHAR col_name[SQL_COLUMN_NAME_LEN];
SQLCHAR query_string[SQL_QUERY_LEN];
SQLRETURN retcode;
SQLCHAR result[SQL_RESULT_LEN];
SQLLEN num_cols=0, num_rows=0;
SQLINTEGER col_width[10];
SQLSMALLINT col_type[10];
int row = 0;
SQLCHAR server[] = "your_server_name"; //服务器名称
SQLCHAR database[] = "your_database_name"; //数据库名称
SQLCHAR username[] = "your_username"; //用户名
SQLCHAR password[] = "your_password"; //密码
//分配ODBC环境句柄
ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &env);
//将ODBC环境版本号设置为3,用于兼容低版本ODBC头文件
ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
//分配ODBC连接句柄
ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
//连接到ODBC数据源
ret = SQLConnect(dbc, (SQLCHAR*)server, SQL_NTS, (SQLCHAR*)username, SQL_NTS, (SQLCHAR*)password, SQL_NTS);
fprintf(stderr, "Connection Successful!\n");
//分配ODBC语句句柄
ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
sprintf_s((char*)query_string, SQL_QUERY_LEN, "%s", query);
retcode = SQLExecDirect(stmt, (unsigned char*)query_string, SQL_NTS);
fprintf(stdout, "Query : %s\n", query);
fprintf(stdout, "Result : \n");
ret = SQLNumResultCols(stmt, &num_cols);
for (int col=1; col<=num_cols; col++)
{
SQLDescribeCol(stmt, col, col_name, SQL_COLUMN_NAME_LEN, NULL, NULL, NULL, NULL, NULL);
fprintf(stdout, "%s\t", col_name);
}
fprintf(stdout,"\n");
while (retcode == SQL_SUCCESS)
{
ret = SQLFetch(stmt);
if(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
{
for(int col=1; col<=num_cols; col++)
{
ret = SQLGetData(stmt, col, SQL_C_CHAR, result, SQL_RESULT_LEN, (SQLLEN *) &col_width[col-1]);
if (retcode != SQL_SUCCESS)
{
fprintf(stdout, "\nSQLGetData Error : %d\n", ret);
return;
}
fprintf(stdout, "%s\t",result);
}
row++;
num_rows++;
fprintf(stdout, "\n");
}
else
fprintf(stdout, "fetch over\n");
}
fprintf(stdout, "num_rows %d\n",num_rows);
fprintf(stdout, "Selecting done!\n\n");
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
}
3. 使用ADO连接MSSQL
ADO是活动数据对象的缩写,也是连接MSSQL数据库的一种常用方法。ADO方式的优点是连接MSSQL更加方便,可以减少许多代码量。
3.1 ADO的优点
使用ADO建立与MSSQL的连接时,通常采取以下代码:
_Connect *conn;
_Recordset *rec;
_Bstr_t strCon("your_server_name"), strUserID("your_username"), strPWD("your_password"), strDBName("your_database_name");
//初始化COM库
CoInitialize(NULL);
//新建AOD连接对象
conn = new _Connection();
conn->Provider = "sqloledb";
//指定连接字符串
conn->ConnectionString = "Data Source=" + (_bstr_t)strCon + ";Initial Catalog=" + (_bstr_t)strDBName +";User ID=" +
(_bstr_t)strUserID + ";Password=" + (_bstr_t)strPWD + ";";
//打开连接对象
conn->Open((_bstr_t)strCon, (_bstr_t)strUserID, (_bstr_t)strPWD, adModeUnknown);
//新建Recordset对象
rec = new _Recordset();
//打开Recordset对象
rec->Open((_bstr_t)query, conn.GetInterfacePtr(), adOpenStatic, adLockReadOnly, adCmdUnknown);
值得注意的是,ADO方式需要引用ado与com库,使用COM接口,要求安装Visual Studio等开发环境。
4. 结论
C编程连接MSSQL数据库有多种方式,包括ODBC和ADO。使用ODBC需要先安装ODBC驱动程序,然后在代码中使用SQL代替MSSQL语句来执行MSSQL查询,相对复杂;使用ADO方式连接MSSQL,需要使用COM与ado库,使用起来相对简单,但需要安装对应的开发环境。