程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySql Blob圖片類型存儲Bug解決

MySql Blob圖片類型存儲Bug解決

編輯:關於MYSQL數據庫

    先在本地裝了個Mysql,又裝了個navicat管理工具,又新建了個工程來測試:
    簡單的測試方法,就是放一個按鈕,點擊一下,讀取遠程圖片,然後存到數據庫,再讀取出來顯示到界面上。
    管理工具隨意建了個表“D1”,弄了三個id,img,name三個字段。


    示例代碼如下,因為測試,代碼就沒寫的太規范:


    protected void btnTest_Click(object sender, EventArgs e)
    {
    string url = "http://www.baidu.com/img/baidu_jgylogo3.gif";
    bool result = false;
    int id = 0;
    string conn = "host=127.0.0.1;Port=3306;Database=test;uid=root;pwd=123456";
    // string conn = "server=.;database=demo;uid=sa;pwd=123456";
    using (MAction action = new MAction("d1", conn))
    {
    WebClient wc = new WebClient();
    try
    {
    //if (action.Fill(2))
    //{
    byte[] data = wc.DownloadData(url);
    action.Set("img", data);
    action.Set("name", "ldf");
    result = action.Insert(InsertOp.ID);
    id = action.Get<int>("id");
    //}
    }
    catch (Exception err)
    {
    Log.WriteLogToTxt(err);
    }
    }
    if (result)//再開一個讀取試試
    {
    using (MAction action = new MAction("d1", conn))
    {
    if (action.Fill(id))
    {
    Response.BinaryWrite(action.Get<byte[]>("img"));
    }
    }

    }

    解決與調試經過:

    經本地測試,調試,發現對blob類型的參數賦值時,拋出異常:索引超出了數組界限。
    異常太迷惑,網上搜了一下,有人說是:Mysql.dll的版本問題,花了一個csdn積分下了一個6.2.3版本,還是不頂用。
    然後無意識的進行調試,估計運氣問題,竟然讓我發現了問題所在,只能說是運氣好。


    看一段小代碼,對參數的賦值,參數多數據庫支持時,類似這種寫法:


    DbParameter para = _fac.CreateParameter();//通過工廠廣告獲得當前數據庫類型的參數
    para.ParameterName = parameterName;
    para.Value = value == null ? DBNull.Value : value;
    para.DbType = dbType;

    if (size > -1)//設定長度。
    {
    para.Size = size;
    }
    para.Direction = direction;


    這代碼其實很簡單:

    產生了一個參數,然後賦參數名,參數值,參數類型,參數大小和參數指向。
    而Mysql竟然在對參數Size賦值的問題處理上有些Bug。


    當我調試跳過對para.Size賦值時,竟然正常了。

    於是代碼改成了這樣:

    if (dbType != DbType.Binary && size > -1)//mysql不能設定長度,否則會報索引超出了數組界限錯誤。


    然後我測試了下其它數據庫,發現指定size是正常的,最後得出一結論:

    經過測試,其它數據庫類型對Size的賦值是正常的,唯Mysql有問題,為此,在編寫進行多數據庫支持的框架時,總會時不時的遇到好多問題,別糾結,始終要解決。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved