I have a c++ application built on RHEL 5 that connects to MS SQL 2008 through freeTDS and unixODBC situated on a windows machine.
This is the query the application sends to the database.
INSERT INTO mytable (SAMPLE) VALUES(N'乕乭乺丕')
Um@D@Iz
is actually inserted into the database when the above query is invoked.
Following are the configurations which I am using -
== 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
I can directly insert the data into the database through
INSERT INTO mytable (SAMPLE) VALUES(N'乕乭乺丕')
but not through freeTDS and unixODBC
Please find the code which i am using below:
#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;
}
Any idea what might be wrong here?
EDIT 1: Added sample code
EDIT 2: Updated as per Oliver's suggestion