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

從‧TXT檔向資料庫增加record時,為什麼有時能增加,有時不能?

缺席
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-15 15:39:31 IP:219.145.xxx.xxx 未訂閱
各位先進好! Q1: 我的程式在向資料庫(MS SQL Server2000)增加 Records 時,如果在程式所在Directory 下發現與程式同名的.Txt檔, 就將.Txt中的資料一同Upload,但是我經常發現有時.Txt 被Upload,有時沒有(雖然.Txt沒有被Upload,但是原本要增加Record還是存入資料庫了),不知什麼原因. Code 如下: procedure TForm1.Button1Click(Sender: TObject); begin adoquery1.Close; adoquery1.sql.Clear; try adoQuery1.SQL.Add('Insert Into STD (ID) VALUES (''' trim(Edit1.text) ''')'); adoquery1.execsql; dataUpload(); except raise exception.create('!!!!'); end; end; .Txt檔資料結構: 123;1245 234;4321 // DataUpload的作用是將‧Txt中的資料以';'分隔的資料讀出,放到 //array (strarr)中, //然後再Upload,如果Upload 完成,則刪除‧Txt檔 procedure TForm1.DataUpload(); var TF:textFile; str,s1:string; y,j:integer; strarr: array[1..3] of string ; FinishFlag:Boolean; begin FinishFlag:=false; if FileExists(TxtFile)=true then begin assignfile(TF,TxtFile); reset(TF); try while not Eof(TF) do begin readln(TF,str); y:=1; While True do begin j:=pos(';',str); if j=0 then s1:=Str else begin s1:=copy(str,1,J-1); Delete(str,1,j); end; strarr[y]:=s1; if j=0 then begin adoquery1.Close; adoquery1.sql.Clear; adoQuery1.SQL.Add('INSERT INTO STD (ID,Flag) VALUES ( ''' trim(strarr[1]) ''',''' trim(strarr[2]) ''') '); adoquery1.execsql; Break; end; Inc(y); end; end; FinishFlag:= true; finally closefile(TF); if FinishFlag then deletefile(TxtFile); end; end; end; Q2: 連續增加Records時,有沒有比 adoQuery1.SQL.Add('Insert Into STD (ID) VALUES (''' trim(Edit1.text) ''')'); adoquery1.execsql; 更有效率的寫法
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-15 18:25:12 IP:61.185.xxx.xxx 未訂閱
這個問題好像只在Win98上發生,Win2000並不存在此問題 經過反反覆復的檢查,發現出現這個問題的原因應該與下面Code 有關: ... ResourceString TxtFile='Records.txt'; ... if FileExists(TxtFile)=true then begin assignfile(TF,TxtFile); reset(TF); try while not Eof(TF) do .... 但具體原因不明, 望各位先進指點,謝謝!
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-17 09:24:00 IP:218.1.xxx.xxx 未訂閱
你的意思是文件明明存在,但没有载入,新增到Table吗? TF:textFile;是一种很旧的文件处理方式了,一般都用TFileStream, TMemoryStream等,针对你的txt文件,也可以直接用TStringList.LoadFromFile 效率问题,不要每笔资料都ExecSQL,可以最后执行一次; 另外,帖子里的代码用code标记起来比较好读(我这里不能写,写了也看不到,你发贴时点一下"插入Code"按钮,可以看到是如何的flag)     久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听 發表人 - mustapha.wang 於 2003/07/17 09:27:35
------
江上何人初见月,江月何年初照人
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-21 10:17:32 IP:219.145.xxx.xxx 未訂閱
感謝前輩mustpaha.wang的回應!  首先回應前輩推測:.txt 文件的確存在,但沒有增加到table中     其次,看了前輩的應答:
引言: " 要每筆資料都ExecSQL,可以最後執行一次;"
我想著這會不會是有時能增加records ,有時不能增加的真正原因: 因為用TextFile讀取文件: 1)如果全部records upload給資料庫,則deletefile 文件, 2)如果有一個record沒成功upload給資料庫,則不會deletefile 文件,而且我是用Reset(唯讀)方式打開文件,當有一個record沒成功upload時,所有records 都會繼續存在,而沒有刪除。 隨著時間往後,‧txt中的record越來越多,一次將全部records upload給資料庫的也概率越來越小 假設一個record upload給資料庫成功的概率是:1/2(成功或不成功) 那麼100個 records 都upload給資料庫成功的概率是:(1/2) 100 次方 那麼不成功的成功的概率是: 1─(1/2) 100次方 ,近似100% 所以給人的感覺是:有時能增加records ,有時不能增加 不知猜測是否正確,還望前輩指點! 另外開始時,我想用TStringList‧LoadFromFile,但是卻不知如何寫,曾經在K‧top問過這個問題,由十分熱心的前輩ha0009做答,code 如下(by ha0009):
   procedure TForm1.Button5Click(Sender: TObject);
var
   s : TStrings;
begin
   s := TStringList.Create;
   try
      s.LoadFromFile ('c:\test.txt');
      split (s.text, ';', memo1.Lines);
   finally
      FreeAndNil (s);
   end;
end;    procedure split (Expression, delimiter : String; Params : TStrings); 
var
   index : integer;
begin
   Expression := Trim (Expression);       Params.Clear;
   if delimiter = '' then Params.Add (Expression);
   if Expression = '' then system.Exit;       index := pos (delimiter, Expression);
   if index = 0 then
      Params.Add (trim (Expression))
   else begin
      while true do begin
         index := pos (delimiter, Expression);
         if index = 0 then begin
            Params.Add (Trim (Expression));
            break;
         end;
         Params.Add (Trim (copy (Expression, 1, index - 1)));
         Expression := trim (Copy (Expression, Index   length (delimiter), Length (Expression)));
      end;
   end;
end; 
   
但是在 split函式中,沒有將用';'分開的每一段內容放在array中,以準備upload給資料庫,自己想改寫試了一下,不行。於是發問如何改寫,還是由前輩ha0009回答,說稍改一下就行,自己又試了一個多小時,還是不行,最後也不好意思再問前輩ha0009,只好作罷。 最後再次感謝前輩的回應!
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-22 09:12:05 IP:218.1.xxx.xxx 未訂閱
如果adoquery1.execsql;没有执行成功(如键值重复),文件是可能删不掉,但应该会报错的呀,你并没有用try...except屏蔽错误消息。 你可以在delphi里debug一下嘛 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=10543105&CC=235795"> 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
系統時間:2024-06-24 19:50:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!