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

用ADOStoredProc1去執行access上的查詢語法

答題得分者是:Coffee
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-22 15:57:20 IP:220.132.xxx.xxx 訂閱
找了一個下午試各種方法都還不行,已經搜尋過論壇,大多是跟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];

編輯記錄
17kobe 重新編輯於 2007-08-22 16:33:54, 註解 無‧
17kobe 重新編輯於 2007-08-22 16:35:42, 註解 無‧
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-22 16:05:26 IP:220.130.xxx.xxx 訂閱
我真的很好奇,不知道你從哪知道查詢是用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.
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-08-22 16:07:15, 註解 無‧
Coffee 重新編輯於 2007-08-22 16:10:00, 註解 無‧
Coffee 重新編輯於 2007-08-22 16:14:13, 註解 無‧
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-22 16:14:46 IP:210.68.xxx.xxx 訂閱
我是暫時用來查詢,以後還要新增,刪除、建立...等
我有看過它主要把sql語法寫在資料庫,之後再給參數便能執行。
我從網站看到的,想先學會如何使用。
一般的ADO我已經會做了,網站說他在多個指令效能會更好,所以來試試。
編輯記錄
17kobe 重新編輯於 2007-08-22 16:16:52, 註解 無‧
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-22 16:26:34 IP:220.130.xxx.xxx 訂閱
還是去看書吧,TADOStoredProc是拿來執行「預儲程序(Stored Procedure)」,也就是這些SQL Statement已經被製訂成一個Procedure並嵌入資料庫中
TADOStoredProc「僅能」拿來呼叫這些程序,無法讓你執行自訂的SQL Statement。

拜一下Google大神
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-08-22 16:27:34, 註解 無‧
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-22 16:43:40 IP:210.68.xxx.xxx 訂閱
不了解你的意思,我就是要呼叫access寫好的程序,只是傳入參數的問題。
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-22 16:56:10 IP:220.130.xxx.xxx 訂閱
在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 重新編輯於 2007-08-22 17:04:54, 註解 無‧
Coffee 重新編輯於 2007-08-22 17:06:12, 註解 無‧
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-08-22 17:17:17 IP:220.130.xxx.xxx 訂閱
<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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-08-22 17:19:20 IP:60.250.xxx.xxx 訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-08-22 17:26:16 IP:220.130.xxx.xxx 訂閱
問題應該在於你是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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-08-22 17:43:38 IP:60.250.xxx.xxx 訂閱
厲害喔
像我就不知道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]; 已經可以動作了。 感謝囉,那麼快回答我。
系統時間:2024-05-17 9:50:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!