全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4161
推到 Plurk!
推到 Facebook!

為啥無法存圖片進入MySql的Blob欄位中

尚未結案
hillel5021
一般會員


發表:5
回覆:11
積分:3
註冊:2003-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-01 00:24:38 IP:61.58.xxx.xxx 未訂閱
請問各位前輩,為啥我無法將圖片存入MySql的Blob的欄位中,每次存入都出現Invalid class typecast 或 MyODBC無法存入的問題,在此附上程式碼,請各位前輩幫幫我解答,謝謝 謝謝 FUNCTION JPEGSentinelsAreOK(CONST Filename: TFilename): BOOLEAN; VAR FileStream: TFileStream; w1 : WORD; // a "word" is always 2 bytes long w2 : WORD; BEGIN ASSERT(SizeOf(WORD) = 2); RESULT := FileExists(Filename); IF RESULT THEN BEGIN FileStream := TFileStream.Create(Filename, fmOpenRead OR fmShareDenyNone); TRY FileStream.Seek(0, soFromBeginning); // use seek or position FileStream.Read(w1,2); FileStream.Position := FileStream.Size - 2; FileStream.Read(w2,2) FINALLY FileStream.Free END; RESULT := (w1 = $D8FF) AND (w2 = $D9FF); END; END; procedure TForm2.Button3Click(Sender: TObject); VAR JPEGImage:TJPEGImage; fS : TMemoryStream; begin IF OpenpictureDialog1.Execute THEN BEGIN IF JPEGSentinelsAreOK(OpenpictureDialog1.Filename) THEN BEGIN JPEGImage := TJPEGImage.Create; TRY JPEGImage.LoadFromFile(OpenPictureDialog1.Filename); Image1.Picture.Graphic := JPEGImage; try fs:=TMemoryStream.Create; JPEGImage.SaveToStream(fs); Table1.Append; Table1.FieldByName('題目ID').AsInteger:=Table1.RecordCount 1; TBlobField(Table1.FieldByName('圖片')).LoadFromFile(OpenpictureDialog1.Filename); Table1.Post; finally fs.Free; end; FINALLY JPEGImage.Free END; END; END; end; procedure TForm2.DBGrid1DblClick(Sender: TObject); var bS : TBlobStream; Pic : TJpegImage; begin if DBGrid1.SelectedField = TDBGrid(Sender).DataSource.DataSet.FieldByName('圖片') then bS := TBlobStream.Create(TBlobField(Table1.FieldByName('圖片')), bmWrite); // AdoTable1Picture為欄位名稱。 try Pic:=TJpegImage.Create; try Pic.LoadFromStream(bS); Image1.Picture.Assign(Pic); finally Pic.Free; end; finally bS.Free end; end; end.
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-01 09:18:53 IP:218.16.xxx.xxx 未訂閱
這參考拙作 : 發表】在數據庫以jpeg儲存經規格化的 bmp/jpg 圖片實作示範 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27715 我用以下句式在 MySQL 組建 Table 並將 Table1 之 Alias 及 TableName 改成這 Table : CREATE TABLE `jpegpic` ( `PicName` varchar(20) NOT NULL default '', `Pic` blob, PRIMARY KEY (`PicName`) ) TYPE=MyISAM CHARSET=latin1 執行完全無誤,存取均OK。
hillel5021
一般會員


發表:5
回覆:11
積分:3
註冊:2003-05-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-01 13:39:33 IP:61.58.xxx.xxx 未訂閱
謝謝Justmade前輩為我解答,我將程式碼改為如下:var S : TBlobStream; begin if not openpictureDialog1.Execute then exit; if not (Table1.state in [dsEdit, dsInsert]) then Table1.Edit; S := TBlobStream.Create(TBlobField(Table1.FieldByName('圖片')),bmWrite); try Image1.Picture.Assign(StretchImageRatio(openpictureDialog1.FileName,300,300,70,true)); Table1.Append; Table1.FieldByName('圖片名稱').AsString:=IntToStr(Table1.RecordCount 1); Table1.FieldByName('題目ID').AsInteger:=Table1.RecordCount 1; Image1.Picture.Graphic.SaveToStream(S); Table1.Post; finally S.Free; end; end; 但卻出現以下錯誤訊息,拜託前輩幫我看看,謝謝 raised exception class EDBEngine with message \General SQL error [TCX][MyODBC]You have an error in your SQL syntax near 'M....... 一堆亂碼
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-01 14:01:28 IP:218.16.xxx.xxx 未訂閱
你應要 insert 後才使用 S := TBlobStream.Create(TBlobField(Table1.FieldByName('圖片')),bmWrite); 你使用我的範例也有 error 嗎?
hillel5021
一般會員


發表:5
回覆:11
積分:3
註冊:2003-05-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-01 22:56:02 IP:61.58.xxx.xxx 未訂閱
真的謝謝Justmade熱心幫我解決問題,真的謝謝,但是我所寫的那個錯誤訊息就是用了前輩的範例後出現的訊息,不知道是不是我哪裡沒設定好,或是跟我的MySql(3.23版)或MyODBC版本有關嗎?麻煩前輩再幫我看看,真的很感謝
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-02 08:47:59 IP:61.155.xxx.xxx 未訂閱
var Stream:TMemoryStream;    Stream:=TMemoryStream.Create; image1.Picture.Graphic.SaveToStream(stream); TBlobField(Table1.FieldByName('圖片') as BlobField).LoadFromStream(Stream); Stream.Free ;    参考一下!    风花雪月 e梦情缘
------
风花雪月 e梦情缘
hillel5021
一般會員


