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

我文字檔轉檔資料表問題

尚未結案
bigcome2004
一般會員


發表:28
回覆:19
積分:9
註冊:2004-02-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-24 17:31:05 IP:59.120.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-26 00:11:24 IP:211.74.xxx.xxx 未訂閱
轉檔不外乎固定格式或者固定幾個切割文字字元(空白、Tab、逗號、分號、或者特別奇怪字元ex:[d#q@$])。 以觀念上來說,就是看使用者(客戶)會用哪幾個然後再寫。 Table沒有隨機變動的,如果說你寫資料庫工具類那當然是可以變動。 較好的範例請參照MS-SQL匯入資料時的精靈介面。
bigcome2004
一般會員


發表:28
回覆:19
積分:9
註冊:2004-02-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-26 15:32:33 IP:59.120.xxx.xxx 未訂閱
dear StrongLemon:   謝謝指導,我有另一個問題發生,我的文字檔要傳進table時,因為我的欄位是用SQL開的,所以我把要傳進去的某些欄位屬性設成varchar,有些設成decimal的屬性結果發生錯誤入下圖: 而我開的資料表如下: 請幫忙解答..謝謝
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-26 23:34:41 IP:203.67.xxx.xxx 未訂閱
我的建議是在轉進去之前先判斷欄位是什麼型態,然後資料格式是否符合。 如果不符合,是顯示錯誤訊息還是跳過這欄位(由你決定), 另外也還要判斷匯入資料欄位數是否相等於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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-27 09:18:23 IP:59.120.xxx.xxx 未訂閱
dear StrongLemon: 我是想知道有沒有辦法,可以把資料不管是數字或是文字形態都放進去,但是因為我是從stringGrid裡面抓資料放入table中所以抓出來的都是文字型態,所以在這個地放不知如何讓它變成數字型態,因為我是把SQL語法存入ADOQuery中所以我在享有沒有辦法可以直接在與法理面下指令讓她轉型,或是有其他更好的方式!!請各位大大指導!!
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-27 14:25:03 IP:221.169.xxx.xxx 未訂閱
如果你要不管任何型態都可以塞進去,那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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-27 17:55:25 IP:211.78.xxx.xxx 未訂閱
建議您可以這樣處理:     
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;
 
系統時間:2024-06-28 8:15:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!