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

請教一個EXECL轉入MSSQL的問題

答題得分者是:Coffee
Chengyan
一般會員


發表:5
回覆:8
積分:2
註冊:2007-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-03-23 13:25:28 IP:59.124.xxx.xxx 訂閱
小弟正在寫一個小程式,它的方式是將當EXECL欄位相等於MSSQL欄位(例如:ID) 

EXECL的對應欄位【更新】至MSSQL對應的欄位(例如:ID 相同的話 ,將MSSQL的選取欄位資料更新成EXECL 選取的欄位資料)

我先用兩個adoConnection分別連到EXECL與MSSQL

然後用兩個Query把所有欄位讀到四個combobox裡面(方便我輸入欄位,一個Query為EXECL,一個Query為MSSQL)

在新增四個Query,分別對應四個combobox.text,我假設四個Query為DB_ID,DB_Input,EX_ID,EX_Output

最後再增加一個Query來UPDATE資料。

問題在於,我最後一個Query 的 SQL的指令為
<textarea class="delphi" rows="5" cols="60" name="code">upQuery1.SQL.Text:='update ' db_TAble.Text ' set ' DB_Input.Fields[0].FieldName ' = ' EX_Output.Fields[0].AsString ' where ' DB_ID.Fields[0].FieldName ' = ' EX_ID.Fields[0].AsString ''; </textarea><br />
失敗,只能更新一筆的資料,我想用QUERY.NEXT的方式來做下一筆,但不知道該如何著手

所以請問一下各位先輩,如果要做成我想要的功能,我該如何做?

奕或是有更好的方式可以取代我的笨方法
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-03-26 13:46:58 IP:59.124.xxx.xxx 未訂閱
是更新不成功?還是執行時會出現錯誤訊息?
您可以在執行 SQL 之前
以 ShowMessage 或將 SQL 寫到一個 memo 中, 方便 debug
Chengyan
一般會員


發表:5
回覆:8
積分:2
註冊:2007-03-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-03-26 18:19:18 IP:59.124.xxx.xxx 訂閱
hagar大哥你好
這樣的做法是不會產生錯誤,只是他轉的永遠是EXECL檔裡的第一筆資料,也更新成功了

因為我不知道該如何將QUERY指針如何正確的往下一筆走,我有試著加上一筆程式

<textarea class="delphi" rows="10" cols="60" name="code">while upQuery1.eof do begin upQuery1.SQL.Text:=' update ' db_TAble.Text ' set ' DB_Input.Fields[0].FieldName '=' EX_Output.Fields[0].AsString ' where ' DB_ID.Fields[0].FieldName '= cast(' EX_ID.Fields[0].AsString ' AS nvarchar(10))'; upQuery1.next upQuery1.ExecSQL end; </textarea>
不過他會出現錯誤 upQuery1 : cannot perform the operation on close dataset

因為我不能在upQuery1執行While之前open它

不然它的SQL指令會變成我OPEN的那一個
Coffee
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-03-26 18:31:01 IP:220.130.xxx.xxx 訂閱
在Next之前請
EXEC你的QUERY


<textarea cols="60" rows="10" class="delphi" name="code"> with aQuery do begin SetCommand('Your Custom Query'); OpenQuery; first; while not eof do begin //export function next; end; end; </textarea>
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
Chengyan
一般會員


發表:5
回覆:8
積分:2
註冊:2007-03-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-03-26 19:30:35 IP:59.124.xxx.xxx 訂閱
謝謝Coffee大哥

你給的方法真是讓我獲益良多

我照您的方式下去實做了一下,我是這樣做的
<textarea class="delphi" rows="10" cols="60" name="code"> with upQuery1 do begin SQL.Text:= '同上方所設置的'; Open ; First; while not Eof do begin ExecSQL; next; end; end; </textarea>
不過會出現一個錯誤,commandText does not return a result set

這看起來是我的COMMANDTEXT設錯,但我在QUERY中找不到這個選項的設置= =

看來是小弟太笨了,不知道COFFEE大哥是否可以在指點一下迷津呢

(PS..我用的是DELPHI 7.0 資料來源為 MSSQL 與 OFFICE XP--EXECL)
Coffee
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-03-27 00:43:38 IP:203.73.xxx.xxx 訂閱
如果你要直接Update,請用ADOCommand,ADOQuery只能用在把資料抓回來再udpate,
ADOCommand要怎麼用請參考help
不然就是把你要的資料撈回來,再逐筆的update,怎樣在local裡面指定特某個key的record作update,
請翻help跟書...
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
Chengyan
一般會員


發表:5
回覆:8
積分:2
註冊:2007-03-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-03-27 13:56:18 IP:59.124.xxx.xxx 訂閱
謝謝Coffee大哥

我完成了更新了,原來是我只要用ADOcommand來取代SQL.TEXT就可以了

原本我就是要做及時更新的,我修正如下:

<textarea class="delphi" rows="10" cols="60" name="code"> while not E_ID.eof do begin Command1.CommandText := 'UPDATE 設置'; Command1.CommandType := cmdText; Command1.Execute; E_ID.Next; E_INPUT.Next end; </textarea>

雖然程式功力很拙劣,不過還是希望可以幫助到其他人,謝謝回應的大哥們

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