0

我在 linux redhat 64bit 上通过 odbc 连接了 MSSQL(在 Windows 上)。
下面是 odbc 和 freetds 配置文件。

freetds.conf

[FreeTDS]  
host=172.21.32.20  
port=1433  
tds version=7.2  
client charset = GB2312   

odbcinst.ini

[TDS]  
Description = TDS  
Driver = /usr/local/lib/libtdsodbc.so  
Trace = Yes  
TraceFile=/tmp/odbcinst.log  
UsageCount = 1  

odbc.ini

[SQLSERVER]  
Driver = TDS  
Description = sql server dsn  
Trace = NO  
Server = 172.21.32.20  
Database = Live  
Port = 1433  
TDS_Version = 7.2  
TraceFile=/tmp/sqlserver.log  

片段:

QString f3ErpDsn = QString::fromLocal8Bit("Driver={SQLSERVER};server=172.21.32.20;database=Live;uid=inp;pwd=inp;");
QSqlDatabase f3ErpDb= QSqlDatabase::addDatabase("QODBC");
f3ErpDb.setDatabaseName(f3ErpDsn);
// f3ErpDb.setDatabaseName("SQLSERVER");
f3ErpDb.setUserName("inp");
f3ErpDb.setPassword("inp");
QString sqlCmdStr = "select * from dbo.Table_Drilling_Data01 where status=1";
if ( ! f3ErpDb.open() )
{
        qDebug() << f3ErpDb.lastError().text();
        return 1;
}
QSqlTableModel model;
model.setTable("dbo.Table_Drilling_Data01");
model.setFilter("status=3");
model.select();
qDebug() << model.lastError().text();

错误信息:

  1. f3ErpDb.setDatabaseName(f3ErpDsn);
    如果setDatabaseNamef3ErpDsn错误消息是:

    “QODBC3:无法连接”、“[unixODBC][驱动程序管理器]未找到数据源名称,且未指定默认驱动程序”)

    我在 odbc.ini 中定义了 SQLSERVER。为什么它找不到呢?

  2. 但如果我改变了f3ErpDb.setDatabaseName("SQLSERVER");,错误信息是:

    “[FreeTDS][SQL Server]传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。参数 1 (""): 数据类型 0x00 未知。QODBC3: 无法执行语句”

这让我很困惑,有人可以帮助我吗?

4

2 回答 2

0

我不确定 QSqlDatabase 是什么。但似乎您的 SQL 连接字符串不正确。

尝试这样的事情:

UID=inp;PWD=inp;DSN=SQLSERVER;database=Live;SERVER=AMIN\SQLEXPRESS;charset=UTF-8

DSN=SQLSERVER因为SQLSERVER是您的唯一定义的 DSNodbc.ini

SERVER=AMIN\SQLEXPRESS- 尝试 SQL Server 的 Windows 名称,而不是主机的 IP 地址(我不确定此处不允许使用 IP,但 Windows 名称 100% 有效)

于 2012-10-29T16:07:33.257 回答
0

我遇到了同样的问题,当我将 TDS 协议更改为 8.0 时解决了它,之前是 7.0。我通过 Qt 使用 freetds、unixodbc 连接到 MSSQL 数据库。

于 2013-11-18T14:17:18.580 回答