為啥無法存圖片進入MySql的Blob欄位中 |
尚未結案
|
hillel5021
一般會員 發表:5 回覆:11 積分:3 註冊:2003-05-23 發送簡訊給我 |
請問各位前輩,為啥我無法將圖片存入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 發送簡訊給我 |
這參考拙作 :
發表】在數據庫以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 發送簡訊給我 |
謝謝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 發送簡訊給我 |
|
hillel5021
一般會員 發表:5 回覆:11 積分:3 註冊:2003-05-23 發送簡訊給我 |
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
|
hillel5021
一般會員 發表:5 回覆:11 積分:3 註冊:2003-05-23 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
|
hillel5021
一般會員 發表:5 回覆:11 積分:3 註冊:2003-05-23 發送簡訊給我 |
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 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
每次存入都出現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 發送簡訊給我 |
我照你所說的去改了,結果按下一筆資料時,卻出現以下錯誤訊息,這到底是啥意思阿,很多前輩的做法試到最後都會出現這錯誤訊息 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 發送簡訊給我 |
引言: 我照你所說的去改了,結果按下一筆資料時,卻出現以下錯誤訊息,這到底是啥意思阿,很多前輩的做法試到最後都會出現這錯誤訊息 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 發送簡訊給我 |
|
hillel5021
一般會員 發表:5 回覆:11 積分:3 註冊:2003-05-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |