2016-12-17 79 views
0

我有一個數據庫,我需要在每一行填充它的前2列。第一列是日期,第二列是一個ID。填充數據庫給出奇怪的結果

我的代碼如下:

.......  
febr29:array[1..12] of byte = (31,29,31,30,31,30,31,31,30,31,30,31); 
....... 

procedure TForm.populate_database; 
var 
    i,j,m,n: Integer; 
begin 

    for i := 1 to 12 do 
    for j := 1 to febr29[i] do 
     for m := 1 to 9 do 
      for n := 1 to 15 do begin 

      database.tbl1.Append; 
      database.tbl1['date']:= inttostr(j)+'.'+inttostr(i)+'.2016'; 
      database.tbl1['id']:='a'+inttostr(m)+inttostr(n); 
      database.tbl1.Post; 

      end; 

end; 

所以基本上我需要在一年中的每一天所有的ID。但我上面的代碼中的問題:它給了我在數據庫中的一些奇怪的輸出,如下面的圖片:

enter image description here

我在做什麼錯?

+0

對我來說,它看起來像數據庫中的排序問題。查詢一天,並在id後面排序,如:SELECT * FROM Table WHERE date = '23 .9.2016'ORDER BY id 然後您可以檢查是否有所有想要的ID –

+2

看起來很奇怪取決於您期待的內容看到。你認爲什麼*確切*對顯示「奇怪」?對我而言,看起來很奇怪的事情是你爲ID字段創建價值的方式。 – MartynA

+0

@ChristineRoss:是的,這是數據庫中的排序問題。但是它是什麼導致了問題?,因爲數據庫在我發佈的循環中被「排序」。或者我錯了? –

回答

0

如果您的ID字段應該標識數據行,最好在數據庫中將它聲明爲整數列,而不是字符/字符串。

這也將是更好的&不容易出錯,不要試圖從你的循環變量計算的話,而是用計數器運行,而不是

procedure TForm.populate_database; 
var 
    i,j,m,n: Integer; 
    ID : Integer; 
begin 
    ID := 0; 
    for i := 1 to 12 do 
    for j := 1 to febr29[i] do 
     for m := 1 to 9 do 
      for n := 1 to 15 do begin 
      Inc(ID); 
      database.tbl1.Append; 
      database.tbl1['date']:= inttostr(j)+'.'+inttostr(i)+'.2016'; 
      database.tbl1['id'].AsInteger :=ID; 
      database.tbl1.Post; 

當然,如果你必須有「一」字頭和由於某種原因,一個字符coumn類型,你可以做

   database.tbl1['id'].AsString :='a' + IntToStr(ID); 

但即使這可能會給你的結果你沒想到的,除非墊IntToStr(ID)的結果爲固定長度與前導零。

+0

馬丁,我試過你的例子(即使它不是我所需要的),並且數據庫仍然沒有排序[鏈接] http://i.imgur.com/ca7WNQ5.jpg [/ link]。 id列不是所有行的索引。我也不做字符串排序或數字排序,我只是追加到我需要的順序後,數據庫。此時我不會刪除或更改記錄。我正在使用的數據庫是一個微軟訪問數據庫。任何幫助非常感謝 –

+0

'@新的delphi用戶:從我的角度來看,您有兩個/三個選項: 1打開訪問表並在這些列上設置索引。如何做到這一點很大程度上取決於訪問版本 2.不要打擾表中的排序,但可用於進一步使用查詢,您可以在特定字段後排序 3.獲取關於數據庫設計的書籍:你有沒有聽說過關於主鍵,二級索引,查詢/查看等內容? –

+0

@newdelphiuser:在你的屏幕截圖中,如果第二列是ID號,你顯然不會**我在回答中所做的建議,因爲iD值在許多行中都是重複的。另一件事是你**不能**依賴數據庫引擎按照插入它們的順序返回行,除非你在檢索它們時明確指定了它們應該返回的順序。 – MartynA