從‧TXT檔向資料庫增加record時,為什麼有時能增加,有時不能? |
缺席
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
各位先進好!
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 發送簡訊給我 |
|
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
你的意思是文件明明存在,但没有载入,新增到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 發送簡訊給我 |
感謝前輩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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |