Обновление не работает в виде сетки (невозможно получить сообщение об ошибке)

Я пытаюсь обновить таблицу из gridview инструмента в базу данных SQL. Проблема в том, что он не обновляется в базе данных.

Ниже приведен мой код для нажатия кнопки, который обновляет базу данных: во время отладки кода я обнаружил, что таблица данных DT выбирает только исходные значения, а не обновленное значение в виде сетки....

Есть ли какое-либо свойство в виде сетки, которое принимает эти изменения и обновляет таблицу DT?

    public partial class BusinessRules : Form
    {
    //Declaration Part
    private SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=AnimalProductsCoSD;Integrated Security=True");

    private string sqlconn;  // query and sql connection

    private SqlDataAdapter SDA = new SqlDataAdapter();

    DataTable DT = new DataTable();
    SqlCommandBuilder scb = new SqlCommandBuilder();

   private void button_retreive_Click(object sender, EventArgs e)
    {

        string commandText = "CoSD.RetreiveBusinessRulesTool";
        SqlCommand cmd = new SqlCommand(commandText, con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@BusinessType", SqlDbType.NVarChar, 60).Value = comboBox_BusinessType.Text;
        cmd.Parameters.Add("@CommodityGroup", SqlDbType.VarChar, 60).Value = comboBox_group.Text;
        try
        {

            con.Open();
            SDA.SelectCommand = cmd;
            DT = new DataTable();
            SDA.Fill(DT);
            int count1 = DT.Rows.Count;
            if (DT.Rows.Count > 0)
            {
                dataGridView.DataSource = DT;
                dataGridView.Columns[0].DefaultCellStyle.ForeColor = Color.Gray;
                dataGridView.Columns[0].ReadOnly = true;           
            }
            else
            {
                MessageBox.Show("No Business Rules Found");


            }
        }
        catch (SqlException ex)
        {
            MessageBox.Show("Error : " + ex.Message);
        }
        finally
        {
            con.Close();
        }

    }

private void button_update_Click(object sender, EventArgs e)
    {
        try
        {
            if (MessageBox.Show("Do you really want to Update these values?", "Confirm Update", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                scb = new SqlCommandBuilder(SDA);
                SDA.Update(DT);
                // confirm
                MessageBox.Show("Updates successfully submitted to CoSD");

            }

            else
            {
                return;
            }

        }

        catch (Exception ex)
        {
            MessageBox.Show("Error : " + ex.Message);
        }


}   

1 ответ

Попробуй это

 scb = new SqlCommandBuilder(sda);
            sda.Update(dt);

В вашем инициализаторе вызов

  SqlDataAdapter sda= new SqlDataAdapter("SELECT * FROM someWhere", connectionString);
    DataTable dt = new DataTable();

Проблема в том, что вы обновляете сетку данных перед отправкой изменений, тем самым удаляя все введенные данные.

**** РЕДАКТИРОВАТЬ ****

Это именно то, что мой код в проекте, который я сделал немного назад, выглядит так:

namespace TowerSearch
{
    public partial class EditParts : Form
    {
        const string conString = ConString.conString;
        static DataClasses1DataContext PartsLog = new      DataClasses1DataContext(conString);
        static Table<Part> listOfParts = PartsLog.GetTable<Part>();

        SqlDataAdapter sda;
        SqlCommandBuilder scb;
        DataTable dt;

        public EditParts()
        {
            InitializeComponent();
        }

        //Load and refresh the dataGridView
        private void showData()
        {
            SqlConnection con = new SqlConnection(conString);
            sda = new SqlDataAdapter("SELECT * FROM Parts", con);

            dt = new DataTable();
            sda.Fill(dt);
            dataGridView1.DataSource = dt;
        }

        private void EditParts_Load(object sender, EventArgs e)
        {
           showData();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                dataGridView1.Refresh();
                scb = new SqlCommandBuilder(sda);
                sda.Update(dt);

                MessageBox.Show("Saved");
                showData();
            }
            catch (Exception ee)
            {
                MessageBox.Show("There is an error in the data!\nCheck if there are any blank spots besides Quantity.");
            }  
        }
    }
}

Это определенно работает, поэтому попробуйте код с данными шоу. Я бы посоветовал просто дословно скопировать его, чтобы посмотреть, сработает ли он.

**** РЕДАКТИРОВАТЬ 2 ****

Еще одна вещь, которую вы можете попробовать, если вам не удалось ее получить, - это добавить источник привязки. Для этого перетащите привязку SourceSource на свой dataGridView, а затем установите опцию DataSource для таблицы БД, которую вы не хотите отображать.

Надеюсь, это поможет!

Другие вопросы по тегам