文字檔(*.TXT)轉ACCESS資料庫問題 |
尚未結案
|
ryowu
一般會員 發表:56 回覆:25 積分:16 註冊:2002-04-23 發送簡訊給我 |
我現在在'c:\123.txt'有一些簡單的字串,ex.
GS7-12-B,021231T1,03/01/02, 13.16V, 17.0 m?00:07.48
GS7-12-B,021231T1,03/01/02, 13.19V, 17.1 m?00:16.81
GS7-12-B,021231T1,03/01/02, 13.21V, 15.9 m?00:27.11
GS7-12-B,021231T1,03/01/02, 13.20V, 16.4 m?00:06.98
GS7-12-B,021231T1,03/01/02, 13.20V, 16.5 m?00:46.88 如何利用TABLE1/DBGRID1(不經BDE設定,完全在程式上運作)將上述字串值寫入ACCESS資料庫 執行後DBGRID1的畫面為下表所示:
┌────┬────┬────┬───┬───┬────┐
│ 樣品 │製造日期│輸入時間│電壓值│阻抗值│測試時間│
├────┼────┼────┼───┼───┼────┤
│GS7-12-B│021231T1│03/01/02│13.16 │ 17.0 │ 7.48 │
├────┼────┼────┼───┼───┼────┤
│GS7-12-B│021231T1│03/01/02│13.19 │ 17.1 │ 16.81 │
├────┼────┼────┼───┼───┼────┤
│GS7-12-B│021231T1│03/01/02│13.21 │ 15.9 │ 27.11 │
├────┼────┼────┼───┼───┼────┤
│GS7-12-B│021231T1│03/01/02│13.20 │ 16.4 │ 6.98 │
├────┼────┼────┼───┼───┼────┤
│GS7-12-B│021231T1│03/01/02│13.20 │ 16.5 │ 46.88 │
└────┴────┴────┴───┴───┴────┘
↑ ↑ ↑ ↑ ↑ ↑
字串格式 字串格式 日期格式 數值 數值 數值
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
|
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
ryowu你好:
用M$的東西不經過odbc,好像有點難度,小弟知道mysql可以不用經過odbc
因為小弟有問過你可以參考
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=25791
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
ryowu
一般會員 發表:56 回覆:25 積分:16 註冊:2002-04-23 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
TStringGrid 元件不是資料感知元件
你將資料塞入StringGrid,那只是在外觀上(顯示上看起來條DBGrid)
實際上你還是要寫code 來處理 一、先建立一個空的資料庫mdb,將資料格式建立好
二、以TStringList 將文字檔讀入
三、參考這二篇
http://delphi.ktop.com.tw/topic.php?method=SugestGood&method2=Y&TOPIC_ID=21331
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=20862 將讀入的文字檔,以","為分割字元,各自讀出,
四、以ado 開啟資料庫,將分割字串依序寫入資料庫
五、轉換完畢
|
stonys
初階會員 發表:64 回覆:111 積分:38 註冊:2002-09-28 發送簡訊給我 |
|
ryowu
一般會員 發表:56 回覆:25 積分:16 註冊:2002-04-23 發送簡訊給我 |
我嘗試用tquery來寫,可是出現了下的的錯誤訊息,我該如何解決呢?
"Porject Project1.exe raised exception class EDBEngineError with message 'Invalid parameter' Process stopped. Use Step or Run to Continue" 我的原始程式碼如下:
function _split(const vOriStr: AnsiString; const vDelimiter: AnsiString=','): TStrings;
var
i: Integer;
s: AnsiString;
begin
try
result := TStringList.Create();
s := Trim(vOriStr);
repeat
i := Pos(vDelimiter, s);
if i = 0 then
result.Append(s)
else
begin
result.Append(Copy(s, 1, i - 1));
Delete(s, 1, i);
end;
until i = 0;
except
on e: Exception do;
end;
end; procedure TForm1.FormCreate(Sender: TObject);
var s,sl,s2,s4:string;
a:TStrings;
i:integer;
begin
sl:='HR1224WF21,021231A1T1,03/01/02, 13.23V, 16.6 m?00:07.21';
s2:= StringReplace(sl,'m?',',',[rfReplaceAll]);
s4:= StringReplace(s2,'00:','',[rfReplaceAll]);
s := StringReplace(s4,'V,',',',[rfReplaceAll]);
a := _split(s);
memo1.Clear ;
for i:= 0 to a.count - 1 do
begin
memo1.lines.add(trim(a.strings[i]));
end;
a.free;
end; procedure TForm1.FormActivate(Sender: TObject);
begin
Query1.DatabaseName := GetCurrentDir;
Query2.DatabaseName := GetCurrentDir; Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM CAP.DBF');
Query1.SQL.Add('ORDER BY ENO');
Query1.CLOSE;
Query1.OPEN;
end; procedure TForm1.Button2Click(Sender: TObject);
VAR MAXENO : INTEGER;
begin
Query2.SQL.Clear;
Query2.SQL.Add('SELECT MAX(ENO) AS MAXENO FROM CAP.DBF');
Query2.CLOSE;
Query2.OPEN;
MAXENO := Query2.FieldByName('MAXENO').AsInteger 1; Query2.SQL.Clear;
Query2.SQL.Add('INSERT INTO CAP.DBF');
Query2.SQL.Add('( ENO ,');
Query2.SQL.Add(' TYPE ,');
Query2.SQL.Add(' LOT_NO ,');
Query2.SQL.Add(' VOLTAGE ,');
Query2.SQL.Add(' RESISTANCE ,');
Query2.SQL.Add(' CAPACITY ');
Query2.SQL.Add(' ) VALUES ( ');
Query2.SQL.Add(' ''' INTTOSTR(MAXENO) ''' ,');
Query2.SQL.Add(' ''' memo1.Lines[0] ''' , ');
Query2.SQL.Add(' ''' memo1.Lines[1] ''' , ');
Query2.SQL.Add(' ''' memo1.Lines[2] ''' , ');
Query2.SQL.Add(' ''' memo1.Lines[3] ''' , ');
Query2.SQL.Add(' ''' memo1.Lines[4] ''' , ');
Query2.SQL.Add(' ''' memo1.Lines[5] ''' ) ');
Query2.ExecSQL; Query1.CLOSE ;
Query1.OPEN;
end;
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
你 update 六個欄位卻有七個 Value 當然是 'Invalid parameter' 了
另外,你每次改變SQL Query 都會用使用不少時間去重新驗証SQL的內容。你最後的SQL就要重覆驗証16次(clear及Add 都是改變),若你直接用 Query.SQL.Text := '....' '....' .... 等等便可以只驗証一次,應可增加效能五到十部。可參考
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27906
中段對 SQL.Text 的討論。
|
ryowu
一般會員 發表:56 回覆:25 積分:16 註冊:2002-04-23 發送簡訊給我 |
本來我在Query2.SQL.Add(' LOT_NO ,');下加了Query2.SQL.Add(' DATE ,');也是會出現錯誤,
可是我改了Query2.SQL.Add(' M_DATE,');【CAP.DBF也有改欄位名稱】之後就可以新增了
可是針對Query.SQL.Text的delphi help語法說明及站上的範例,看了之後還是一頭霧水,坊間是否有sql語法的說明
另外,下列的sql.add改成sql.text要怎樣改....(因為我有試著依Justmade的方法去改,可是會出現錯誤訊息)
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
Date 是保留字,不能在SQL句字裡直接當欄位使用,若要用的話要用 ' ' 來括住。 網上 SQL 資料這裡有個,是 hagar 版主提供給別網友的我抄來一用
http://www.w3schools.com/sql/default.asp 不過長遠來說買本書看會比較好。
Query2.SQL.Text := 'INSERT INTO CAP.DBF (ENO, TYPE, LOT_NO, M_ADATE, VOLTAGE, RESISTANCE, CAPACITY) ' 'VALUES (''' INTTOSTR(MAXENO) ''', ''' memo1.Lines[0] ''', ''' memo1.Lines[1] ''', ''' memo1.Lines[2] ''', ''' memo1.Lines[3] ''', ''' memo1.Lines[4] ''', ''' memo1.Lines[5] '''';另外你要註要你日期皂格式是否符合數據庫的格式。 |
ryowu
一般會員 發表:56 回覆:25 積分:16 註冊:2002-04-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |