最近同事在寫程式讀取 MySQL 中的資料並以 GridView 呈現出來時,發現有一個欄位不見了!? 程式中並沒有做將該欄位隱藏的動作,但在畫面上看不到 IP 的欄位,也就是 IP 欄位整個不見了...
最近同事在寫程式讀取 MySQL 中的資料並以 GridView 呈現出來時,發現有一個欄位不見了!? 程式中並沒有做將該欄位隱藏的動作,但在畫面上看不到 IP 的欄位,也就是 IP 欄位整個不見了!
IP 欄位是一個 INT 型態的欄位,裡面存放的值是將格式為 xxx.xxx.xxx.xxx 的 IP 轉成一個整數值進行存放,取出時再將數值轉為 IP 格式傳回,這轉換的過程是使用 MySQL 的 Function INET_NTOA() 及 INET_ATON() 進行處理。
OdbcConnection conn = new OdbcConnection("...");
string strSQL = "Select Name, INET_NTOA(IP) As IP From Table";
OdbcDataAdapter da = new OdbcDataAdapter(strSQL, conn);
DataTable dt = new DataTable();
da.Fill(dt);
GridView1.DataSource = dt;
GridView1.DataBind();
先來看正確執行的畫面(2個欄位正常顯示出來):
實際執行後的結果(IP欄位消失):
SQL 語句很單純,就是撈出 2 個欄位而已,然到是 INET_NTOA() 的問題?
確實,將 INET_NTOA() 拿掉後就正常顯示出來了,只是欄位內容就變成是一串數字,並非我們看得懂的 IP 格式,檢查 DataTable 的內容發現,取出來 IP 的值是以 byte[] 型態存放的,所以將 byte[] 內容繫結至控制項就會無法顯示該欄位。
在 DataTable 中 IP 的內容是以 byte[] 存放:
google 查 INET_NTOA() 確實是傳回 string 型態的資料,所以 INET_NTOA() 是沒有問題的,後來試了可以使用下列 2 種解決方案:
1. | Select 時使用 CAST() 將取出的資料強制轉為 char 型態。 |
| |
此法是最直接簡單的,修改 SQL 即可。
| |
2. | 改用 MySql.Data.dll 元件進行資料庫連線處理。 |
| |
此法稍麻煩點,要修改使用的連線物件(將 Odbc 字樣改為 MySql 字樣),不過就不用考慮使用 CAST() 轉型的問題了。 |
我是使用第二個方案,因為使用 .NET 元件進行處理預設享有 Connection Pooling 機制,且比 ODBC 少了一層轉換的動作,理論上效率會比較好,而 ODBC 連線預設沒有啟用 Connection Pooling 的機制,須自行至控制台進行設定(註一)。
註一:
ODBC 設定 Connection Pooling 的方式如下:
1. 選擇 Windows 選單「控制台 > 系統管理工具 > 資料來源 (ODBC)」開啟設定視窗。
2. 選擇「連線共用區」頁籤下的 ODBC 選項 (此例為 MySQL ODBC 5.1 Driver)。
3. 連點 2 下 MySQL ODBC 5.1 Driver 開啟「設定連線共用區屬性」,將選項設定為要共用,並設定秒數。
4. 完成。
註二:
目前遇到 ODBC 連線時,除了 INET_NTOA() 外,DATE_FORMAT() 也會傳回 byte[] 型態的資料。
相關連結資料: |