【问题标题】:Teradata .NET Paramaters: Can I use Output parameters with SQL (ie, not using a stored procedure)?Teradata .NET 参数:我可以将输出参数与 SQL 一起使用(即,不使用存储过程)吗?
【发布时间】:2012-07-12 20:01:45
【问题描述】:

我想做这样的事情:

Dim pId As TdParameter = New TdParameter With {.ParameterName = "p_id", .SourceColumn = "id", .TdType = TdType.Integer, .Direction = ParameterDirection.Output}

然后像这样:

cmd.Parameters.Add(pId);

cmd.CommandText = "insert into employee (id, name, age) values (?, 'bob', 34)"

cmd.ExecuteNonQuery();

然后让pId.Value 返回新记录的Id 列(它是一个标识列)的值。如果我能做到,那就太好了。

【问题讨论】:

    标签: .net sql parameters teradata


    【解决方案1】:

    INSERT 语句的执行永远不会返回结果集。最多您可能会收到返回给客户端的活动计数。要获取标识列的值,需要在 INSERT 完成后使用 SELECT 语句。

    【讨论】:

    • 刚刚回到这个话题。我最终尝试了您的方法并且它有效,但只是间歇性的。有时,我会收到异常 Transaction ABORTed due to Deadlock。所有这些都发生在 VB.NET 代码中的事务中。在我插入记录后的同一事务中,我这样做:locking row for access select id from dbname.employee where emailaddress = ?。行锁定是导致问题的原因吗?我应该删除它吗?我仍在学习 Teradata,还没有了解何时应该使用行锁定,何时不应该使用行锁定。
    • LOCKING 修饰符不是您看到错误消息的原因。您是否启用了查询日志记录,以便在您尝试修改 EMPLOYEE 表的同时查看正在运行的其他事务?
    • 查看我的问题的最新更新。从那以后我就没有遇到过锁定问题。也许我的 SQL 中的锁定并没有导致它,但也许在事务中间进行选择会导致问题。不知道。
    • 如果您查看我的代码,就会产生以下问题:您是否可以使用原始 SQL 选择刚刚插入的行,或者我的示例是否只能由 Teradata .NET 提供程序实现。
    • ACCESS 锁定的引入是为了允许在表被另一个进程修改时对表进行脏读。如果您尝试读取属于尚未提交的事务的一部分的记录(或多个记录),您将面临死锁或被阻塞的风险。我敢打赌,如果您使用的是 READ 锁而不是 ACCESS 锁,那么您最终可能会被阻塞而不是死锁。
    【解决方案2】:

    假设有一个表:

    • ID整数(标识列默认生成无循环)
    • 名称 varchar(20)
    • 电子邮件 varhcar(50)

    您的插入语句不要使用.ExecuteNonQuery(),而是使用.ExecuteReader()。它实际上会返回刚刚插入的记录,并带有 Identity 列的值!

    Using cmd As TdCommand = MyConnection.CreateCommand
        cmd.GeneratedDataBehavior = GeneratedDataBehavior.IdentityColumn
        cmd.CommandText = "insert into mydb.employee (name, email) values ('bob', 'bob@snob.com')"
        Using reader As TdDataReader = cmd.ExecuteReader
            While reader.Read
                Id = reader.GetInt64(reader.GetOrdinal("Id"))
                iRowsInserted += 1
            End While
        End Using
    End Using
    

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 2013-04-29
      • 1970-01-01
      相关资源
      最近更新 更多