none
DataSet 讀取造字發生錯誤 RRS feed

  • 問題

  •  

    工具:VS2005 ASP.NET

    前端:webform

    資料庫: Informix

     

    目前寫網頁碰到的問題,我利用odbc連接到informix,發現特定資料會無法傳給Dataset,

    一查之下發現是Informix的中文造字欄位,程式如下

     

    程式碼區塊

            Dim Adp As New Odbc.OdbcDataAdapter
            Dim Conn As New Odbc.OdbcConnection
            Dim Cmd As New Odbc.OdbcCommand
            Dim Ds As New DataSet

            Dim Rd As Odbc.OdbcDataReader


            Conn.ConnectionString = "Dsn=Informix;Uid=uid;Pwd=pwd"
            Conn.Open()

            Cmd.Connection = Conn
            Cmd.CommandText = "Select A,b From C Where A='1'"
            Adp.SelectCommand = Cmd
            Adp.Fill(Ds) ==>到這行就發生以下錯誤

     

    ERROR [HY000] [Informix][Informix ODBC Driver]Unspecified System Error =  -21000.

     

     

    這筆結果只有一筆資料,於是我又用Datareader來取資料

    取欄位A的時沒有問題,取到欄位B(中文造字)就掛了,錯誤同上

     

    如果該欄位屬正常的中文,就不會發生錯誤

     

    於是我拿出VB6.0,用Ado來做同樣的事

    居然,Ado做到了,程式如下

     

    程式碼區塊

    Dim Conn As New ADODB.Connection
    Dim Rs As New ADODB.Recordset
    Dim Sql As String

    Sql = "Select A,b From C Where A='1'"
    Conn.Open "Dsn=Informix;Uid=uid;Pwd=pwd"

    Rs.Open Sql, Conn

    If Not Rs.EOF Then
        Do While Not Rs.EOF
            MsgBox "Client=" & Rs(0) & Space(3) & "Names=" & Rs(1)
            Rs.MoveNext
        Loop
    End If

     

     

    想請教各位高手,

    Ado.net跟Ado對於無法識別的中文讀取方式,差別在那?

    是否在Ado.net也能得到正確的結果???

     

    謝謝

    2007年11月16日 上午 08:51

所有回覆

  • 以前有遇過類似問題,是造字編碼的問題,也就是原本舊的是用big5..而.net都以utf-8....不知道你是否類似問題~~

     

    2007年11月22日 上午 09:18
  • 你的 Server 有這個造字檔嗎?

     

    .Net 的字串中,若某個從 big5(ANSI/big5e等) 轉換過來的字,若不存在於 Unicode 跟 big5 的對照表時,就會自動變成 ? 。

     

    印象中 informix 是用 ANSI 存字串,並沒有支援 Unicode ,這樣在碰上造字可能會出問題。

     

    VB6 允許字串記憶體中不為 Unicode ,不像 .Net 會自動過濾,在 .Net 中非 Unicode 的字串只能以 Byte() 方式存在,否則都會掉字。

    2007年11月22日 上午 10:00
  • 先謝謝璉璉 Thinker兩位的回答

     

    SERVER上並沒有造字檔,坦白說,就算有我也不想用,

     

    因為如果要依靠造字檔對應的話,那天又造了幾個新字,SERVER這邊忘了更新,還是一樣會出問題

     

    其實如果只是中文顯示不出來,或是亂碼都還好

     

    但他是整個掛掉,連一筆資料下不來,也影響到同一次查詢內其他正常的資料

     

    我現在的做法只好是

     

    在.net參考舊的ADO,然後用RecoreSet接到資料後

     

    再利用OleDbDataAdapter將RecordSet的資料轉給DataSet

     

    先將就著用

     

    如果有達人有更好的做法也請不吝指教

     

    2007年11月22日 下午 12:29