【问题标题】:Get last row data after insert into using Delphi AdoQuery使用 Delphi AdoQuery 插入后获取最后一行数据
【发布时间】:2015-10-22 12:22:41
【问题描述】:

在 Delphi 2007 中使用 ADOQuery 当我使用 insert into 将一行添加到表中时 我如何得到最后一行?

我正在用这个添加行。

QD_TEMP1.close;
QD_TEMP1.sql.Clear;
QD_TEMP1.SQL.Add('insert into s_hasta_Kabul (Protokol,Muay_ID,Ocak_Kod,Tc_Kimlik_No)  ');
QD_TEMP1.SQL.Add('values (:Protokol,:Muay_ID,:Ocak_Kod,:Tc_Kimlik_No) ');
QD_TEMP1.Parameters.ParamByName('Protokol').Value := 0;
QD_TEMP1.Parameters.ParamByName('Muay_ID').Value := 2;
QD_TEMP1.Parameters.ParamByName('Ocak_Kod').Value := 3;
QD_TEMP1.Parameters.ParamByName('Tc_Kimlik_No').Value := 4;
QD_TEMP1.ExecSQL;

如何在 execsql 之后获取最后添加的行?

【问题讨论】:

  • 你的表中是否有标识列
  • 我有 5 个身份列,是的,总共 30 列。不要问为什么5个身份。我不知道它的旧表属于一家公司
  • 但是你只有 1 个正确的主键 :) 我不知道 delphi 但插入后的 SQL 观点SELECT @Id = SCOPE_IDENTITY() 任何进来的东西都只是传递为SELECT * FROM s_hasta_Kabul WHERE pkColumn = @Id
  • “5 标识列”是什么意思?每个表只能有一个标识列。
  • @Jasper - 不是我正在看的图像。当问题的 INSERT 语句中仅指定 4 个时,PK 不仅包含 5 个值,而且在这 4 个中只有 2 个是 PK 的一部分(Okac_KodTC_Kimlik_No )。

标签: sql-server delphi tadoquery


【解决方案1】:

您可以使用OUTPUT 子句返回插入的记录集,无论您是否有标识列(从您的 cmets 看来您没有标识列)。

例如

QD_TEMP1.Close;
QD_TEMP1.sql.Clear;
QD_TEMP1.SQL.Add('insert into s_hasta_Kabul (Protokol,Muay_ID,Ocak_Kod,Tc_Kimlik_No)  ');

QD_TEMP1.SQL.Add('OUTPUT inserted.*');

QD_TEMP1.SQL.Add('values (:Protokol,:Muay_ID,:Ocak_Kod,:Tc_Kimlik_No) ');
QD_TEMP1.Parameters.ParamByName('Protokol').Value := 0;
QD_TEMP1.Parameters.ParamByName('Muay_ID').Value := 2;
QD_TEMP1.Parameters.ParamByName('Ocak_Kod').Value := 3;
QD_TEMP1.Parameters.ParamByName('Tc_Kimlik_No').Value := 4;

QD_TEMP1.Open; // ExecSQL does NOT return recordset
// QD_TEMP1 now contains the inserted result set
ShowMessage(QD_TEMP1.FieldByName('Tc_Kimlik_No').AsString);

注意我们使用QD_TEMP1.Open(不是ExecSQL)返回插入的记录集。

【讨论】:

    【解决方案2】:

    如果在“ExeSQL”之前设置参数方向就可以了。

    q.sql.text := 'insert into TABLE(x) values (:value) set :ID = scope_identity()';
    q.Parameters.ParamByName('VALUE').value := 'XXXXX';
    q.Parameters.ParamByName('ID').Direction := pdReturnValue;
    q.ExecSQL;
    ID := q.Parameters.ParamByName('ID').value;
    

    干杯

    【讨论】:

      【解决方案3】:

      没有测试过,应该是这样的

      QD_TEMP1.close;
      QD_TEMP1.sql.Clear;
      QD_TEMP1.SQL.Add('insert into s_hasta_Kabul (Protokol,Muay_ID,Ocak_Kod,Tc_Kimlik_No)  ');
      QD_TEMP1.SQL.Add('values (:Protokol,:Muay_ID,:Ocak_Kod,:Tc_Kimlik_No) SELECT :test = SCOPE_IDENTITY() ');
      QD_TEMP1.Parameters.ParamByName('Protokol').Value := 0;
      QD_TEMP1.Parameters.ParamByName('Muay_ID').Value := 2;
      QD_TEMP1.Parameters.ParamByName('Ocak_Kod').Value := 3;
      QD_TEMP1.Parameters.ParamByName('Tc_Kimlik_No').Value := 4;
      QD_TEMP1.ExecSQL;
      
      QD_TEMP1.Parameters.ParamByName('test').Value is your new id
      

      【讨论】:

      • 那行不通。首先,QD_Temp1.Parameters.ParamByName('test'); 之前的 QD_TEMP1.ExecSQL; 不会编译。其次,您在INSERT 的末尾(SELECT 之前)缺少;
      • 如果你仔细阅读我的回答,你会看到文字:'have not test it' 和文字“应该是这样的”。这表明我是从顶部输入的我的头脑并没有测试它,但它应该让 OP 朝着正确的方向发展
      • 如果您在此处发布未经测试、不可编译的代码作为答案,您可以预期它会被否决。如果您不知道它会起作用(通过测试),您将对您的声誉在这里发生的事情负责。答案应该是正确和准确的,而不是从你的键盘上推测或编造的明显不正确的东西。我给了你改正的机会;你选择不这样做。
      • 真的吗?因此,如果我手头没有德尔福来测试确切的语法,我不应该回答吗?答案清楚地表明该代码旨在帮助 OP。你所想的只有你在这里的名声吗?好吧,比,做个孩子,然后投票给我,无论什么让你开心
      • 您可以随时发布您想要的任何答案,无论是否经过测试。如果它是错误的,预计它会被否决。这与我的名誉无关;这是本网站的特定工作方式。问题的答案应该是完整和正确的,而你的答案至少是后者失败了。如果您不清楚,请参阅help center。当您在那里时,请访问behavior 部分。至于帮助人们,错误的答案不会帮助任何人。
      【解决方案4】:
      qryTest.Close;
      
      qryTest.SQL.Clear;
      qryTest.SQL.Add(' INSERT INTO TEST_GET_IDX ');
      qryTest.SQL.Add(' (SNAME, AGE) ');
      qryTest.SQL.Add(' VALUES(:pSNAME, :pAGE) ' );
      qryTest.SQL.Add(' SELECT IDX = SCOPE_IDENTITY() ' );   // IDX is IDENTITY
      
      qryTest.Parameters.ParamByName('pSNAME').Value:= edSname.Text;
      qryTest.Parameters.ParamByName('pAGE').Value:= edAge.Text;
      
      qryTest.Open;
      
      showMessage(dsTest.DataSet.FieldByName('IDX').AsString);
      

      【讨论】:

      • [dsTest] 是链接到 [qryTest] 的 DataSource
      • 欢迎来到 SO。请在答案周围包含一些上下文和描述,以帮助解释解决方案。
      猜你喜欢
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多