Так что я пытаюсь записать свой список в базу данных, и у меня есть несколько вопросов. Прежде всего, кажется, что ничего не сохраняется в базе данных, но нет ошибок, которые могли бы привести к сбою софта, и я точно знаю, что этот кусок кода работал для меня в прошлом:
public void saveToDb(int var1, string var2)
{
SqlCommand cmd = new SqlCommand("Insert into [table] (col1, col2) VALUES (@param1, @param2)", conn);
cmd.Parameters.AddWithValue("@param1", var1);
cmd.Parameters.AddWithValue("@param2", var2);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
У меня есть слой из трех частей: интерфейс, логика и DAL. Во-первых, он не работал с базой данных и файлами app.config в библиотеке классов DAL, поэтому они были перемещены в основную библиотеку классов, и теперь она не скулит о базе данных, уже существующей, и находит мою строку подключения.
Чтобы отправить данные в этот метод, я делаю это так:
for (int i = 0; i < myList.Count; i++)
{
da.saveToDb(myList.val1, myList.val2);
}
Это не дает мне ошибку в коде, но кажется, что ничего не сохраняется или сбрасывается, когда я останавливаю программу, но я не знаю, какой, но я могу видеть, что переменная передается правильно, печатая их перед выполнением вставки, так что я угадываю БД сбрасывается? Он помещает мою базу данных в папку отладки и очищает ее каждый раз или как?
Другое дело, что в прошлый раз, когда я сделал это, это была форма, поэтому всегда должна была быть только одна вставка за раз, сейчас мой список объектов может содержать от 1 до нескольких объектов, и таким образом я бы открывать и закрывать соединение БД один раз для каждого объекта в моем списке, верно? Как вы делаете массовые вставки? Читал о наборах данных, но все они, кажется, о чтении из базы данных, а не записи, поэтому я не уверен в этом. Я читал из базы данных в другом проекте, используя набор данных и адаптер, так что это не должно быть проблемой, но как мне массово отправить список в таблицу? Чтобы сделать его более сложным, я не могу просто преобразовать весь список, потому что 10 свойств 8 собираются в одну таблицу, а оставшиеся 2 - во вторую таблицу, поэтому мне нужно было бы зациклить их и добавить соответствующее свойство в соответствующий набор данных (или что вы используете).
редактировать
Что ж, теперь я внес некоторые коррективы и попробовал два метода, и ни один из них не работает, но ни один из них не выдает ошибку, которая вызывает разочарование.
Первый метод:
public void saveToDb(int val1, string val2)
{
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["[MyConnectionString]"].ConnectionString);
SqlCommand cmd = new SqlCommand("Insert into [table] (val1, val2) VALUES (@param1, @param2)", conn);
cmd.Parameters.AddWithValue("@param1", val1);
cmd.Parameters.AddWithValue("@param2", val2);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
А второй я пытаюсь sqlbulkcopy таблицы:
public void SaveToDb()
{
using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["[MyConnectionString]"].ConnectionString))
{
conn.Open();
using (SqlBulkCopy bulk = new SqlBulkCopy(conn))
{
bulk.ColumnMappings.Add("col1", "col1");
bulk.ColumnMappings.Add("col2", "col1");
bulk.DestinationTableName = "[table]";
System.Diagnostics.Debug.Print("Open");
bulk.WriteToServer(tab);
foreach (DataRow row in tab.Rows)
{
foreach (var item in row.ItemArray)
{
System.Diagnostics.Debug.Print(item.ToString());
}
}
System.Diagnostics.Debug.Print("sending");
}
System.Diagnostics.Debug.Print("closing");
}
}
Мне не нужно отображать его, так как таблица содержит те же столбцы, что и таблица с тем же наименованием (верхний / нижний регистр), но это становится странным с первичным ключом, который увеличивается, поэтому я отобразил его, поэтому он должен добавить приращение автоматически, но ничего не вставляется, печать, безусловно, показывает значения, но если я закомментирую отображение, я получаю сообщение об ошибке, в котором говорится, что нельзя присвоить значение null (что верно, моя таблица не будет принимать значения null), но значение не должно быть равно нулю, так как оно там в стол?