Eng Mohamed Bassuny Ответов: 1

Как сделать массовую вставку в базу данных sqlite windows forms из listview


всем привет

Прежде всего "Пожалуйста не судите меня я новичок в программировании"

Я перепробовал множество кодов для вставки мультирегистраторов "Массовая Вставка В SQLite- и я всегда получаю исключения.

я использовал
1. SQLite.NET.dll

using Finisar.SQLite;


2. SQLite3.dll


у меня есть 3 кода 2 из них дали мне исключения а другой работает но это не лучший из них

я предпочитаю первый и второй вариант, потому что думаю, что смогу откатиться назад, если возникнет ошибка

последний код я пишу сам муравей первый и второй я получил его из интернета но я не могу заставить его работать хорошо

&ГТ;&ГТ;&ГТ;&ГТ;&ГТ;&ГТ; "Пример моего интерфейса"
так что пожалуйста если кто нибудь сможет мне помочь я буду благодарен

Что я уже пробовал:

Первый Код :

dbConnection StartConn = new dbConnection();
SQLiteConnection MyConnetion = StartConn.GetConnection();

SQLiteCommand Cm = new SQLiteCommand();

MyConnetion.Open();

using (Cm = new SQLiteCommand())
{
    using (var transaction = MyConnetion.BeginTransaction())
    {
        for (var i = 0; i < listView.Items.Count; i++)
        {
            Cm.CommandText = "insert into InvoiceDetails (Invoice_Id,Item_Id,Item_Description,Item_NeededQuantity,Item_UnitPrice,Item_Discount,Item_Total) " +
                "values (@Invoice_Id,@Item_Id,@Item_Description,@Item_NeededQuantity,@Item_UnitPrice,@Item_Discount,@Item_Total)";

            Cm.Parameters.Add("@Invoice_Id", it.TempInvoice_Id.ToString());
            Cm.Parameters.Add("@Item_Id", listView.Items[i].SubItems[0].Text);
            Cm.Parameters.Add("@Item_Description", listView.Items[i].SubItems[1].Text);
            Cm.Parameters.Add("@Item_NeededQuantity", listView.Items[i].SubItems[2].Text);
            Cm.Parameters.Add("@Item_UnitPrice", listView.Items[i].SubItems[3].Text);
            Cm.Parameters.Add("@Item_Discount", listView.Items[i].SubItems[4].Text);
            Cm.Parameters.Add("@Item_Total", listView.Items[i].SubItems[5].Text);

            Cm.ExecuteNonQuery();
        }

        transaction.Commit();
    }
}

MyConnetion.Close();


Второй Код :

dbConnection StartConn = new dbConnection();
SQLiteConnection MyConnetion = StartConn.GetConnection();

using (MyConnetion)
{
    var command = MyConnetion.CreateCommand();

    command.CommandText = "insert into InvoiceDetails (Invoice_Id,Item_Id,Item_Description,Item_NeededQuantity,Item_UnitPrice,Item_Discount,Item_Total) " +
        "values (@Invoice_Id,@Item_Id,@Item_Description,@Item_NeededQuantity,@Item_UnitPrice,@Item_Discount,@Item_Total)";
    command.Parameters.Add("@Invoice_Id");
    command.Parameters.Add("@Item_Id");
    command.Parameters.Add("@Item_Description");
    command.Parameters.Add("@Item_NeededQuantity");
    command.Parameters.Add("@Item_UnitPrice");
    command.Parameters.Add("@Item_Discount");
    command.Parameters.Add("@Item_Total");


    MyConnetion.Open();

    using (var transaction = MyConnetion.BeginTransaction())
    {
        command.Prepare();

        for (var i = 0; i < listView.Items.Count; i++)
        {
            command.Parameters["@Invoice_Id"].Value = it.TempInvoice_Id.ToString();
            command.Parameters["@Item_Id"].Value = listView.Items[i].SubItems[0].Text;
            command.Parameters["@Item_Description"].Value = listView.Items[i].SubItems[1].Text;
            command.Parameters["@Item_NeededQuantity"].Value = listView.Items[i].SubItems[2].Text;
            command.Parameters["@Item_UnitPrice"].Value = listView.Items[i].SubItems[3].Text;
            command.Parameters["@Item_Discount"].Value = listView.Items[i].SubItems[4].Text;
            command.Parameters["@Item_Total"].Value = listView.Items[i].SubItems[5].Text;

            command.ExecuteNonQuery();
        }

        transaction.Commit();
    }
}


