用ADOStoredProc1去執行access上的查詢語法 |
答題得分者是:Coffee
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
找了一個下午試各種方法都還不行,已經搜尋過論壇,大多是跟ms sql server跟 oracle
////DELPHI程式,用ADOConnect到本地access資料庫ccc,然後用ADOStoredProc查詢,之後顯示在DBGrid之上 <textarea class="delphi" rows="10" cols="60" name="code"> unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, FMTBcd, StdCtrls, DB, ADODB, SqlExpr, Grids, DBGrids; type TForm1 = class(TForm) ADOStoredProc1: TADOStoredProc; ADOConnection1: TADOConnection; Button1: TButton; Edit1: TEdit; DataSource1: TDataSource; DBGrid1: TDBGrid; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin ADOStoredProc1.ProcedureName:='q1'; ADOStoredProc1.Parameters[1].value:=edit1.text; ADOStoredProc1.Prepared ; ADOStoredProc1.ExecProc ; end; end. </textarea> ///access的查詢q1,其資料庫為ccc,a欄位,va是以後輸入的參數 SELECT * FROM ccc WHERE a=[va]; |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
我真的很好奇,不知道你從哪知道查詢是用TADOStoredProc..
你有看過Help了?你搞不清楚什麼是StoredProc? 你要不要把書上有關ADO的部份好好的翻一翻? 我想每一本Delphi有關資料庫的書籍上,只要是使用ADO,都會有一個簡單的ADO元件使用範例, 你讓我很好奇到底用了什麼書。 TADOStoredProc Description Use a TADOStoredProc object when a client application must use a stored procedure in a database. A stored procedure is a grouped set of statements, stored as part of a database metadata (just like tables, indexes, and domains), that performs a frequently-repeated, database-related task on the server and passes results to the client. Note: Not all database servers support stored procedures. See a specific server documentation to determine if it supports stored procedures. Many stored procedures require a series of input arguments, or parameters, that are used during processing. TADOStoredProc provides a Parameters property that enables an application to set these parameters before executing the stored procedure. TADOStoredProc reuses the Parameters property to hold the results returned by a stored procedure. Parameters is a collection of TParameter objects, each representing an individual parameter for the stored procedure. Depending on server implementation, a stored procedure can return either a single set of values, or a result set similar to the result set returned by a query.
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
還是去看書吧,TADOStoredProc是拿來執行「預儲程序(Stored Procedure)」,也就是這些SQL Statement已經被製訂成一個Procedure並嵌入資料庫中
TADOStoredProc「僅能」拿來呼叫這些程序,無法讓你執行自訂的SQL Statement。 拜一下Google大神吧
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-08-22 16:27:34, 註解 無‧
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
在Access中,變數前敘字應該是@
在TADOStoredProc中,應該使用Parameters來設定變數 所以現在是沒有資料?還是出現什麼錯誤? <textarea cols="60" rows="10" class="delphi" name="code"> spxxxx.Close; spxxxx.Parameters.Refresh; spxxxx.Parameters[1].Value := spr.FieldByName('ID').AsString; spxxxx.Parameters[2].Value := 'Y'; spxxxx.Parameters[3].Value := MAX_VALUE; spxxxx.Open; </textarea>
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
<textarea name="code" class="delphi" rows="10" cols="60">
spxxxx.ProcedureName := SP_NAME;
with spxxxx.Parameters do
begin
Clear;
CreateParameter('@para1', ftInteger, pdInput, 1, ipara1);
CreateParameter('@para2', ftInteger, pdOutput, 1, Null);
end;
spxxxx.prepared;
spxxxx.ExecProc; </textarea> 如果你要動態設定Procedure,那就得用CreateParameter的方法
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
access有加了
改完後再看就變成 SELECT * FROM ccc WHERE (((ccc.a)=[@va])); 然後執行時會 跳出個視窗,問輸入參數值@va,然後輸入裡面有的就可以搜尋到了。 ps:所以還要不要加@有點懷疑。 程式改成這樣 <textarea class="delphi" rows="10" cols="60" name="code"> ADOStoredProc1.Close; ADOStoredProc1.ProcedureName:='q1'; ADOStoredProc1.Parameters.Refresh; ADOStoredProc1.Parameters[1].value:=edit1.text; ADOStoredProc1.Open; </textarea> 結果出現這個錯誤 list index out bounds (1) 若我用parambyname ADOStoredProc1.parameters.ParamByName('@va').Value:=edit1.text; 結果會出現找不到此參數 我分別都有試過@加與不加,都不行。 |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
問題應該在於你是runtime指定procedure name,造成你先前在Object inspector的設定都無效
當你設定新的Procedure Name,就要使用Create/Add Parameter method去加上你定義的參數 你直接設Parameter會index out of bound是因為你的paramemter已經因為重設而被清空 當然,用query的Method去找ParameterName也是找不到
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-08-22 17:27:03, 註解 無‧
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
厲害喔
像我就不知道list index out bounds (1),程式經驗還不足。 現在delphi程式改 <textarea class="delphi" rows="10" cols="60" name="code"> procedure TForm1.Button1Click(Sender: TObject); begin ADOStoredProc1.ProcedureName:='q1'; ADOStoredProc1.parameters.clear; ADOStoredProc1.parameters.CreateParameter('va', ftInteger, pdInput, 1, edit1.text); ADOStoredProc1.Prepared; ADOStoredProc1.execproc; end; </textarea> //access地方改 update ccc set ccc.b='ok' where ccc.a=[va]; 已經可以動作了。 感謝囉,那麼快回答我。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |