Работа с SQLite в цикле (ИЗ listbox В SQLite)
Цитата: Сергей Н. от 12.10.2020, 07:11Добрый день.
Пытаюсь победить такую задачу.
Создаю табличку в SQLite, и хочу загонять в нее то, что находится listbox (всего один столбец).
[spoiler]private void Button1_Click(object sender, EventArgs e) { listBox1.Items.Clear(); --чистим лист listBox1.Items.AddRange(textBox1.Lines); --перегоняем то что написали в текст в лист (как сделать это проще не придумал) for (int i = 0; i < listBox1.SelectedItems.Count; i++) { wsConnection.Open(); -- открываем соединение в цикле (как по мне то логично делать это именно внутри цикла) SQLiteCommand command_ins = wsConnection.CreateCommand(); command_ins.CommandText = "INSERT INTO JCP (us_name, j_key, pc_name, pc_about, j_date) VALUES(@us_name, @j_key, @pc_name, @pc_about, @j_date)"; command_ins.Parameters.Add("@us_name", System.Data.DbType.String).Value = "0"; command_ins.Parameters.Add("@j_key", System.Data.DbType.String).Value = listBox1.SelectedItems[i]; -- тут вроде всё в порядке (ВРОДЕ БЫ, но это не точно, иначе не спрашивал бы) command_ins.Parameters.Add("@pc_name", System.Data.DbType.String).Value = "0"; command_ins.Parameters.Add("@pc_about", System.Data.DbType.String).Value = "0"; command_ins.Parameters.Add("@j_date", System.Data.DbType.String).Value = DateTime.Now; command_ins.ExecuteNonQuery(); wsConnection.Close(); -- закрываем тоже в цикле (нет???) } }[/spoiler]
Код отрабатывает, при чем без ошибок... но результата нет. Я могу вставить одну запись, но как только помещаю SQLiteCommand в цикл то записи просто не вставляются... Почему так?(( И что я делаю не так??(
Заранее благодарен.
Добрый день.
Пытаюсь победить такую задачу.
Создаю табличку в SQLite, и хочу загонять в нее то, что находится listbox (всего один столбец).
private void Button1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear(); --чистим лист
listBox1.Items.AddRange(textBox1.Lines); --перегоняем то что написали в текст в лист (как сделать это проще не придумал)
for (int i = 0; i < listBox1.SelectedItems.Count; i++)
{
wsConnection.Open(); -- открываем соединение в цикле (как по мне то логично делать это именно внутри цикла)
SQLiteCommand command_ins = wsConnection.CreateCommand();
command_ins.CommandText = "INSERT INTO JCP (us_name, j_key, pc_name, pc_about, j_date) VALUES(@us_name, @j_key, @pc_name, @pc_about, @j_date)";
command_ins.Parameters.Add("@us_name", System.Data.DbType.String).Value = "0";
command_ins.Parameters.Add("@j_key", System.Data.DbType.String).Value = listBox1.SelectedItems[i]; -- тут вроде всё в порядке (ВРОДЕ БЫ, но это не точно, иначе не спрашивал бы)
command_ins.Parameters.Add("@pc_name", System.Data.DbType.String).Value = "0";
command_ins.Parameters.Add("@pc_about", System.Data.DbType.String).Value = "0";
command_ins.Parameters.Add("@j_date", System.Data.DbType.String).Value = DateTime.Now;
command_ins.ExecuteNonQuery();
wsConnection.Close(); -- закрываем тоже в цикле (нет???)
}
}
Код отрабатывает, при чем без ошибок... но результата нет. Я могу вставить одну запись, но как только помещаю SQLiteCommand в цикл то записи просто не вставляются... Почему так?(( И что я делаю не так??(
Заранее благодарен.
Цитата: KiloSub от 12.10.2020, 08:36for (int i = 0; i < listBox1.SelectedItems.Count; i++)Привет, не пойму, а кто их выделяет? Вроде как ни одного и не выделено.
for (int i = 0; i < listBox1.SelectedItems.Count; i++)
Привет, не пойму, а кто их выделяет? Вроде как ни одного и не выделено.
Цитата: Сергей Н. от 12.10.2020, 08:55Цитата: KiloSub от 12.10.2020, 08:36for (int i = 0; i < listBox1.SelectedItems.Count; i++)Привет, не пойму, а кто их выделяет? Вроде как ни одного и не выделено.
Да, что-то я видимо навертел не того)
Решение найдено (оставлю его тут, вдруг кому-то пригодится):[spoiler]
-- открывать коннект необязательно в цикле, можно делать это и за циклом или при загрузке формы, как это сделал я. -- далее: private void Button1_Click(object sender, EventArgs e) { try { listBox1.Items.Clear(); -- чистим лист, чтобы избежать ненужной информации listBox1.Items.AddRange(textBox1.Lines); -- загоняем из текст в лист for (int i = 0; i < listBox1.Items.Count; i++) -- запускаем цикл перебирая строки (значения) из листа { SQLiteCommand command_ins = wsloadkey.CreateCommand(); command_ins.CommandText = "INSERT INTO JCP (us_name, j_key, pc_name, pc_about, j_date) VALUES(@us_name, @j_key, @pc_name, @pc_about, @j_date)"; command_ins.Parameters.Add("@us_name", System.Data.DbType.String).Value = "0"; command_ins.Parameters.Add("@j_key", System.Data.DbType.String).Value = listBox1.Items[i]; -- может быть это делается как-то иначе, но у меня работает так, думаю этого будет достаточно command_ins.Parameters.Add("@pc_name", System.Data.DbType.String).Value = "0"; command_ins.Parameters.Add("@pc_about", System.Data.DbType.String).Value = "0"; command_ins.Parameters.Add("@j_date", System.Data.DbType.String).Value = DateTime.Now; command_ins.ExecuteNonQuery(); -- коннект в цикле закрывать нельзя, иначе вставится только первая строка, НО, если хотим дергать коннект постоянно, тогда надо открывать коннект в цикле и закрывать его так же в цикле иначе будет ругать и можно поломать БД } //wsloadkey.Close(); -- коннект закрываю тут, если не требуется дальнейшая работа, если дальше планируется работа на форме с БД, то коннект лучше вообще не дергать в самом цикле и функции в целом } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }[/spoiler]
Цитата: KiloSub от 12.10.2020, 08:36for (int i = 0; i < listBox1.SelectedItems.Count; i++)Привет, не пойму, а кто их выделяет? Вроде как ни одного и не выделено.
Да, что-то я видимо навертел не того)
Решение найдено (оставлю его тут, вдруг кому-то пригодится):
-- открывать коннект необязательно в цикле, можно делать это и за циклом или при загрузке формы, как это сделал я.
-- далее:
private void Button1_Click(object sender, EventArgs e)
{
try
{
listBox1.Items.Clear(); -- чистим лист, чтобы избежать ненужной информации
listBox1.Items.AddRange(textBox1.Lines); -- загоняем из текст в лист
for (int i = 0; i < listBox1.Items.Count; i++) -- запускаем цикл перебирая строки (значения) из листа
{
SQLiteCommand command_ins = wsloadkey.CreateCommand();
command_ins.CommandText = "INSERT INTO JCP (us_name, j_key, pc_name, pc_about, j_date) VALUES(@us_name, @j_key, @pc_name, @pc_about, @j_date)";
command_ins.Parameters.Add("@us_name", System.Data.DbType.String).Value = "0";
command_ins.Parameters.Add("@j_key", System.Data.DbType.String).Value = listBox1.Items[i]; -- может быть это делается как-то иначе, но у меня работает так, думаю этого будет достаточно
command_ins.Parameters.Add("@pc_name", System.Data.DbType.String).Value = "0";
command_ins.Parameters.Add("@pc_about", System.Data.DbType.String).Value = "0";
command_ins.Parameters.Add("@j_date", System.Data.DbType.String).Value = DateTime.Now;
command_ins.ExecuteNonQuery();
-- коннект в цикле закрывать нельзя, иначе вставится только первая строка, НО, если хотим дергать коннект постоянно, тогда надо открывать коннект в цикле и закрывать его так же в цикле иначе будет ругать и можно поломать БД
}
//wsloadkey.Close(); -- коннект закрываю тут, если не требуется дальнейшая работа, если дальше планируется работа на форме с БД, то коннект лучше вообще не дергать в самом цикле и функции в целом
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}