天天看點

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

告别了一周多的網絡,終于回歸,突見群裡,有網友提了以下問題:

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

先在本地裝了個mysql,又裝了個navicat管理工具,又建立了個工程來測試:

簡單的測試方法,就是放一個按鈕,點選一下,讀取遠端圖檔,然後存到資料庫,再讀取出來顯示到界面上。

管理工具随意建了個表“d1”,弄了三個id,img,name三個字段。

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

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

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"));

                }

        }

}

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

解決與調試經過:

經本地測試,調試,發現對blob類型的參數指派時,抛出異常:索引超出了數組界限。

異常太迷惑,網上搜了一下,有人說是:mysql.dll的版本問題,花了一個csdn積分下了一個6.2.3版本,還是不頂用。 

然後無意識的進行調試,估計運氣問題,竟然讓我發現了問題所在,隻能說是運氣好。

看一段小代碼,對參數的指派,參數多資料庫支援時,類似這種寫法:

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

 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 Blob圖檔類型存儲Bug解決:索引超出了數組界限錯誤

這代碼其實很簡單:

産生了一個參數,然後賦參數名,參數值,參數類型,參數大小和參數指向。

而mysql竟然在對參數size指派的問題處理上有些bug。

當我調試跳過對para.size指派時,竟然正常了。

于是代碼改成了這樣:

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

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

經過測試,其它資料庫類型對size的指派是正常的,唯mysql有問題,為此,在編寫進行多資料庫支援的架構時,總會時不時的遇到好多問題,别糾結,始終要解決。