delphi7 与 oracle9i |
尚未結案
|
liangzai
初階會員 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
请问各位前辈:
我现在使用DBexpress里面的SQLQuery访问ORACLE 9i 中建立的table,例如说:访问oracle中的“表”下面的“EMGT”里面的“MODEL_MASTER"。
我使用这样的SQL语句:
begin
self.SQLQuery1.Close;
self.SQLQuery1.SQL.Clear;
self.SQLQuery1.SQL.Text:='select code,model,brand,unitprice,init_qty,curr_qty';
self.SQLQuery1.SQL.Append('from "SIHDB2.EMGT.MODEL_MASTER" ');
self.SQLQuery1.SQL.Append('where code<>"" ');
self.SQLQuery1.open;
end; 在语句中的from后面要怎样书写才是正确的,我现在不管怎么修改总是出现这样的错误:
“General SQL error,ORA-24337:未准备语句句柄”,或者是其他的原因?
请赐教!谢谢!
|
scotthsiao
高階會員 發表:13 回覆:324 積分:147 註冊:2005-02-01 發送簡訊給我 |
|
tonytop
中階會員 發表:6 回覆:114 積分:89 註冊:2003-12-04 發送簡訊給我 |
self.SQLQuery1.Close;
self.SQLQuery1.SQL.Clear;
self.SQLQuery1.SQL.Text:=''select code,model,brand,unitprice,init_qty,curr_qty ';
self.SQLQuery1.SQL.Append('from EMGT.MODEL_MASTER ');
self.SQLQuery1.SQL.Append('where code<>"" ');
self.SQLQuery1.open; "SIHDB2.EMGT.MODEL_MASTER"這樣下會被當成字串
而不是table name,且oracle是用owner去分,看起來SIHDB2是資料庫名稱,
而EMGT是OWNER,若你想跨資料庫查資料要不用這麼下SQL,且資料庫也需設
定過後才能讓你跨資料庫唷^_^ <[忙盲茫]>
☆會程式不是罪啊☆
|
liangzai
初階會員 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
|
liangzai
初階會員 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
|
yu_blake
一般會員 發表:0 回覆:23 積分:14 註冊:2003-01-16 發送簡訊給我 |
您好~
begin self.SQLQuery1.Close; self.SQLQuery1.SQL.Clear; self.SQLQuery1.SQL.Text:='select code,model,brand,unitprice,init_qty,curr_qty'; self.SQLQuery1.SQL.Append('from "SIHDB2.EMGT.MODEL_MASTER" '); self.SQLQuery1.SQL.Append('where code<>"" '); self.SQLQuery1.open; end;應該改成如下 begin self.SQLQuery1.Close; self.SQLQuery1.SQL.Clear; self.SQLQuery1.SQL.Text:='select code,model,brand,unitprice,init_qty,curr_qty'; self.SQLQuery1.SQL.Append('from EMGT.MODEL_MASTER '); self.SQLQuery1.SQL.Append('where code is not null '); self.SQLQuery1.open; end;試試看囉 |
liangzai
初階會員 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
hi,yu_blake 为什么我改成你这种形式,结果又出现错误:
“operation not allowed on a unidirectional dataset",
接着我用BDE里面的query来做测试,
self.Query1.Close;
self.Query1.SQL.Clear;
self.Query1.SQL.Text:='select code,model,brand,unitprice,init_qty,curr_qty';
self.Query1.SQL.Append('from EMGT.MODEL_MASTER ');
self.Query1.SQL.Append('where code is not null');
self.Query1.Prepare;
self.Query1.Open;
form4.QuickRep1.Preview;
可以在报表中正常显示,但是我现在需要有选择的显示报表资料,也就是说当我在中间加入语句:
if not (combobox5.text = '') and not (combobox6.Text = '') then
self.Query1.SQL.Append('and ( code between "' combobox5.Text '" and "' combobox6.Text '")');
if not (combobox6.Text = '') and (combobox5.Text = '') then
self.Query1.SQL.Append('and ( code = "' combobox6.Text '")');
if not (combobox5.Text = '') and (combobox6.Text = '') then
self.Query1.SQL.Append('and ( code = "' combobox5.Text '")');
这时又会出项错误:"invalid field name"
应该是oracle不识别combobox5,combobox6这些name,我该怎么办? 请各位前辈请教,急。。。。。。。。。
|
yu_blake
一般會員 發表:0 回覆:23 積分:14 註冊:2003-01-16 發送簡訊給我 |
hi 您好 dbexpress Query 元件是單向的 意即只能從頭捲到尾
所以一般都會搭配 可雙向的捲動的 dataset 來使用 如clientdata set 而你可能 直接單獨使用 dbexpress Query 元件
跟DBGrid 或 其他可雙向捲動的元件使用
所以 出現 該錯誤訊息 "operation not allowed on a unidirectional dataset", 改成BDE當然就不會有這個問題
SQL 語法部分 如果你的 code 欄位是數值的話
所以必須要改成這樣
self.Query1.SQL.Append('and ( code between ' combobox5.Text ' and ' combobox6.Text ')');如果code欄位是字串的話 則必須寫成這樣 self.Query1.SQL.Append('and ( code between ' #39 combobox5.Text #39 ' and ' #39 combobox6.Text #39 ')');p.s delphi中以#39來表示單引號 以兩個單引號括住表示為字串 hope helpful. |
liangzai
初階會員 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
hi,yu_blake
谢谢你的指教! 现在又有一个问题出现,就是我使用clientdataset时:
dm.SQLQuery2.Active:=true;
dm.SQLQuery2.Close;
dm.SQLQuery2.SQL.Clear;
dm.SQLQuery2.SQL.Text:='select code,model,brand,unitprice,init_qty,curr_qty';
dm.SQLQuery2.SQL.Append('from EMGT.MODEL_MASTER ');
dm.SQLQuery2.SQL.Append('where code is not null ');
if not (combobox1.text = '') and not (combobox2.Text = '') then
dm.SQLQuery2.SQL.Append('and ( code between ' #39 combobox1.Text #39 ' and ' #39 combobox2.Text #39 ')');
if not (combobox1.Text = '') and (combobox2.Text = '') then
dm.SQLQuery2.SQL.Append('and ( code = ' #39 combobox1.Text #39 ')');
if not (combobox2.Text = '') and (combobox1.Text = '') then
dm.SQLQuery2.SQL.Append('and ( code = ' #39 combobox2.Text #39 ')');
dm.SQLQuery2.Open;
dm.ClientDataSet2.Active:=true;
dm.ClientDataSet2.ApplyUpdates(-1);
form4.QuickRep1.Preview;(使用clientdataset2里面的值) 在combobox1,combobox2里面输入一次值以后,quickreport可以正常显示出来数据,但是我接着在combobox1,combobox2里面写入新的值,在点击这个按钮,结果quickreport还是显示上一次的数据,怎么都不会变?要关闭程序重新运行才可以得到新的数据,我不是已经加入了
dm.ClientDataSet2.ApplyUpdates(-1);这一条语句吗?怎么回事?
初次使用这些component,所以很多不懂,谢谢
|
yu_blake
一般會員 發表:0 回覆:23 積分:14 註冊:2003-01-16 發送簡訊給我 |
|
liangzai
初階會員 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
|
liangzai
初階會員 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |