Не работает сохранение в БД ADO

Не получается сохранить изменения сделанные в datagridview в базу данных.

public partial class Form1 : Form
{
    DataTable dbTable = new DataTable();
    SqlDataAdapter dbAdp = new SqlDataAdapter();
    SqlCommand dbCmd = new SqlCommand();
    SqlConnection sqlConn = new SqlConnection();
    SqlCommand cmd = new SqlCommand();
    public Form1()
    {
        InitializeComponent();                
    }

public void Form1_Load(object sender, EventArgs e)
{
    SqlConnection sqlConn = new SqlConnection("Data Source=wpl27.hosting.reg.ru; Initial Catalog=u1236799_BallOSP5; User ID=****;Password=****");
    sqlConn.Open();
    dbAdp.SelectCommand = dbCmd;
    dbAdp.Fill(dbTable);
    dataGridView1.DataSource = dbTable;
    dataGridView1.Columns[0].Visible = false;
    dataGridView1.Columns[7].Visible = false;
    dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;               
}

private void SaveupdateButton_Click(object sender, EventArgs e)
{
    sqlConn = new SqlConnection("Data Source=wpl27.hosting.reg.ru; Initial Catalog=u1236799_BallOSP5; User ID=*****;Password=*****");
    sqlConn.Open();
    dbAdp.UpdateCommand = new SqlCommand("UPDATE OSP5 SET Client = @Client ", sqlConn);
    // cmd.Parameters.Add("@Client", SqlDbType.NChar, 50, "Client");
    cmd.Parameters.AddWithValue("@Client", "Client");
    dbAdp.UpdateCommand = cmd;    
}

Ответы (5 шт):

Автор решения: Streletz

Думаю, Вам нужно для начала правильно сформировать SQL запрос и выполнить его.

Как-то так:

string connectionString = "Data Source=wpl27.hosting.reg.ru; Initial Catalog=u1236799_BallOSP5; User ID=*****;Password=*****";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();    
    dbAdp.UpdateCommand = new SqlCommand("UPDATE OSP5 SET Client = @Client ", connection);            
    dbAdp.UpdateCommand.Parameters.AddWithValue("@Client", "Client");
    dbAdp.UpdateCommand.ExecuteNonQuery();
}

Думаю уже после этого всё должно заработать.

→ Ссылка
Автор решения: Архипов Владимир

сначала создать команду, потом добавить её в UpdateCommand:

private void SaveupdateButton_Click(object sender, EventArgs e)
        {
            sqlConn = new SqlConnection("Data Source=wpl27.hosting.reg.ru; Initial Catalog=u1236799_BallOSP5; User ID=*****;Password=*****");
            sqlConn.Open();
            cmd = new SqlCommand("UPDATE OSP5 SET Client = @Client ", sqlConn);
            
            cmd.Parameters.AddWithValue("@Client", "Client");
            dbAdp.UpdateCommand = cmd;
            dbAdp.UpdateCommand.ExecuteNonQuery();
            sqlConn.Close();
        }

Но у Вас скорее всего ошибка в sql запросе, полный запрос должен быть скорее всего такой:

cmd = new SqlCommand("UPDATE OSP5 SET Client = @Client WHERE ClientID = @ClientID", sqlConn);

по событию изменения данных о клиенте, должны меняться существующие переменные для подставляемых значение например:

//string ChangedClientBody - сюда после изменения и перед обновлением бд должно записаться - Ваше - Client = @Client
//int IDChangedClient - а сюда Ваше ClientID = @ClientID;

далее эти переменные должны передаваться в параметры запроса:

cmd.Parameters.AddWithValue("@Client", ChangedClientBody);
cmd.Parameters.AddWithValue("@ClientID", IDChangedClient);
dbAdp.UpdateCommand = cmd;
dbAdp.UpdateCommand.ExecuteNonQuery();
sqlConn.Close();
→ Ссылка
Автор решения: Alexander Petrov

В вашем коде множество недостатков. Объяснять все не стану, т. к. это не формат нашего сайта.

