Транзакция ODBC в .Net с подключением к базе данных PostGresQL. Вставка не отображается, когда внутри транзакции - PullRequest
0 голосов
/ 31 октября 2018

Функция вставки работает, когда не заключена в транзакцию 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 возвращается нормально.

Продолжите мою транзакцию. вставьте записи продаж и т. д., используя этот идентификатор штрих-кода.

Подтвердить транзакцию. Все зафиксировано, но моя таблица штрих-кодов пуста.

Заберите это из транзакции, и таблица штрих-кодов заполняется, но мне это нужно.

Кто-нибудь получил какие-либо идеи, почему он не показывает

1 Ответ

0 голосов
/ 17 ноября 2018

Предостережение: я совсем не знаю 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...