Список <T>в базу данных и обратно - PullRequest
0 голосов
/ 02 апреля 2012

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

    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), но значение не должно быть равно нулю, так как оно там в стол?

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Кажется, вы забыли индекс.

for (int i = 0; i < myList.Count; i++)
    {
        da.saveToDb(myList[i].val1, myList[i].val2);
    }
0 голосов
/ 02 апреля 2012

Я думаю, вам не хватает объекта подключения. var cn = new SqlConnection (). Затем вы вызываете open на объекте подключения.

connection.command предоставит доступ к объекту команды.

...