Обновить Базу данных из datagridview

354
19 апреля 2017, 10:18

Прошу прощения если повторяюсь, но что то не могу найти ответа.есть таблица datagridview заполняется так :

          //------Форма с DGV--------//
    dgv_CustomSizes.DataSource = dal.clientSizes(Convert.ToInt32(dgv_customers.Rows[e.RowIndex].Cells[0].Value));
           //---------класс работающий с БД---------//
    static string querySelect = "select * from [customers_Sizes] where ID_customers = @ID";
    private static DataSet recivedData;
    static public SqlDataAdapter adapterSize = new SqlDataAdapter(querySelect, connectionString);
    SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapterSize);
    public DataTable clientSizes(int ID)
    {
        DataTable table = new DataTable();
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            SqlCommand commSelect = new SqlCommand(querySelect, conn);
            commSelect.Parameters.AddWithValue(@"ID", ID);
            SqlDataAdapter adapterSize = new SqlDataAdapter(commSelect);
            conn.Open();
            recivedData = new DataSet();
            adapterSize.Fill(recivedData);
            adapterSize.Fill(table);
        }
        return table;
    }

потом пользователь может поменять какие то ячейки в таблице и теперь нужно сохранить эти изменения в БД. метод для сохранения

           public void setNewSizes()
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            adapterSize.UpdateCommand = cmdBuilder.GetUpdateCommand();
            conn.Open();
            adapterSize.Update(recivedData.Tables[0]);
        }
    }

при выполнении происходит ошибка - необходимо объявить скалярную переменную @ID.

Answer 1

Вопрос в принципе закрыт. Нужно было просто прописать update в адаптер. Я же хотел свалить эту обязанность на SqlCommandBuilder

 adapterSize.UpdateCommand = cmdBuilder.GetUpdateCommand();

неправильно истолковав msdn. Строку обновления для адаптера в ЛЮБОМ случае нужно писать.

Answer 2

Однажды решал такую задачу. В общем, был у меня DataGridView. В качестве DataSource я вешал ему DataTable, затем через adapter.Fill(...) запиливал в него данные из БД, а когда в DataGridView что-то менял, то это отображалось в моём DataTable, и после этого я просто по кнопке вызывал метод adapter.Update(...), и передавал в него свой DataTable. Successful.

private void MainForm_Load(object sender, EventArgs e)
    {
        try
        {
            referenceDgv.DataSource = Connector.receivedData.Tables[0];
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), ex.Source.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Stop);
        }
    }
private void updateBtn_Click(object sender, EventArgs e)
    {
        Connector.UpdateTable();
    }

Ну и класс Connector:

    public static DataSet receivedData;
    private static SqlConnection connection = new SqlConnection(connectionString);
    private static SqlDataAdapter adapter = new SqlDataAdapter(commandRead, connection);
    private static SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapter);
    public static void Read()
    {
        try
        {
            receivedData = new DataSet();
            adapter.Fill(receivedData);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), ex.Source.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            if (connection.State != ConnectionState.Closed)
            {
                CloseConnection();
            }
        }
    }
    public static void UpdateTable()
    {
        try
        {
            adapter.Update(receivedData.Tables[0]);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), ex.Source.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Stop);
        }
        finally
        {
            if (connection.State != ConnectionState.Closed)
            {
                CloseConnection();
            }
        }
    }
    public static void CloseConnection()
    {
        if (connection.State != ConnectionState.Closed)
        {
            connection.Close();
        }
    }

Если непонятно, то поразбирайся в этом проекте: https://github.com/guitarhero1488/TakeYourChain

READ ALSO
c# Unity Поднятие предмета [требует правки]

c# Unity Поднятие предмета [требует правки]

Привет! Возникло затруднение

225
Как передать regex в Asp.Net MVC

Как передать regex в Asp.Net MVC

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

208
Как получить индексы из коллекции List<T>

Как получить индексы из коллекции List<T>

Нужно получить индексы одного list<T> Знаю что есть метод IndexOf но он не работает(не выводит индексы) Для начала я создаю новый List<T> и переписываю...

266