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

DBGride無法正常顯示資料

答題得分者是:senso
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-11-29 23:55:01 IP:59.104.xxx.xxx 訂閱
各位先進您好!
小弟最近用了builder 2010寫資料庫程式,可以正常的把值寫進資料庫,但讀出來的時候無法顯示,不知哪裡要改,請先進們提示一下!謝謝!

程式碼如下:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Query1->SQL->Clear();
Query1->SQL->Add("select * from department");
Query1->Prepare();
Query1->Close();
Query1->Open();
//Query1->First();
//while(!Query1->Eof)
//{
//Memo1->Lines->Add(Query1->FieldByName("DEP_NO")->AsString); 這行如果把註解拿掉,會出現如下圖的錯誤
//Query1->Next();
//}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Query1->SQL->Clear(); //清除
Query1->SQL->Add("INSERT INTO department(DEP_NO,DEP_NAME)");
Query1->SQL->Add("Values(:aDEP_NO,:aDEP_NAME)");
Query1->ParamByName("aDEP_NO")->AsAnsiString = Edit1->Text;
Query1->ParamByName("aDEP_NAME")->AsAnsiString = Edit2->Text;
Query1->ExecSQL();
Query1->Close();
}
//---------------------------------------------------------------------------
不正常顯示的畫面如下:
http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=99953

以下是錯誤的畫面:
http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=99954
附加檔案:4b129955e99e5_error.JPG
編輯記錄
cashyy 重新編輯於 2009-11-29 23:58:20, 註解 無‧
cashyy 重新編輯於 2009-11-30 00:22:44, 註解 無‧
cashyy 重新編輯於 2009-11-30 00:24:34, 註解 無‧
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-11-30 10:13:15 IP:61.219.xxx.xxx 訂閱
1.不正常顯示
可能是有自行定義DBGrid的Colums,
有指定
DBGrid1->Columns->Items[0]->FieldName="ID"
但是沒指定
DBGrid1->Columns->Items[1]->FieldName="DEP_NO";
DBGrid1->Columns->Items[2]->FieldName="DEP_NAME";
所以DBGrid沒顯示後面那兩個欄位
DBGrid1->Columns->Items[0]->Title->Caption只是標題列顯示的文字,和FieldName功用是不一樣的

2.FieldByName錯誤
應該這樣寫
Query1->Fields->FieldByName("DEP_NO")->AsString


===================引 用 cashyy 文 章===================
各位先進您好!
小弟最近用了builder 2010寫資料庫程式,可以正常的把值寫進資料庫,但讀出來的時候無法顯示,不知哪裡要改,請先進們提示一下!謝謝!

程式碼如下:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Query1->SQL->Clear();
Query1->SQL->Add("select * from department");
Query1->Prepare();
Query1->Close();
Query1->Open();
//Query1->First();
//while(!Query1->Eof)
//{
//Memo1->Lines->Add(Query1->FieldByName("DEP_NO")->AsString); 這行如果把註解拿掉,會出現如下圖的錯誤
//Query1->Next();
//}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Query1->SQL->Clear(); //清除
Query1->SQL->Add("INSERT INTO department(DEP_NO,DEP_NAME)");
Query1->SQL->Add("Values(:aDEP_NO,:aDEP_NAME)");
Query1->ParamByName("aDEP_NO")->AsAnsiString = Edit1->Text;
Query1->ParamByName("aDEP_NAME")->AsAnsiString = Edit2->Text;
Query1->ExecSQL();
Query1->Close();
}
//---------------------------------------------------------------------------
不正常顯示的畫面如下:
http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=99953

以下是錯誤的畫面:
http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=99954
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-11-30 14:09:42 IP:59.125.xxx.xxx 訂閱
感謝senso大大回覆!

第1:我很確定下列2個有指定,是在FieldName的下拉選單指定的
DBGrid1->Columns->Items[1]->FieldName="DEP_NO";
DBGrid1->Columns->Items[2]->FieldName="DEP_NAME";

