The forum will be down for maintenance over the weekend of August 18-20, 2017. The forum will be shut down on the evening (EDT) of Friday, August 18. Downtime is unknown but may be up to two days. The forum will be restarted as soon as maintenance is complete.

I am trying to update a Sybase table via Microsofts ODBC API. The following is the basics of the C++ I am trying to execute. In table, TableNameXXX, ColumnNameXXX has a type of NVARCHAR( 200 ).

    SQLWCHAR updateStatement[ 1024 ] = L"UPDATE TableNameXXX SET ColumnNameXXX = N'Executive Chair эюя' WHERE PKEYXXX = 'VALUE'";  
   if( ret = SQLExecDirect( hstmt, ( SQLWCHAR* ) updateStatement, SQL_NTS ) != SQL_SUCCESS )
   {
       // Handle Error
   }

The Sybase database has a CatalogCollation of 1252LATIN1, CharSet of windows-1252, Collation of 1252LATIN1, NcharCharSet of UTF-8 and an NcharCollation of UCA.

Once this works for the Sybase ODBC connection I need to get it to work in various other ODBC drivers for other databases.

I do not get any errors however - the data in the database is not the unicode I attempted to update.

Does anyone know how to get this to work? What am I missing?

asked 05 Feb '15, 17:59

David%20Gray%20Wright's gravatar image

David Gray W...
51226
accept rate: 0%

edited 06 Feb '15, 04:07

Volker%20Barth's gravatar image

Volker Barth
30.9k311457668


Hi David,

SQL statements are always parsed in the character set of the database (so Windows-1252 in this case). If you wish to pass Unicode/NCHAR data, you need to do one of the following (from: http://dcx.sap.com/index.html#sa160/en/dbadmin/natlang-s-5322854.html )

  • Use the UNISTR function to specify the Unicode character values
  • Use a host variable to specify the Unicode character values ('?')
  • Use UTF-8 as the database character set

So for ODBC, you will want to use prepared execution with SQLPrepare, SQLBindParameter, and SQLExecute.

permanent link

answered 05 Feb '15, 18:55

Jeff%20Albion's gravatar image

Jeff Albion
10.7k171174
accept rate: 24%

Sorry... but... the second option "Use a host variable to specify the Unicode character values ('?')" is that the same as using a prepared execution?

(05 Feb '15, 19:50) David Gray W...
Replies hidden
1

Got it working with SELECT UNISTR...

SQLWCHAR updateStatement[ 1024 ] = L"UPDATE TableNameXXX SET ColumnNameXXX = ( SELECT UNISTR( 'Executive Chair \u044F\u044D\u044E\u044F' ) ) WHERE PKEYXXX = 'VALUE'";

Thanks for your help.

(05 Feb '15, 22:22) David Gray W...

Yes - the second option is using a host variable and then binding it with data (a.k.a prepared execution).

(06 Feb '15, 10:21) Jeff Albion
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×125
×11
×10
×6

question asked: 05 Feb '15, 17:59

question was seen: 1,094 times

last updated: 06 Feb '15, 10:21