Опишу лишь, как сделать вашу задачу кратчайшим способом. Как я понял, вы хотите обновить в БД те данные, которые пользователь изменил в датагриде, к которому привязан DataTable.

Вы используете SqlDataAdapter - вот его и возьмём за основу. При этом не нужны поля SqlCommand dbCmd, SqlConnection sqlConn, SqlCommand cmd - их просто удаляем.

Строку соединения с базой данных не стоит описывать в каждом методе. Ведь при малейшем её изменении придётся искать все эти места и исправлять. Вынесем её в поле.
Ещё лучше строку соединения читать из конфига. Но это оставим на потом.

При создании SqlDataAdapter нужно задать как минимум sql-запрос select. Это позволит получать данные из БД в DataTable.
А для обновления, удаления и вставки нужно, соответственно, задать sql-запросы update, delete, insert. Это можно сделать как вручную, так и сгенерировать автоматически с помощью класса SqlCommandBuilder. Он не сможет сгенерировать запросы, если селект был из нескольких таблиц с джойнами и т. п. Но в вашем случае, вероятно, справится.

Ну и всё. Далее просто используем адаптер.

public partial class Form1 : Form
{
    string connectionString = @"тут строка соединения";

    DataTable dbTable = new DataTable();
    SqlDataAdapter dbAdp;

    public Form1()
    {
        InitializeComponent();        
        
        dbAdp = new SqlDataAdapter("select * from OSPS", connectionString);

        // Здесь будут сгенерированы запросы update, insert, delete
        var builder = new SqlCommandBuilder(dbAdp);

        // Можно посмотреть, что там сгенерировалось
        // MessageBox.Show(builder.GetUpdateCommand().CommandText);
    }

    public void Form1_Load(object sender, EventArgs e)
    {
        dbAdp.Fill(dbTable);
        dataGridView1.DataSource = dbTable;
        dataGridView1.Columns[0].Visible = false;
        dataGridView1.Columns[7].Visible = false;
        dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
    }

    private void SaveUpdateButton_Click(object sender, EventArgs e)
    {
        dbAdp.Update(dbTable);
    }
}

Полезные ссылки:

Updating Data Sources with DataAdapters
Generating Commands with CommandBuilders

И ещё. Почему не стоит использовать метод AddWithValue:
Can we stop using AddWithValue() already?
AddWithValue is evil!
AddWithValue is Evil
Достаточно прочитать любую из этих статей.

→ Ссылка
Автор решения: Евгений Н
 private void SaveupdateButton_Click(object sender, EventArgs e)
        {
            var dbAdp = new SqlDataAdapter();
           SqlCommand cmd = new SqlCommand();
            int IDChangedClient=0;
            string ChangedClientBody="";
            string connectionString = "Data Source=wpl27.hosting.reg.ru; Initial Catalog=u1236799_BallOSP5; User ID=*****;Password=****";
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                cmd = new SqlCommand("UPDATE OSP5 SET Client = @Client WHERE OSP5ID = @OSP5ID", connection);
                cmd.Parameters.AddWithValue("@Client", ChangedClientBody);
                cmd.Parameters.AddWithValue("@OSP5ID", IDChangedClient);
                dbAdp.UpdateCommand = cmd;
                dbAdp.UpdateCommand.ExecuteNonQuery();
                connection.Close();
            }
        }

И так не сохраняет :(

→ Ссылка
Автор решения: Евгений Н
string query = "SELECT * FROM dbo.bimar";
      da = new SqlDataAdapter(query, connectionString);
      SqlCommandBuilder cBuilder = new SqlCommandBuilder(da);
      dt = new DataTable();
 
      da.Fill(dt);
 
      BindingSource bSource = new BindingSource();
      bSource.DataSource = dt;
 
      dataGridView1.DataSource = bSource;

когда вы изменяете свои данные в dataGridView1 , обновите их:

private void button1_Click(object sender, EventArgs e)
    {
        da.Update(dt);
    }

Это решение мне помогло. Может кому-то пригодится. Теперь изменения сделанные в DatagridView сохраняются

→ Ссылка