第2:如果Query1->ParamByName("aDEP_NO")->AsAnsiString = Edit1->Text; 是錯誤的語法,那為什麼可以正常寫入資料庫呢?

懇請大大再次指導!



===================引 用 senso 文 章===================
1.不正常顯示
可能是有自行定義DBGrid的Colums,
有指定
DBGrid1->Columns->Items[0]->FieldName="ID"
但是沒指定
DBGrid1->Columns->Items[1]->FieldName="DEP_NO";
DBGrid1->Columns->Items[2]->FieldName="DEP_NAME";
所以DBGrid沒顯示後面那兩個欄位
DBGrid1->Columns->Items[0]->Title->Caption只是標題列顯示的文字,和FieldName功用是不一樣的

2.FieldByName錯誤
應該這樣寫
Query1->Fields->FieldByName("DEP_NO")->AsString


===================引 用 cashyy 文 章===================
各位先進您好!
小弟最近用了builder 2010寫資料庫程式,可以正常的把值寫進資料庫,但讀出來的時候無法顯示,不知哪裡要改,請先進們提示一下!謝謝!

程式碼如下:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Query1->SQL->Clear();
Query1->SQL->Add("select * from department");
Query1->Prepare();
Query1->Close();
Query1->Open();
//Query1->First();
//while(!Query1->Eof)
//{
//Memo1->Lines->Add(Query1->FieldByName("DEP_NO")->AsString); 這行如果把註解拿掉,會出現如下圖的錯誤
//Query1->Next();
//}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Query1->SQL->Clear(); //清除
Query1->SQL->Add("INSERT INTO department(DEP_NO,DEP_NAME)");
Query1->SQL->Add("Values(:aDEP_NO,:aDEP_NAME)");
Query1->ParamByName("aDEP_NO")->AsAnsiString = Edit1->Text;
Query1->ParamByName("aDEP_NAME")->AsAnsiString = Edit2->Text;
Query1->ExecSQL();
Query1->Close();
}
//---------------------------------------------------------------------------
不正常顯示的畫面如下:
http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=99953

以下是錯誤的畫面:
http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=99954
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-11-30 17:02:23 IP:61.219.xxx.xxx 訂閱
看來是錯方向了
圖2錯誤是Query1找不到Field'DEP_NO'
因為Query1沒有設DEP_NO和DEP_NAME吧
所以圖1只有顯示ID那欄,另外那兩欄找不到對應的欄位就只有顯示Caption

照原本的語法應該也可以正常跑
Query1->FieldByName("DEP_NO")->AsString

Field和parameter是不一樣的東西...


===================引 用 cashyy 文 章===================
感謝senso大大回覆!

第1:我很確定下列2個有指定,是在FieldName的下拉選單指定的
DBGrid1->Columns->Items[1]->FieldName="DEP_NO";
DBGrid1->Columns->Items[2]->FieldName="DEP_NAME";

第2:如果Query1->ParamByName("aDEP_NO")->AsAnsiString = Edit1->Text; 是錯誤的語法,那為什麼可以正常寫入資料庫呢?

懇請大大再次指導!



===================引 用 senso 文 章===================
1.不正常顯示
可能是有自行定義DBGrid的Colums,
有指定
DBGrid1->Columns->Items[0]->FieldName="ID"
但是沒指定
DBGrid1->Columns->Items[1]->FieldName="DEP_NO";
DBGrid1->Columns->Items[2]->FieldName="DEP_NAME";
所以DBGrid沒顯示後面那兩個欄位
DBGrid1->Columns->Items[0]->Title->Caption只是標題列顯示的文字,和FieldName功用是不一樣的

2.FieldByName錯誤
應該這樣寫
Query1->Fields->FieldByName("DEP_NO")->AsString
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-12-01 09:41:15 IP:59.125.xxx.xxx 訂閱
senso大大您好!

