On Wednesday, 5 December 2012 at 11:33:16 UTC, Regan Heath wrote:
On Wed, 05 Dec 2012 03:29:50 -0000, Sam Hu <samhudotsa...@gmail.com> wrote:

On Tuesday, 4 December 2012 at 10:05:16 UTC, Nathan M. Swan wrote:

I've never used ODBC before, but a quick scan of the MSDN docs suggests that you should use SQL_C_WCHAR instead, maybe using some D wstring functions too.

BTW, convert sql.ptr -> std.string.toStringz(sql); this is good practice, though I'm not sure it's your problem.

NMS

Appreciated the prompt help!Unfortunately I've not fixed the issue yet.Changing to SQL_C_WCHAR and contained the result value by wchar* does not help much.

If you make a complete working (but for the problem) code sample available I'll download it and try it here. I have some experience with ODBC and a working example in C/C++ to compare things with so I should be able to track it down. No promises tho, I am supposed to be working :p

R

So much thanks in advance!!!

My apologizes for the poor code but I am really expecting somebody help me on the issue.

Sorry I did not find proper way to upload attachment here so I paste all the source code below.
main code:
[code]
module odbcutiltest;

import std.stdio;
import std.string;
import std.conv;


import odbcutil;




int main()
{
    Odbc odbc=new Odbc;

//connect ODBC without setting up a DSN does not work at current. //odbc.connect("Driver= {Microsoft Access Driver(*.mdb)};DBQ=C:/Personnal/language/DLang/dbi_7zfromWeb/dbiallsamples/db1.mdb;");
        odbc.connect("artistDB","","");
        if(!odbc.isOpen)
                throw new Exception("ODBC connection failed.exit.");

    auto table=odbc.fetchAll("select * from artists");

    foreach(row;table)
    {
        
       foreach(column;row)
       {
                        writef("%s\t",column);
       }
       write("\n");
    }

    writeln("Read table successfully.");
    writeln("Insert a new record...");

    write("Please enter artist ID:");
    string id=chomp(readln);
    write("Please enter artist Name:");
    string name=chomp(readln);

    string sql="insert into artists values("~id~",'"~name~"');";
    int changed=odbc.executeNonQuery(sql);
    writefln("%d row affected.",changed);

    writeln("Done");


    readln;
    return 0;
}
[/code]

ODBC wrapper:
[code]
module odbcutil;

import std.stdio;
import std.string;
import std.conv;
import std.c.string;
import std.array;
import std.utf;

import win32.sql;
import win32.sqlext;
import win32.sqltypes;
import win32.sqlucode;
extern(Windows){SQLRETURN SQLExecDirectW(
     SQLHSTMT     StatementHandle,
     SQLWCHAR*    StatementText,
     SQLINTEGER   TextLength);
}


class Odbc
{
private:
    SQLHANDLE hEnv;
    SQLHANDLE hDbc;
    SQLHANDLE hStmt;
    SQLRETURN retCode;
    SQLINTEGER retErro;
    SQLINTEGER row;
    SQLSMALLINT col;


    bool bState;
    char* pszUName;
    char* pszUPassword;
    char* pszDSN;
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;

    }
public:
    this()
        {
                bState=false;
                //row=col=0;
                
retCode=SQLAllocHandle(SQL_HANDLE_ENV,cast(SQLHANDLE)null,&hEnv);
                if((retCode!=SQL_SUCCESS)&& (retCode != SQL_SUCCESS_WITH_INFO))
                {
                        
throw new Exception(format("Erro AllocHandle with retCode: %d",retCode));
                        return;
                }
retCode=SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,cast(SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER);
                if((retCode!=SQL_SUCCESS)&& (retCode != SQL_SUCCESS_WITH_INFO))
                {
                        
throw new Exception(format("Erro AllocHandle with retCode: %d",retCode));
                        SQLFreeHandle( SQL_HANDLE_DBC, hEnv );
                        return;
                }
                retCode=SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc);
                if((retCode!=SQL_SUCCESS)&& (retCode != SQL_SUCCESS_WITH_INFO))
                {
                        
throw new Exception(format("Erro AllocHandle with retCode: %d",retCode));
                        SQLFreeHandle( SQL_HANDLE_DBC, hEnv );
                        return;
                }
                
                //pszDSN=cast(char*)"odbcartists".ptr;


        }
        ~this()
        {
                close();
        }

        bool connect(string dsn,string username,string passwd)
        {
                if(bState==false)
                {
retCode=SQLConnect(hDbc,cast(SQLCHAR*)toStringz(dsn),SQL_NTS,cast(SQLCHAR*) toStringz(username),SQL_NTS,cast(SQLCHAR*)toStringz(passwd),SQL_NTS); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
                        {
                                
throw new Exception(format("Erro AllocHandle with retCode: %d",retCode));
                                SQLFreeHandle( SQL_HANDLE_DBC, hDbc );
                                return false;
                        }
                        retCode=SQLAllocHandle(SQL_HANDLE_STMT,hDbc,&hStmt);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
                        {
                                
throw new Exception(format("Erro AllocHandle with retCode: %d",retCode));
                                SQLDisconnect( hDbc );
                                SQLFreeHandle( SQL_HANDLE_DBC, hDbc);
                                return false;
                        }
                }
                bState=true;
                
                
                return true;
        }
        
