簡體   English   中英

在Delphi Xe8中將數據插入數據庫

[英]Inserting data into a database in delphi Xe8

我正在處理的項目需要一個“注冊”表單,該表單需要將“用戶”詳細信息插入數據庫表中。

問題在於,當單擊“注冊”按鈕時,輸入到編輯中的數據不會保存或更新到數據庫中。 我還收到訪問沖突“在地址0x0000006c的0x0065e3e9讀取時發生訪問沖突 ,我的代碼在“ tblUsers.Insert”處中斷。

我已經測試了我的代碼,並且使用Breaks遍歷了每一行代碼,以找到問題的根源,並且發現它是以下代碼部分。

with dmSM do
  begin
    tblUsers.Insert;
    tblUsers['FirstName'] := edtFirstName.Text;
    tblUsers['LastName'] := edtLastName.Text;
    tblUsers['BirthDate'] := cmbDay.Text + ' ' + cmbMonth.Text + ' ' +
                             cmbYear.Text;
    tblUsers['Gender'] := cmbGender.Text;
    tblUsers['AccountName'] := edtAccountName.Text;
    tblUsers['Password'] := edtPassword.Text;
    tblUsers.Post;
end; //end of with

我將嘗試另一種方法,但是如果我可以從中獲得一些幫助,它將很有幫助。

先感謝您

多米尼克

我提出這個答案是為了完整性,並為將來的讀者帶來好處。

在您的情況下,第一件事就是在btlUsers.Insert上設置一個斷點。 這將確認執行已到達該點,並且在執行該行時會發生異常。

為什么例外? 消息的一部分中有一個提示,即“讀取地址0x0000006c”。 在Delphi中,一個Nil指針實際上是0x00000000,而6c是一個小數字(十進制為108),這就是線索,調試器告訴您異常發生於0x00000000很小的偏移量。

Delphi編譯代碼的一個特點是,成員的地址(例如對象的數據字段)相對於對象的基址有一定的固定偏移量(通常是很小的,除非所涉及的類非常大)。

在您的情況下,6c偏移量從0x00000000開始,因此,一個合理的解釋是您的代碼已嘗試讀取實際上為Nil的對象的成員。

因此,在斷點處評估dmSM和tblUsers。 調試器告訴您dmSM為Nil,tblUsers無法訪問,並且由於dmSM為Nil而無法訪問。 為何dmSM Nil?

最有可能的原因是,它是一個變量,它引用到斷點時尚未創建的對象。 所以:

轉到項目管理器,右鍵單擊其中的可執行文件,然后選擇選項。 左側樹中的“表單”條目將告訴您哪些表單/數據模塊具有與之關聯的自動創建的變量以及它們的創建順序。

然后,在.Dpr文件中查找。 它看起來應該像這樣:

begin
  Application.Initialize;
  Application.CreateForm(TDataModule1, DataModule1);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

並且如果缺少創建數據模塊的行,或者它緊隨創建表單的行之后,那是您的問題,而且修復起來很簡單。

但是,有時,.Dpr文件中的所有內容似乎都還可以,但是仍然會發生異常。 @JerryDodge提出了這一點,這是一個很好的觀點。 發生的結果是(通常是由於編輯錯誤),您復制了一個自動創建的對象的聲明。 所以,現在,例如,你有定義了兩個消失性商源,一個在TdmSM定義的單元,和一個在你的數據模塊的單元重復其他地方,編譯器看到在編譯過程中。 並且由於在編譯發生異常的單元時最近才看到重復項,因此假定您的代碼引用的是重復項,而不是原始的。

我試圖以如此細膩的細節回答這個問題的原因是為了指出,許多調試過程正在思考通過仔細觀察(並以SO q形式報告)錯誤行為所獲得的線索。程序。

最后,避免使用“ with”。 盡管它可以為您節省一些打字時間,但從長遠來看,它往往會帶來更多的麻煩,而不是值得的。 在表單單元中,如果需要繼續引用數據模塊中的某個對象,則可以將其值分配給在您執行表單的過程中局部作用於過程的局部變量,或者(更好)定義一個函數來返回有問題的對象,像這樣

function TForm1.tblUsers : TDataSet;
begin
  Result := dmSM.tblUsers;
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM