線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1022
推到 Plurk!
推到 Facebook!

請幫我看看這究竟是怎麼回事

 
zhangxh422
一般會員


發表:3
回覆:8
積分:2
註冊:2006-08-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-29 09:40:20 IP:221.224.xxx.xxx 未訂閱

請各位高手幫我看看這究竟是怎麼回事,我一直沒有找到問題在哪里,我用的是Access數据库,工具是 delphi 6,問題如下,

我的代碼如下:

with qry do
begin
close;
sql.clear;
sql.add('select * from sn_infor ');
sql.add(' where ( mid(end_sn,7,5) >= mid(:END_SN,7,5) '
' and mid(start_sn,7,5) <= mid(:END_SN,7,5) ) ' );
sql.add(' or ( mid(end_sn,7,5) >= mid(:START_SN,7,5) ' );
sql.add(' and mid(start_sn,7,5) <= mid(:START_SN,7,5)) ) ' );
sql.add(' and mid(start_sn,1,6 ) = mid(:START_SN,1,6 )');
sql.add(' and len(start_sn) = len(:START_SN)');
sql.add(' and mo_number <> ''' field4 ''' ');
{sql.add('and rownum=1 ');}
prepared;
Parameters.ParamByName('START_SN').Value:=edit1.Text;
Parameters.ParamByName('END_SN').Value:=edit2.Text;
open;

我在查詢中只有' where ( mid(end_sn,7,5) >= mid(:END_SN,7,5) ' 這一句時,一切是正常的,而當條件增加到兩條以上時,程序就會報錯,報錯信息是:' 提供不一致或不完全的資訊導致參數物件不適當的被拒 ' ,我不明白這是怎麼回事,是不是Access有另外的要求呢?

pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-29 11:09:46 IP:60.248.xxx.xxx 未訂閱

因為組Sql語法裡有多個:START_SN參數,當ParamByName('START_SN').Value並沒有實際帶到那麼多,

所以用Sql.Add('select .....where fieldname between' QuotedStr(Start_Sn) ' and ' QuotedStr(End_Sn) '.....'

試著用Delphi變數去組語法

zhangxh422
一般會員


發表:3
回覆:8
積分:2
註冊:2006-08-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-08-29 13:55:25 IP:221.224.xxx.xxx 未訂閱

你好,pedro756901

你可能誤解我代碼的意思了,代碼中' start_sn' 與' end_sn' 是指我設計的表格中的欄位名,而' :start_sn',' end_sn'才是變量參數,我的意思是要查找輸入的參數中的一個子串是否在資料庫中的' start_sn' 與' end_sn' 之間.

===================引 用 文 章===================

因為組Sql語法裡有多個:START_SN參數,當ParamByName('START_SN').Value並沒有實際帶到那麼多,

所以用Sql.Add('select .....where fieldname between' QuotedStr(Start_Sn) ' and ' QuotedStr(End_Sn) '.....'

試著用Delphi變數去組語法

menfox
一般會員


發表:1
回覆:10
積分:2
註冊:2006-08-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-08-29 14:19:43 IP:211.21.xxx.xxx 未訂閱

1.你的 SQL 中實際上共有 '六個' 參數須傳入, 所以你必須用 六條

Parameters.ParamByName('START_SN').Value:=edit1.Text;
Parameters.ParamByName('END_SN').Value:=edit2.Text;
....

2.不要用相同的 Parameters name (即 sql.add(' where ( mid(end_sn,7,5) >= mid(:END_SN,7,5) ) , 即使你要傳進去的條件值是相同的!

with qry do
begin
close;
sql.clear;
sql.add('select * from sn_infor ');
sql.add(' where ( mid(end_sn,7,5) >= mid(:END_SN1,7,5) '
' and mid(start_sn,7,5) <= mid(:END_SN2,7,5) ) ' );
sql.add(' or ( mid(end_sn,7,5) >= mid(:START_SN1,7,5) ' );
sql.add(' and mid(start_sn,7,5) <= mid(:START_SN2,7,5)) ) ' );
sql.add(' and mid(start_sn,1,6 ) = mid(:START_SN3,1,6 )');
sql.add(' and len(start_sn) = len(:START_SN4)');
sql.add(' and mo_number <> ''' field4 ''' ');
{sql.add('and rownum=1 ');}
prepared;
Parameters.ParamByName('END_SN1').Value:=edit2.Text;
Parameters.ParamByName('END_SN2').Value:=edit2.Text;
Parameters.ParamByName('START_SN1').Value:=edit1.Text;
Parameters.ParamByName('START_SN2').Value:=edit1.Text;
Parameters.ParamByName('START_SN3').Value:=edit1.Text;
Parameters.ParamByName('START_SN4').Value:=edit1.Text;
open;

------
Hi! It's Menfox!
zhangxh422
一般會員


發表:3
回覆:8
積分:2
註冊:2006-08-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-08-29 15:37:43 IP:221.224.xxx.xxx 未訂閱

你好,menfox:

按你的方法做是可以,我已經解決了,但這樣唯一的缺陷就是當同一個參數引用多次時就會要用多條語句,在這種情況下不太適用,上面的那樣我在oracle中已經實現了,在用Access時就出現這樣的問題,不知你有沒有好的方法呢?

謝謝你哦!^_^

menfox
一般會員


發表:1
回覆:10
積分:2
註冊:2006-08-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-08-31 18:07:50 IP:211.21.xxx.xxx 未訂閱

好像沒有更好的方法了!

------
Hi! It's Menfox!
系統時間:2024-06-26 12:08:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!