delphi - 存储过程插入问题

标签 delphi stored-procedures sql-insert

我有一个正在调用的存储过程,用于在表中插入项目。如果它只将一个项目插入表中,我会收到“操作中止”异常。如果我在插入后添加选择,则效果很好。

我需要做些什么不同的事情,这样我才不会在仅插入时出现异常?

德尔福代码

procedure AddItem(dbCon : TADOConnection; sourcePath : String);
var
  addProc    : TADOStoredProc;


begin
  if FileExists(sourcePath) then
  begin
    try
      addProc := TADOStoredProc.Create(nil);
      addProc.Connection    := dbCon;
      addProc.ProcedureName := 'spTest';
      addProc.Open;

    finally
      addProc.Free();
    end;
  end;
end;

存储过程

ALTER PROCEDURE [dbo].[spTest]
AS
BEGIN
  INSERT INTO dbo.ToSolve (Data, SolveStatus)
  VALUES (null, 1)

  --SELECT * from dbo.ToSolve --I must have a select or I get and exception
END

最佳答案

正如您所发现的,TADOStoredProc.Open用于返回记录集的情况。 使用TADOStoredProc.ExecProc当没有返回记录集时。对于 TADOQuery 也是如此,将 ExecSQL 用于 INSERT/UPDATE/DELETE 语句和 Open 用于 SELECT 语句。所以你的例子应该是这样的:

procedure AddItem(dbCon : TADOConnection; sourcePath : String);

var
  addProc    : TADOStoredProc;

begin
  if FileExists(sourcePath) then
  begin
    addProc := TADOStoredProc.Create(nil);
    try
      addProc.Connection    := dbCon;
      addProc.ProcedureName := 'spTest';
      addProc.ExecProc;    
    finally
      addProc.Free;
    end;
  end;
end;

关于delphi - 存储过程插入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20408036/

相关文章:

delphi - SynMultiSyn 荧光笔插入位置

node.js - 如果我们不知道存储过程绑定(bind)参数,如何在node-oracledb中执行 "Stored Procedure"查询?

mysql - 无法在带有子查询的 Mysql 过程中传递参数

php - 是否可以从存储过程中调用 PHP 文件?

php - 如何从具有主键自增的表向具有外键的表插入数据?

SQLite、Golang 和联结表

delphi - 如何注销事件日志源?

delphi - 设置 TStringGrid 上选定行的背景颜色

delphi - 如何从 Delphi 应用程序中获取 Firefox 书签?

mysql - 使用字符串 SQL 进行 INSERT SELECT