Последний код (на мой взгляд, он не лучший, но он работает):

dbConnection StartConn = new dbConnection();
SQLiteConnection MyConnetion = StartConn.GetConnection();

for (var i = 0; i < listView.Items.Count; i++)
{

    SQLiteCommand Cm = new SQLiteCommand("insert into InvoiceDetails (Invoice_Id,Item_Id,Item_Description,Item_NeededQuantity,Item_UnitPrice,Item_Discount,Item_Total) " +
                "values (@Invoice_Id,@Item_Id,@Item_Description,@Item_NeededQuantity,@Item_UnitPrice,@Item_Discount,@Item_Total)", MyConnetion);

Cm.Parameters.Add("@Invoice_Id", it.TempInvoice_Id.ToString());
Cm.Parameters.Add("@Item_Id", listView.Items[i].SubItems[0].Text);
Cm.Parameters.Add("@Item_Description", listView.Items[i].SubItems[1].Text);
Cm.Parameters.Add("@Item_NeededQuantity", listView.Items[i].SubItems[2].Text);
Cm.Parameters.Add("@Item_UnitPrice", listView.Items[i].SubItems[3].Text);
Cm.Parameters.Add("@Item_Discount", listView.Items[i].SubItems[4].Text);
Cm.Parameters.Add("@Item_Total", listView.Items[i].SubItems[5].Text);

MyConnetion.Open();

Cm.ExecuteNonQuery();

MyConnetion.Close();

}

Gerry Schmitz

Идите с тем, что работает; если только кто-то не заинтересован в "обнаружении различий".

Знаете ли вы, что такое listview "источник данных"? Знаете ли вы, что вы можете использовать это вместо фактического listview?

Eng Mohamed Bassuny

данные listview поступают от пользователя программы это временные данные еще не вставленные в базу данных

вы можете увидеть эту картину https://www9.0zz0.com/2019/05/02/23/563315426.png


это пример моей программы

Gerry Schmitz

Итак, вы говорите, что не знаете, что такое источник данных, пользователь загружает что-то в программу, которую вы не писали, но вы хотите сделать "массовую вставку".

Тогда мое предложение "любить того, кто работает" остается в силе.

Eng Mohamed Bassuny

я не очень хорошо себя чувствую из-за твоих последних слов, но спасибо, что пытаешься мне помочь

Gerry Schmitz

Говорят: "люби того, с кем ты", то есть будь доволен своими благословениями. Я сказал: используйте источник данных, и вы проигнорировали меня. Мое время вышло.

Eng Mohamed Bassuny

Я никогда никого не игнорирую но мне жаль если ты чувствуешь это от меня

и почему я не отвечаю об источнике данных потому что мне не нужен источник данных для listview

причина добавления listview заключается просто в том, чтобы показать пользователю, что он добавит для проверки, есть ли ошибка в некоторых элементах или нет

таким образом listview не нуждается в источнике данных или я не могу понять как я могу использовать его для listview

и я пришел сюда учиться и получить некоторый опыт я не могу получить его из других сетей

не заставляй меня чувствовать себя глупо

и у вас есть все ваше время и извините что беспокою вас :)

1 Ответов

Рейтинг:
1

Christian Graus

Последний выглядит хорошо для меня, не знаю, почему другие не работают. Тот факт, что у вас нет транзакции вокруг них, означает, что это больше не массовая вставка. Массовая вставка означает, что вы вставляете их все сразу, для скорости