您所說的Query1找不到Field'DEP_NO' 和 DEP_NAME,因為如果找不到的話應該在DBGrid->Columns->FieldName不會出現DEP_NO和DEP_NAME吧!
是因為安裝的MySQL ODBC太新的關係嗎?小弟是從mysql網站下載最新版本
或是因為Query元件有問題?

今天晚上用builder 6來試試!
如果大大想到有什麼好方法記得指導小弟一下囉!

謝謝您!
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-12-01 11:57:32 IP:61.219.xxx.xxx 訂閱
Query1是不是有另外Add Field 的ID欄位?

open後看一下你的Query1有什麼欄位吧
Memo1->Lines->Add(Query1->Fields->Count); //你的count大概是1
Memo1->Lines->Add(Query1->Fields->Fields[0]->FieldName); //就ID欄位
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-12-01 23:13:27 IP:59.104.xxx.xxx 訂閱
大大您好!
真的讓您猜中了,count真的是1,而且只剩ID欄位,那到底是哪出了問題呢?
請大大指導!謝謝您

===================引 用 senso 文 章===================
Query1是不是有另外Add?Field 的ID欄位?

open後看一下你的Query1有什麼欄位吧
Memo1->Lines->Add(Query1->Fields->Count);? //你的count大概是1
Memo1->Lines->Add(Query1->Fields->Fields[0]->FieldName);? //就ID欄位
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-12-02 08:31:27 IP:163.29.xxx.xxx 訂閱
即使SQL這樣下select * from department
但是Query1有另外設定Field的話,就會只剩設定的Field
要麻就Query1把全部的Field加上去,不然就不要加Field
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-12-02 09:57:29 IP:59.125.xxx.xxx 訂閱
大大您好!
問題1:那我是否要把SQL改成select ID,DEP_NO,DEP_NAME from department
問題2:在Query1上有哪個地方可以另外設定Field?

感謝您花費這麼多寶貴時間回答我的笨問題!
謝謝您!

===================引 用 senso 文 章===================
即使SQL這樣下select * from department
但是Query1有另外設定Field的話,就會只剩設定的Field
要麻就Query1把全部的Field加上去,不然就不要加Field
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-12-02 13:16:34 IP:211.72.xxx.xxx 訂閱
問題1:那我是否要把SQL改成select ID,DEP_NO,DEP_NAME from department
A1:若不使用 TQuery 之 Fields 便不須改,
用 SELECT * FROM <TableName> WHERE <Condition> ORDER By <Column List> 即可.
問題2:在Query1上有哪個地方可以另外設定Field?
A2:滑鼠右鍵點擊 TQuery, 首項便是 Fields Editor.
編輯記錄
herbert2 重新編輯於 2009-12-02 13:18:21, 註解 無‧
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-12-02 13:53:06 IP:59.125.xxx.xxx 訂閱
herbert2大大您好!
首先感謝您回覆!
我檢查過TQuery了,在Fields Editor裡面是空的,都沒有設定Field,而SQL只有select * from department而已。
我用了書上的範例,範例上是使用內建的DB:DBDEMOS。

我的測試步驟:
1.在Form上放一個TQuery,TDataSource,TDBGrid。
2.在DBGrid屬性設定DataSouce設為:DataSource1
3.在DataSource1屬性設定DataSet設為:Query1
4.在Query1屬性設定SQL為:select * from employee.db
5.在Query1屬性Active設為:true

就可以看見DBGrid顯示出資料了!我也沒另外設定Field,但用同樣的步驟在我的程式卻只能顯示出ID欄位而已!


