【问题标题】:Call DB2 stored procedure from C#从 C# 调用 DB2 存储过程
【发布时间】:2021-12-12 05:11:43
【问题描述】:

在线阅读一篇有趣的文章后:Calling DB2 stored procedures from .NET applications

我想分享一个最近遇到的派生代码问题:

DateTime transa_date = DateTime.ParseExact(trandate, "yyyy-MM-dd", 
CultureInfo.InvariantCulture);

DB2Connection conn = new DB2Connection(MyDb2ConnectionString);
conn.Open();

try
{
    // MyDb2Connection.Open();
    // conn.Open();

    // assume a DB2Connection conn
    DB2Transaction trans = conn.BeginTransaction();
    cmd = conn.CreateCommand();

    procName = "MYTBLSCHEMA.TEST";
    procCall = "CALL MYTBLSCHEMA.TEST(@NAME, @ADDRESS_LINE, @REGNUM, @TRANSA)";

    cmd.Transaction = trans;
    cmd.CommandType = System.Data.CommandType.Text;
    cmd.CommandText = procCall; 

    // Register input-output and output parameters for the DB2Command
    cmd.Parameters.Add( new DB2Parameter("@NAME", name));       #of string type
    cmd.Parameters.Add( new DB2Parameter("@ADDRESS_LINE", adr)); #of string type
    cmd.Parameters.Add( new DB2Parameter("@REGNUM", reg));  #of string type
    cmd.Parameters.Add( new DB2Parameter("@TRANSA", transa_date)); #of date type (in DB2 table)

    // Call the stored procedure
    Console.WriteLine(" Call stored procedure named " + procName);
    cmd.ExecuteNonQuery();
}

上述代码既不会在cmd.ExecuteNonQuery() 处生成异常,也不会将(预期的)行插入到表中。

因此,希望通过这篇文章了解这种现象背后的基本原理。

谢谢。

注意:执行(手动)

CALL MYTBLSCHEMA.TEST('test', 'test_address_', 'test_num', 2021-01-01)

IDE 确实可以工作(例如,将行插入表中)。

DB2 版本:11.5.6.0.00000.008

【问题讨论】:

  • DB2Parameter("@ADDRESS_LINE", adr) - 然而参数被命名为@ADDRESS
  • @NAME,@ADDRESS_LINE,@REGNUM,@TRANSA指表列(即分别为NAME,ADDRESS_LINE,REGNUM,TRANSA)和@987654355 @ 是从表单中提取并关联到ADDRESS_LINE 列的变量。希望有帮助;
  • 不,@ADDRESS_LINE 将引用您在 SQL 语句中使用的参数,但没有这样的参数,只有一个称为 @ADDRESS
  • 我在更正错字后编辑了帖子。希望对您有所帮助。
  • 你启动了一个你没有提交的事务?如果我想知道为什么找不到我刚刚插入的数据,那是我开始寻找的第一个地方..

标签: c# .net stored-procedures db2


【解决方案1】:

我要么删除这一行:

DB2Transaction trans = conn.BeginTransaction();

或者我会在try 的末尾添加这一行:

trans.Commit();

至于你会选择哪个;因为它是一个单独的存储过程,除非在存储过程中存在一些内部覆盖问题,在它之外启动事务是有意义的,否则我会删除它。如果您有或计划有多个操作必须全部成功或全部失败,那么我会保留它/提交它..

【讨论】:

  • 感谢您的反馈,凯厄斯。如我之前的命令(22 小时前)所示,删除 transaction 部分(例如DB2Transaction trans = conn.BeginTransaction())解决了这个问题。但是,我刚刚尝试了您对trans.Commit() 的建议:为了避免exception,我建议在cmd.ExecuteNonQuery() 之前插入此命令,而不是在try 的末尾。最佳
  • cmd.ExecuteNonQuery()之前插入这个命令 - 但这不是事务的工作方式;在工作之前不要提交它们(ExecuteNonQuery 在数据库上执行工作);你提交他们之后你做了工作。参见 IBM 的示例:ibm.com/docs/en/db2/9.7?topic=begintransaction- - 事务启动,执行多个命令,然后提交事务。如果你在做任何事情之前提交了一个事务,它就是一个非操作。
  • 如果你的存储过程由于某种原因与事务不兼容,那么你不应该在执行存储过程之前启动一个(或者你根本不应该运行一个事务)
猜你喜欢
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
相关资源
最近更新 更多