//@@@bug:connect ODBC without DSN failed ,but I don't know why.If anybody know about it,
        //@@@kindly let me know with thanks!!!!
        bool connect(string connectionString)
        {
                
                SQLCHAR connStrOut[256];
                SQLSMALLINT connStrOutLen;
                
                if(bState==false)
                {
retCode=SQLDriverConnect(hDbc, null, cast(SQLCHAR*)toStringz(connectionString), SQL_NTS, cast(ubyte*)connStrOut, connStrOut.length, &connStrOutLen, SQL_DRIVER_COMPLETE); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
                        {
                                
throw new Exception(format("Erro AllocHandle with retCode: %d",retCode));
                                SQLFreeHandle( SQL_HANDLE_DBC, hDbc );
                                return false;
                        }
                        retCode=SQLAllocHandle(SQL_HANDLE_STMT,hDbc,&hStmt);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
                        {
                                
throw new Exception(format("Erro AllocHandle with retCode: %d",retCode));
                                SQLDisconnect( hDbc );
                                SQLFreeHandle( SQL_HANDLE_DBC, hDbc);
                                return false;
                        }
                }
                bState=true;
                
                
                return true;
                
        }
        /*
        string escape (string str)
        {
                char[] result;
                size_t count = 0;

                
                result.length = str.length * 2;

                for (size_t i = 0; i < str.length; i++) {
                        switch (str[i]) {
                                case '"':
                                case '\'':
                                case '\\':
                                        result[count++] = '\\';
                                        break;
                                default:
                                        break;
                        }
                        result[count++] = str[i];
                }

                result.length = count;
                return std.conv.to!string(result);
        }
        */
int executeQuery(const char* pszSql)
{

    if(pszSql is null )
       return 0;

    writefln("hStmt=%s",cast(int)hStmt);
    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 -1;
    }
        
    retCode=SQLNumResultCols(hStmt,&col);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
    {

throw new Exception(format("Error AllocHandle with retCode: %d",retCode));
       return -1;
    }
    row=0;
    while(SQL_NO_DATA!=SQLFetch(hStmt))
    {

       row++;
    }
    SQLCancel(hStmt);
    return rowCount;
}
int executeQuery(string sql)
{
        return executeQuery(std.utf.toUTFz!(const(char)*)(sql));
        //return executeQuery(sql.ptr);
}
int executeNonQuery(const char* pszSql)
{
    row=0;
    if(pszSql is null )
       return 0;

    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 -1;
    }
    retCode=SQLRowCount(hStmt,&row);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
    {
throw new Exception(format("Error AllocHandle with retCode: %d",retCode));
       return -1;
    }
    retCode=SQLNumResultCols(hStmt,&col);
if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO))
    {
throw new Exception(format("Error AllocHandle with retCode: %d",retCode));
       return -1;
    }

    SQLCancel(hStmt);
    return row;
}
int executeNonQuery(string sql)
{
        return executeNonQuery(std.utf.toUTFz!(const(char)*)(sql));
        //return executeNonQuery(sql.ptr);
}
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];
       //dchar* pszBuf;
       //wchar[] pszBuf;
       char* pszBuf;
       SQLINTEGER  buflen;
       //string[] rowData=new string[col+1];
       string[] rowData;
       if(SQLFetch(hStmt)==SQL_NO_DATA)
       {
           break;
       }
       for(int i=1;i<=col;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]='\000';
SQLGetData(hStmt,cast(ushort)i,SQL_C_CHAR,pszBuf,50,cast(int*)&buflen);
           //pszBuf[buflen]='\0';

           rowData~=to!string(pszBuf);


       }
       v~=rowData;
       row++;

    }
    SQLCancel(hStmt);
    return v;
}
string[][] fetchAll(string sql)
{
        
        return fetchAll(sql.ptr);
}
bool close()
{
    if(bState)
    {
       SQLDisconnect(hDbc);
       SQLFreeHandle(SQL_HANDLE_DBC,hDbc);
       SQLFreeHandle(SQL_HANDLE_ENV,hEnv);
       bState=false;
    }

    return true;
}
bool isOpen()
{
    return bState;
}


        int rowCount()
        {
                return row;
        }
        int colCount()
        {
                return col;
        }
}

[/code]

Reply via email to