在Linux下使用ODBC连接SQL Server数据库,需要进行以下几个步骤:
1. 安装ODBC驱动程序:Linux下可以使用FreeTDS或unixODBC驱动程序连接SQL Server数据库,需要先安装相应的驱动程序。可以使用以下命令进行安装: - FreeTDS:`sudo apt-get install freetds-dev` - unixODBC:`sudo apt-get install unixodbc unixodbc-dev`
2. 配置ODBC数据源:需要使用ODBC配置文件(odbc.ini)配置ODBC数据源,可以使用以下命令打开配置文件: `sudo nano /etc/odbc.ini` 在文件中添加以下内容:
[SQLServerDSN]
Driver=FreeTDS
Description=SQL Server DSN
Server=<server name or IP address>
Port=<port number>
Database=<database name>
TDS_Version=8.0
其中,`SQLServerDSN`是数据源名称,`Driver`是ODBC驱动程序名称,`Server`是SQL Server的名称或IP地址,`Port`是SQL Server的端口号,`Database`是要连接的数据库名称,`TDS_Version`是FreeTDS的版本号。
3. 配置ODBC驱动程序:需要使用ODBC驱动程序配置文件(freetds.conf或odbcinst.ini)配置ODBC驱动程序,可以使用以下命令打开配置文件: `sudo nano /etc/freetds/freetds.conf` 在文件中添加以下内容:
[SQLServerDSN]
host = <server name or IP address>
port = <port number>
tds version = 8.0
其中,`SQLServerDSN`是数据源名称,`host`是SQL Server的名称或IP地址,`port`是SQL Server的端口号,`tds version`是FreeTDS的版本号。
4. 编写C++程序:使用ODBC API或ODBC封装库(如ODBC++)编写C++程序连接SQL Server数据库。 以下是一个使用ODBC API连接SQL Server数据库的示例程序:
#include <iostream>
#include <sql.h>
#include <sqlext.h>
int main() {
SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN ret;
// Allocate environment handle
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
std::cerr << "Error allocating environment handle" << std::endl;
return 1;
}
// Set ODBC version
ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
std::cerr << "Error setting ODBC version" << std::endl;
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 1;
}
// Allocate connection handle
ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
std::cerr << "Error allocating connection handle" << std::endl;
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 1;
}
// Connect to database
ret = SQLConnect(dbc, (SQLCHAR*)"SQLServerDSN", SQL_NTS, (SQLCHAR*)"username", SQL_NTS, (SQLCHAR*)"password", SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
std::cerr << "Error connecting to database" << std::endl;
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 1;
}
// Allocate statement handle
ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
std::cerr << "Error allocating statement handle" << std::endl;
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 1;
}
// Execute SQL query
ret = SQLExecDirect(stmt, (SQLCHAR*)"SELECT * FROM table", SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
std::cerr << "Error executing SQL query" << std::endl;
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 1;
}
// Fetch results
SQLCHAR name[256];
SQLINTEGER age;
while (SQLFetch(stmt) == SQL_SUCCESS) {
SQLGetData(stmt, 1, SQL_C_CHAR, name, sizeof(name), NULL);
SQLGetData(stmt, 2, SQL_C_LONG, &age, 0, NULL);
std::cout << name << ", " << age << std::endl;
}
// Free resources
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 0;
}
该程序使用ODBC API连接SQL Server数据库,首先分别分配环境句柄、连接句柄和语句句柄,然后设置ODBC版本、连接数据库、执行SQL查询和获取结果等操作,最后释放资源。