我文字檔轉檔資料表問題 |
尚未結案
|
bigcome2004
一般會員 發表:28 回覆:19 積分:9 註冊:2004-02-17 發送簡訊給我 |
dear 各位高手:
小弟有一轉檔程式,是將文字檔資料先由memo顯示出來後,在依欄位將資料放入stringGrid中,但我是寫固定文字長度,所以遇到別種切割文字時就會要動到程式碼修改,不知是否有方法可以使用,若有,那資料表所開的欄位屬性長度是否也要跟著變成機動調整,那要如何使用!!
程式碼如下:
Memo1.Lines.LoadFromFile(ExtractFilePath(Application.ExeName) 'test.txt');
Edit1.text:=inttostr(Memo1.lines.count) '筆資料';
TempStringGrid.RowCount:=Memo1.lines.count 1; end; procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
TempStringGrid.cells[0,0]:='函 數';
TempStringGrid.colwidths[0]:=90;
TempStringGrid.cells[1,0]:='類型';
TempStringGrid.colwidths[1]:=80;
TempStringGrid.cells[2,0]:='註 解';
TempStringGrid.colwidths[2]:=300;
end; procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
begin
for i:=0 to memo1.lines.count do
begin
TempStringGrid.cells[0,i 1]:=Copy(memo1.lines[i],1,5);
TempStringGrid.cells[1,i 1]:=Copy(memo1.lines[i],6,5);
TempStringGrid.cells[2,i 1]:=Copy(memo1.lines[i],11,11);
end;
end; procedure TForm1.Button4Click(Sender: TObject);
var j:integer;
begin
for j:=0 to memo1.lines.count-1 do
begin
ADOQuery1.close;
ADOQuery1.SQL.TEXT:= 'INSERT INTO big.big_test (Data,type,notemp) '
'VALUES ( '
'''' TempStringGrid.cells[0,j 1] ''', '
'''' TempStringGrid.cells[1,j 1] ''', '
'''' TempStringGrid.cells[2,j 1] ''' '
' )';
ADOQuery1.ExecSQL;
end;
end; end.
|
StrongLemon
高階會員 發表:10 回覆:166 積分:105 註冊:2004-04-18 發送簡訊給我 |
|
bigcome2004
一般會員 發表:28 回覆:19 積分:9 註冊:2004-02-17 發送簡訊給我 |
|
StrongLemon
高階會員 發表:10 回覆:166 積分:105 註冊:2004-04-18 發送簡訊給我 |
我的建議是在轉進去之前先判斷欄位是什麼型態,然後資料格式是否符合。
如果不符合,是顯示錯誤訊息還是跳過這欄位(由你決定),
另外也還要判斷匯入資料欄位數是否相等於Table欄位數,資料欄位數過多時你
要選擇顯示錯誤訊息還是忽略。
if ADOQuery1.Fields.Fields[0].DataType=ftInteger then begin if TryStrToInt(tmpstr_data,tmpnum_data)=True then ADOQuery1.Fields.Fields[0].AsInteger:=tmpnum_data else showError... end; |
bigcome2004
一般會員 發表:28 回覆:19 積分:9 註冊:2004-02-17 發送簡訊給我 |
|
StrongLemon
高階會員 發表:10 回覆:166 積分:105 註冊:2004-04-18 發送簡訊給我 |
如果你要不管任何型態都可以塞進去,那Table欄位應該都設成varchar。
總不可能設成decimal時還想要塞進非數字的文字吧..
你可以先判斷塞入資料是何種型態。
用下面類似這行判斷,從StringGrid抓出來的當然都是文字型態,必須自己Code去判斷然後再轉型或者SQL部分必須特別處理。
文字要加""
數字不用加""...還有其他型態....
if TryStrToInt(tmpstr_data,tmpnum_data)=True then tmpdt_DataType=ftInteger else ....或者你根本就用Variant去接,由Variant去處理。 FieldByName('xxxx').AsVariant:=tmpvar_Data;//tmpvar_Data->Variant |
懷舊的人
高階會員 發表:28 回覆:152 積分:141 註冊:2003-01-08 發送簡訊給我 |
建議您可以這樣處理:
var i,j:Integer; S: String; begin for i := 0 to memo1.lines.count-1 do begin with ADOQuery1 do begin Close; SQL.Clear; SQL.Add('SELECT * FORM big.big_test WHERE 0 > 1'); Open; S := ''; // 如果可以切割應該直接就再此處理不用再放到 StringGrid for j := 0 to Field.Count-1 do begin case Fields[j].DataType of ftSmallint,ftInteger,ftWord,ftFloat: S := S Trim(TempStringGrid.cells[j,i 1]); else S := S QuotedStr(Trim(TempStringGrid.cells[j,i 1])); end; if j < Fields.Count-1 then S := S ','; end; SQL.Clear; SQL.Add('INSERT INTO big.big_test (Data,type,notemp) VALUES (' S ')'); try ExecSQL; except end; end; end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |