[MySQL] 使用 DATE_FORMAT()、INET_NTOA() 取出資料時要注意取出的欄位型態

  • 8166
  • 0
  • C#
  • 2009-06-22

最近同事在寫程式讀取 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個欄位正常顯示出來):
2個欄位正常顯示出來

實際執行後的結果(IP欄位消失):
IP欄位消失

SQL 語句很單純,就是撈出 2 個欄位而已,然到是 INET_NTOA() 的問題?
確實,將 INET_NTOA() 拿掉後就正常顯示出來了,只是欄位內容就變成是一串數字,並非我們看得懂的 IP 格式,檢查 DataTable 的內容發現,取出來 IP 的值是以 byte[] 型態存放的,所以將 byte[] 內容繫結至控制項就會無法顯示該欄位。

在 DataTable 中 IP 的內容是以 byte[] 存放:
DataTable 中 IP 的內容

 

google 查 INET_NTOA() 確實是傳回 string 型態的資料,所以 INET_NTOA() 是沒有問題的,後來試了可以使用下列 2 種解決方案:

1.Select 時使用 CAST() 將取出的資料強制轉為 char 型態。
 

string strSQL = "Select Name, CAST(INET_NTOA(IP) As CHAR) As IP From Table"; 
 
 

此法是最直接簡單的,修改 SQL 即可。

 

2.改用 MySql.Data.dll 元件進行資料庫連線處理。
 

string strConn = "...";                                         
MySqlConnection conn = new MySqlConnection(strConn);           
string strSQL = "Select name, INET_NTOA(ip) as IP From table1";
MySqlDataAdapter da = new MySqlDataAdapter(strSQL, conn);      
DataTable dt = new DataTable();                                
da.Fill(dt);                                                   
GridView1.DataSource = dt;                                     
GridView1.DataBind();                                          
 此法稍麻煩點,要修改使用的連線物件(將 Odbc 字樣改為 MySql 字樣),不過就不用考慮使用 CAST() 轉型的問題了。

 

我是使用第二個方案,因為使用 .NET 元件進行處理預設享有 Connection Pooling 機制,且比 ODBC 少了一層轉換的動作,理論上效率會比較好,而 ODBC 連線預設沒有啟用 Connection Pooling 的機制,須自行至控制台進行設定(註一)。

 

註一:
ODBC 設定 Connection Pooling 的方式如下:
1. 選擇 Windows 選單「控制台 > 系統管理工具 > 資料來源 (ODBC)」開啟設定視窗。
2. 選擇「連線共用區」頁籤下的 ODBC 選項 (此例為 MySQL ODBC 5.1 Driver)。   
    ODBC 資料來源管理員 - 連線共用區
3. 連點 2 下 MySQL ODBC 5.1 Driver 開啟「設定連線共用區屬性」,將選項設定為要共用,並設定秒數。 
    連線共用區屬性
4. 完成。

 

註二:
目前遇到 ODBC 連線時,除了 INET_NTOA() 外,DATE_FORMAT() 也會傳回 byte[] 型態的資料。

 

相關連結資料: