MS ODBC encoding issue

Sam Hu samhudotsamhu at gmail.com
Mon Dec 3 23:59:39 PST 2012


Greetings!

Any help would be much appreicated in advance as I've really 
struggled for quite long time!

I wrote a class wrapper for MS ODBC Access database.When I try to 
run query on an Access database file,all fields contains English 
character are fine with the result,but for those Asian characters 
like Chinese,the result shows blank in DFL gui form and shows 
mess (unrecognizable under console).I think maybe the problem is 
in the fetchAll function which I provided as below together with 
the other main parts of the class:
Client code (DFL form):
[code]
protected void onReadClick(Object sender,EventArgs e)
{
		Odbc odbc=new Odbc;
		odbc.connect("artistdb","","");
		if(!odbc.isOpen)
		{
			throw new Exception("Failed to connect to ODBC");
			return;
                 }
		auto record=odbc.fetchAll("select * from artists where 
artistid="~txtSearch.text~";");
		txtID.text=to!string(record[0][0]);
		txtName.text=to!string(record[0][1]);
		odbc.close;
	}
[/code]

ODBC wrapper class:
[code]
SQLRETURN SQLExecDirectUTF8(SQLHSTMT stmt,string text,SQLINTEGER 
tl)
{
        SQLRETURN retcode;
        //uint16* utf16=UTF8toUTF16(text,null);
        
retcode=SQLExecDirectW(stmt,cast(SQLWCHAR*)toUTF16z(text),tl);

        return retcode;

}
string[][]  fetchAll(const char* pszSql)
{
     string[][] v;

     if(pszSql is null )
        return null;
     retCode=SQLExecDirectUTF8(hStmt,to!string(pszSql),SQL_NTS);
     if((retCode != SQL_SUCCESS) && (retCode != 
SQL_SUCCESS_WITH_INFO))
     {
        throw new Exception(format("Error AllocHandle with 
retCode: %d",retCode));
        return null;
     }
	
     retCode=SQLNumResultCols(hStmt,&col);
     if((retCode != SQL_SUCCESS) && (retCode != 
SQL_SUCCESS_WITH_INFO))
     {
        throw new Exception(format("Error AllocHandle with 
retCode: %d",retCode));
        return null;
     }
     row=0;
     SQLINTEGER colLen = 0;
     SQLSMALLINT buf_len = 0;
     SQLINTEGER colType = 0;

     while(true)
     {
        char sz_buf[256];
        char* pszBuf;
        SQLINTEGER  buflen;
        string[] rowData=new string[col+1];

        if(SQLFetch(hStmt)==SQL_NO_DATA)
        {
            break;
        }
        for(int i=1;i<=colCount;i++)
        {
            SQLColAttribute(hStmt, cast(ushort)i, SQL_DESC_NAME, 
sz_buf.ptr, 256, &buf_len, cast(void*)0);
            SQLColAttribute(hStmt, cast(ushort)i, SQL_DESC_TYPE, 
cast(void*)0, 0, cast(short*)0, &colType);
            SQLColAttribute(hStmt, cast(ushort)i, SQL_DESC_LENGTH, 
null, 0, cast(short*)0, &colLen);
            pszBuf=cast(char*)(new char[colLen+1]);
            //pszBuf[0]='\0';
            
SQLGetData(hStmt,cast(ushort)i,SQL_C_CHAR,pszBuf,50,cast(int*)&buflen);
            pszBuf[buflen]='\000';
            rowData[i-1]=to!string(pszBuf);


        }
        v~=rowData;
        row++;

     }
     SQLCancel(hStmt);
     return v;
}
string[][] fetchAll(string sql)
{
	
	return fetchAll(sql.ptr);
}
[/code]


More information about the Digitalmars-d-learn mailing list