===================引 用 herbert2 文 章===================
問題1:那我是否要把SQL改成select ID,DEP_NO,DEP_NAME from department
A1:若不使用 TQuery 之 Fields 便不須改,
? 用 SELECT * FROM <TableName> WHERE <Condition> ORDER By <Column List> 即可.
問題2:在Query1上有哪個地方可以另外設定Field?
A2:滑鼠右鍵點擊 TQuery, 首項便是 Fields Editor.
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-12-02 20:06:08 IP:211.72.xxx.xxx 訂閱
簡單步驟就可以看見 DBGrid 顯示出資料是沒錯, 但其 Title 之 Caption 應會是英文欄名.

看了您的螢幕畫面, Title 皆為中文, 而 DBGrid 上卻只顯示出 ID 欄位值而已,
小弟猜, 可能是因您只設了 DBGrid->Columns[0]->Title->Caption,
也設了 DBGrid->Columns[0]->FieldName;
但 DBGrid->Columns[1] 及 DBGrid->Columns[2] 卻只設 Title->Caption,
但未設 FieldName, 故便不顯示其欄值了.

請用滑鼠右鍵在 DBGrid 上點擊一下, 選 Columns Editor 項, 逐欄將顯示 "TColumn" 的 Column,
於 Object Inspector 上補填其 FieldName, 應該就 Ok 了!
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-12-02 23:49:48 IP:59.104.xxx.xxx 訂閱
herbert2先進您好!

小弟再次檢查了下列步驟:
1.在DBGrid方面,小弟增加了三個Columns,並各別指定了FieldName
請見1.jpg
http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=99975

2.在Query方面,小弟檢查了Fields Editor,發現只有ID欄位
請見2.jpg
http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=99976

3.在BDE Administrator方面,檢查了ODBC,開
請見3.jpg
http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=99978

唯一讓小弟覺得疑惑的是第2點,為什麼在Fields Editor只顯示出了ID欄位??
是否還有啥地方是小弟沒注意到的事呢?

還請先進們指導!感謝您!

===================引 用 herbert2 文 章===================
簡單步驟就可以看見 DBGrid 顯示出資料是沒錯, 但其 Title? 之 Caption 應會是英文欄名.

看了您的螢幕畫面, Title 皆為中文, 而 DBGrid 上卻只顯示出 ID 欄位值而已,
小弟猜, 可能是因您只設了 DBGrid->Columns[0]->Title->Caption,
也設了 DBGrid->Columns[0]->FieldName;
但 DBGrid->Columns[1] 及 DBGrid->Columns[2] 卻只設 Title->Caption,
但未設 FieldName, 故便不顯示其欄值了.

請用滑鼠右鍵在 DBGrid 上點擊一下, 選 Columns Editor 項, 逐欄將顯示 "TColumn" 的 Column,
於 Object Inspector 上補填其 FieldName, 應該就 Ok 了!
編輯記錄
cashyy 重新編輯於 2009-12-02 23:55:33, 註解 無‧
cashyy 重新編輯於 2009-12-03 00:03:11, 註解 無‧
cashyy 重新編輯於 2009-12-03 09:01:25, 註解 無‧
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-12-03 11:53:28 IP:61.219.xxx.xxx 訂閱
可能不是DBGrid和Query方面的問題了
我猜可能是MySQL ODBC或character set相關,而且第一篇的第一張圖好像也有亂碼出現
這方面不熟~

http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=93228
http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=87198
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#15 引用回覆 回覆 發表時間:2009-12-03 21:04:33 IP:59.104.xxx.xxx 訂閱
感謝senso大大的指導!
senso大大提供的文章:http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=93228
跟我的問題一樣!所以我也重新安裝ODBC3.1就正常了!
怎麼ODBC5.1會比ODBC3.1還差呢??

同時也要感謝herbert2大大的指導!

謝謝兩位大大!感謝您!

===================引 用 senso 文 章===================
可能不是DBGrid和Query方面的問題了
我猜可能是MySQL ODBC或character set相關,而且第一篇的第一張圖好像也有亂碼出現
這方面不熟~

http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=93228
http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=87198
系統時間:2017-10-24 1:10:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!