【问题标题】:Inserting different parts of a record at different times when writing to database写入数据库时​​在不同时间插入记录的不同部分
【发布时间】:2016-03-26 08:37:52
【问题描述】:

我的问题是我在不同时间将数据写入同一记录中的单独字段,当我将数据添加到同一记录中的第二个设置字段时,我收到一条错误消息:

您必须在“tblWorkoutDetails.Username”字段中输入一个值

尽管在之前的语句中输入了该数据。

这里引用的表名为tblWorkoutDetails,具有以下字段:

  • 锻炼ID
  • 用户名
  • 锻炼日期
  • 重量
  • 腰部

WorkoutID 和用户名 组成一个复合键。此表与另一个表相关,我也在以相同的方式向其中写入数据。

我正在使用以下代码将记录的第一部分(构成我的复合键的字段)写入数据库:

adotblWorkoutDetails['Username'] := Username;
adotblWorkoutDetails['WorkoutID'] := CurrentWorkout+1;
adotblWorkoutDetails.Post;
adotblWorkoutDetails.Refresh;

分配给字段的值只是变量,并且可以完美执行。

填写该记录中其余字段的第二条语句如下:

adotblWorkoutDetails['WorkoutDate'] := Date;
adotblWorkoutDetails['Weight'] := Weight;
adotblWorkoutDetails['Waist'] := Waist;
adotblWorkoutDetails.Post;
adotblWorkoutDetails.Refresh;

程序因上述adotblWorkoutDetails.Post 错误而中断。在尝试解决此问题时,我尝试重新分配必填字段,但是我收到一条错误消息,提示我输入了重复数据。此外,当我在第一次填写记录中的每个字段时(使用示例数据填写第二个数据条目的“保留”字段),代码执行完美,写入另一个表的代码也是如此.

我不知道如何解决这个问题。如果您需要更多信息/代码截图,请询问。

此代码给了我“您必须在字段中输入一个值...”错误:

取消注释这两行会给我重复数据错误:

【问题讨论】:

  • 消息“您必须在 'tblWorkoutDetails.Username' 字段中输入值”来自应用程序中的代码,而不是 Delphi 库代码。因此,您需要将包含此消息的代码添加到您的 q.同样,包含您正在输入重复数据的消息的代码。
  • 尝试在您的第一个 adotblWorkoutDetails.Refresh 之后添加 showmessage(adotblWorkoutDetails.fieldbyname('WorkoutID').AsString)。对 username 字段执行相同操作。确保它们确实设置好了。
  • MartynA - 我不确定我是否理解你的建议。我还没有编写任何包含带有该错误消息的验证,如果那是你得到的。另请参阅代码截图编辑。
  • 该消息并非凭空而来,它必须在您的代码或您正在使用的某个单元中。无论如何,您仍然没有发布足够多的代码;在您的第一个 .Post 之后,您在哪里调用“adotblWorkoutDetails.Edit”以启用将其他更改应用于数据集?
  • 你在应该编辑当前记录的地方追加一个记录

标签: mysql delphi delphi-xe


【解决方案1】:

我怀疑发生的事情是您的第二个操作错误地执行了另一个 insert 而不是 edit,并且您得到的异常是 insert 的结果em>UserName 字段将其 Required 属性设置为 True

这就像你描述的那样:

adotblWorkoutDetails.Insert;
adotblWorkoutDetails['Username'] := Username;
adotblWorkoutDetails['WorkoutID'] := CurrentWorkout+1;
adotblWorkoutDetails.Post;
//adotblWorkoutDetails.Refresh;    // Refresh is not required

adotblWorkoutDetails.Insert;
adotblWorkoutDetails['WorkoutDate'] := Date;
adotblWorkoutDetails['Weight'] := Weight;
adotblWorkoutDetails['Waist'] := Waist;
adotblWorkoutDetails.Post;
// adotblWorkoutDetails.Refresh;  // Again, not required

你应该做什么:

adotblWorkoutDetails.Insert;
adotblWorkoutDetails['Username'] := Username;
adotblWorkoutDetails['WorkoutID'] := CurrentWorkout+1;
adotblWorkoutDetails.Post;

// Locate the correct record using Locate or FindKey first, then 
adotblWorkoutDetails.Edit;
adotblWorkoutDetails['WorkoutDate'] := Date;
adotblWorkoutDetails['Weight'] := Weight;
adotblWorkoutDetails['Waist'] := Waist;
adotblWorkoutDetails.Post;

(为了将来参考,永远不要将您的任何代码发布为图像;如果您需要发布代码,请复制并粘贴代码本身。Here's a list 您应该这样做的原因不。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-26
    • 2019-02-15
    • 2022-01-25
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多