發表:5
回覆:11
積分:3
註冊:2003-05-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-02 10:18:56 IP:61.58.xxx.xxx 未訂閱
謝謝wnhoo和Justmade兩位前輩幫我解答,現在這兩種方法都出現如我下面回的錯誤訊息,不知道這錯誤訊息是什麼意思,有地方可以查嗎,謝謝你們的幫助
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-02 10:53:53 IP:218.16.xxx.xxx 未訂閱
1. 我是問你直接用我那 sql 建立 table 後直接用我的範例(要設定 Table1)有沒問題,不是說你改成你自己的 Project 後有沒問題。    2. 你有否如我上文所說把 S := TBlobStream.Create(TBlobField(Table1.FieldByName('圖片')),bmWrite); 放回 Table1.Append 之後呢? 還沒新增記錄便存取 Field 想也知道不行罷。 這些問題通常是你自己的程式出錯版本應沒影響。
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-02 11:30:59 IP:61.155.xxx.xxx 未訂閱
我认为Justmade和我的方法都是没有错的,不知道您的代码是怎么写的。 请将您的代码及BDE或ODBC配置、数据库字段类型帖出来,大家帮你参考一下!    风花雪月 e梦情缘
------
风花雪月 e梦情缘
hillel5021
一般會員


發表:5
回覆:11
積分:3
註冊:2003-05-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-02 12:36:52 IP:61.58.xxx.xxx 未訂閱
for Justmade前輩:我在MySql中照你說的建了個資料表,然後用你的程式去連接存取,結果也是出現一樣的錯誤訊息耶,怎會這樣阿,是不是真的是MySql的問題阿 for wnhoo前輩:我的程式中資料庫資料是 資料庫:MySql(3.23) MyODBC for Delphi(myodbc-2.50.39-nt) 連結方式:BDE:TTable DataSource DBGrid 資料表: 欄位名稱 型態 圖片 BLOB 圖片名稱 char(20) 為啥都會出現那訊息阿?謝謝你們的幫忙,謝謝
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-04 13:07:33 IP:61.155.xxx.xxx 未訂閱
    將圖檔存入Blob欄位最多只能?k http://delphi.ktop.com.tw/topic.php?topic_id=161    將大型圖檔存入資料庫的示範程式  http://delphi.ktop.com.tw/topic.php?TOPIC_ID=19505    如何用ado query 存入圖片?  http://delphi.ktop.com.tw/topic.php?topic_id=32221    风花雪月 e梦情缘
------
风花雪月 e梦情缘
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-07-04 13:45:19 IP:192.168.xxx.xxx 未訂閱
若用BDE存BLOB有64K的限制,改用ADOTable或ADOQuery寫入就無此限制! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-07-06 08:55:30 IP:211.76.xxx.xxx 未訂閱
每次存入都出現Invalid class typecast 或 MyODBC無法存入的問題,在此附上程式碼 ----------------------------- 幫您測試過了 不是存入時發生錯誤 是在AfterScroll時將圖檔讀出時發生錯誤 改寫您的AfterScroll
procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
var
  jpeg : TJpegImage;
  S : TBlobStream;
begin
  if (not ADOTable1.Active) or (ADOTable1.FieldByName('PIC').Value = '') or (ADOTable1.FieldByName('PIC').Value = null) then
  begin
    Image1.Picture := nil;
    exit;
  end;
            TBlobField(ADOTable1.FieldByName('Pic')).savetofile('c:\test.jpg');
            Image1.Picture.LoadFromFile('c:\test.jpg');
            deletefile('c:\test.jpg');    end;
請再試看看 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
hillel5021
一般會員


發表:5
回覆:11
積分:3
註冊:2003-05-23

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-07-06 16:07:21 IP:61.58.xxx.xxx 未訂閱
我照你所說的去改了,結果按下一筆資料時,卻出現以下錯誤訊息,這到底是啥意思阿,很多前輩的做法試到最後都會出現這錯誤訊息 raised exeception class EOleException with message [MySQL][ODBC3.51Driver][mysql-3.23.52-nt] You have an error in your SQL syntax near '?x?3zv?D! \0..................一堆亂碼 到底是什麼意思阿,謝謝站長的幫忙 謝謝
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-07-06 22:38:20 IP:211.76.xxx.xxx 未訂閱
引言: 我照你所說的去改了,結果按下一筆資料時,卻出現以下錯誤訊息,這到底是啥意思阿,很多前輩的做法試到最後都會出現這錯誤訊息 raised exeception class EOleException with message [MySQL][ODBC3.51Driver][mysql-3.23.52-nt] You have an error in your SQL syntax near '?x?3zv?D! \0..................一堆亂碼 到底是什麼意思阿,謝謝站長的幫忙 謝謝
我試過都可以耶, 上傳我寫好的程式檔給您 http://delphi.ktop.com.tw/loadfile.php?TOPICID=10504606&CC=234934 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-07-07 14:03:56 IP:192.168.xxx.xxx 未訂閱
引言: 我試過都可以耶, 上傳我寫好的程式檔給您 http://delphi.ktop.com.tw/loadfile.php?TOPICID=10504606&CC=234934
我用MY-SQL 4.0 + MY-ODBC 3.5都可以成功 請用我附上的MY-SQL DATA與程式再試看看 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
hillel5021
一般會員


發表:5
回覆:11
積分:3
註冊:2003-05-23

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-07-09 00:37:52 IP:61.58.xxx.xxx 未訂閱
謝謝站長先生和之前幾位前輩的大力幫忙,經試驗結果終於成功了,原來是MySql版本的問題,我將3.23版更新為4.0版後,就可以存入圖片了,非常謝謝各位前輩的大力幫助,真的非常謝謝
系統時間:2024-04-26 0:10:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!