我有一個構建在RHEL 5上的C++應用程序,它通過位於Windows機器上的freeTDS和unixODBC連接到MS SQL 2008。無法在MS SQL 2008中通過freetds unixODBC插入unicode字符
這是應用程序發送到數據庫的查詢。
INSERT INTO mytable (SAMPLE) VALUES(N'乕乭乺丕')
[email protected]@Iz
被調用上述查詢時被實際插入到數據庫中。
以下是我使用的配置 -
== freetds.conf ==
[myserver.mydomain.com]
client charset = UTF-16
debug flags = 0xffff
dump file = /tmp/dump.log
dump file append = yes
host = 127.0.01
port = 1433
tds version = 7.3
== odbcinst.ini ==
[FreeTDS Driver]
Description = FreeTDS
Driver = /usr/lib64/libtdsodbc.so.0
== odbc.ini ==
[mydsn]
Description = MS SQL connection to 'mydb' database
Driver = FreeTDS Driver
Servername = myserver.mydomain.com
Port = 1433
TDS_Version = 7.3
Database = mydb
UserName = sa
Password = mypassword
Trace = Yes
TraceFile = /tmp/odbc.log
ForceTrace = Yes
我可以直接通過
INSERT INTO mytable (SAMPLE) VALUES(N'乕乭乺丕')
但不是通過freetds的和unixODBC的數據插入到數據庫
請查找代碼我使用如下:
#include <iostream>
#ifdef WIN32
#include <windows.h>
#endif
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include "unicode/ustdio.h"
using namespace std;
int main (int argc, char* argv[])
{
SQLHSTMT hSQLStatement = 0;
SQLHENV hSQLEnvironment = 0;
SQLHDBC hSQLODBC = 0;
SQLRETURN sqlRet = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hSQLEnvironment);
if(SQL_SUCCEEDED(sqlRet))
{
sqlRet = SQLSetEnvAttr(hSQLEnvironment,
SQL_ATTR_ODBC_VERSION,
(void*)SQL_OV_ODBC3,
0);
if(SQL_SUCCEEDED(sqlRet))
{
sqlRet = SQLAllocHandle(SQL_HANDLE_DBC,
hSQLEnvironment,
&hSQLODBC);
}
else
{
cout << "Error in SQLAllocHandle for SQL_HANDLE_DBC" << endl;
}
}
else
{
cout << "Error in SQLAllocHandle for SQL_HANDLE_ENV" << endl;
}
UnicodeString DSNName = "mydsn";
UnicodeString UserName = "sa";
UnicodeString Password = "mypassword";
UnicodeString Value = "";
UChar32 character = 20053;
Value.append(character);
character = 20077;
Value.append(character);
character = 131140;
Value.append(character);
character = 131145;
Value.append(character);
character = 20090;
Value.append(character);
character = 19989;
Value.append(character);
UnicodeString SQLStatement = "INSERT INTO mytable (sample) VALUES(N";
SQLStatement.append("'");
SQLStatement.append(Value);
SQLStatement.append("'");
SQLStatement.append(")");
if(0 != hSQLODBC)
{
SQLRETURN sqlRet = SQLConnectW(hSQLODBC,
(SQLWCHAR*)DSNName.getTerminatedBuffer(),
SQL_NTS,
(SQLWCHAR*)UserName.getTerminatedBuffer(),
SQL_NTS,
(SQLWCHAR*)Password.getTerminatedBuffer(),
SQL_NTS);
if(SQL_SUCCEEDED(sqlRet))
{
cout << "Connection to database successful" << endl;
SQLRETURN sqlRet = SQLAllocHandle(SQL_HANDLE_STMT,
hSQLODBC,
&hSQLStatement);
if(SQL_SUCCEEDED(sqlRet))
{
sqlRet = SQLExecDirectW(hSQLStatement,
(SQLWCHAR*)SQLStatement.getTerminatedBuffer(),
SQL_NTS);
if(SQL_SUCCEEDED(sqlRet))
{
cout << "Query Execution successful" << endl;
}
else
cout << "Query Execution failed" << endl;
}
}
else
{
cout << "Connection to database failed" << endl;
}
}
return 0;
}
有什麼想法可能是錯誤的?
編輯1:添加示例代碼
編輯2:更新按照奧利弗的建議
「SAMPLE」列的數據類型必須爲「NVARCHAR」 –
是數據類型爲「NVARCHAR」 – D3XT3R
您使用的是哪種FreeTDS版本? 0.95,0.91? TDS版本7.3僅在FreeTDS 0.95中受支持。我相信0.91附帶RHEL 6,但我不確定RHEL 5. – FlipperPA