【问题标题】:ODBC Transasaction in .Net connecting to PostGresQL Database. Insert not showing when inside a Transaction.Net 中的 ODBC 事务连接到 PostGresQL 数据库。插入在事务中时不显示
【发布时间】:2018-10-31 15:01:17
【问题描述】:

插入函数在未包裹 ODBC 事务时起作用。

我在插入时尝试了两种方法。 Currval 和 Returning(在 PostgreSQL 8.1 以上版本中可用)

  ''Dim sql As String = String.Format("Insert into barcodes Values (default, {0},'{1}','{2}','{3}','{4}','{5}','{6}'); Select currval ('barcodes_barcode_id_seq');",
    Dim sql As String = String.Format("Insert into barcodes Values (default, {0},'{1}','{2}','{3}','{4}','{5}','{6}') Returning barcode_id",

我使用 ExecuteScaler 函数通过 ODBC 返回值。

新的barcode_id 可以正常返回。

继续我的交易。使用此条形码 ID 插入销售记录等。

提交事务。一切都已提交,但我的条形码表是空的。

将其从交易中取出,条形码表正在填充,但我需要它。

任何人都知道为什么它没有显示

【问题讨论】:

  • 出于好奇,为什么是 ODBC 而不是 Npgsql?

标签: c# vb.net postgresql transactions odbc


【解决方案1】:

警告:我对 VB.net 不太了解,也没有使用过 ODBC,但我希望这会对您有所帮助。如果有令人信服的理由使用 ODBC 而不是 Npgsql,请告诉我。

首先,假设填充了以下对象类:

public class Barcode
{
    public int BarcodeId { get; set; }
    public string Barcode1 { get; set; }
    public string Barcode2 { get; set; }
    public string Barcode3 { get; set; }
    public string Barcode4 { get; set; }
    public string Barcode5 { get; set; }
    public string Barcode6 { get; set; }
}

以下代码将获取Barcode 对象的列表,插入它们并使用数据库中的结果填充BarcodeId 属性:

string sql = @"
    insert into barcodes
    values (default, :B1, :B2, :B3, :B4, :B5, :B6)
    returning barcode_id
";

NpgsqlTransaction trans = conn.BeginTransaction();
NpgsqlCommand cmd = new NpgsqlCommand(sql, conn, trans);
cmd.Parameters.Add(new NpgsqlParameter("B1", NpgsqlTypes.NpgsqlDbType.Text));
cmd.Parameters.Add(new NpgsqlParameter("B2", NpgsqlTypes.NpgsqlDbType.Text));
cmd.Parameters.Add(new NpgsqlParameter("B3", NpgsqlTypes.NpgsqlDbType.Text));
cmd.Parameters.Add(new NpgsqlParameter("B4", NpgsqlTypes.NpgsqlDbType.Text));
cmd.Parameters.Add(new NpgsqlParameter("B5", NpgsqlTypes.NpgsqlDbType.Text));
cmd.Parameters.Add(new NpgsqlParameter("B6", NpgsqlTypes.NpgsqlDbType.Text));

foreach (Barcode b in barcodes)
{
    cmd.Parameters[0].Value = b.Barcode1;
    cmd.Parameters[1].Value = b.Barcode2;
    cmd.Parameters[2].Value = b.Barcode3;
    cmd.Parameters[3].Value = b.Barcode4;
    cmd.Parameters[4].Value = b.Barcode5;
    cmd.Parameters[5].Value = b.Barcode6;

    b.BarcodeId = Convert.ToInt32(cmd.ExecuteScalar());
}

trans.Commit();

【讨论】:

    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 2014-03-19
    • 2016-03-29
    • 2019-07-13
    • 2012-11-20
    • 2012-11-20
    • 1970-01-01
    • 2015-09-13
    相关资源
    最近更新 更多