MySql Blob圖片類型儲存Bug解決:索引超出了數組界限錯誤

來源:互聯網
上載者:User

告別了一周多的網路,終於迴歸,突見群裡,有網友提了以下問題:

CYQ.Data架構測試:mysql資料庫測試(儲存blob類型的資料會出問題) ,針對mysql資料庫做測試:發現更新blog欄位,總是儲存System.Byte[]

 

既然網友提出了問題,本地再實驗一下:

先在本地裝了個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有問題,為此,在編寫進行多資料庫支援的架構時,總會時不時的遇到好多問題,別糾結,始終要解決。

 

原文地址:http://www.cyqdata.com/cyq1162/article-detail-54329 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.