[C#] Aktualizacja rekordów bazy danych


(Ace Ventura) #1

Hej,

 

Mam problem z małym programem napisanym w C#. Chciałbym móc z niego update'ować rekordy znajdujące się w bazie danych (Baza danych jest na MS SQL serwerze). O ile wczytywanie rekordów działa poprawnia to już samo aktualizowanie nie za bardzo. Po wprowadzeniu zmian w DataGridView i naciśnieciu przycisku który ma służyć za update rekordów pojawia mi się ten błąd w tej linii kodu: sda.Update(dt);

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.dll

Additional information: Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.

Oto mój kod:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Formatka1
{
    public partial class Form1 : Form
    {
        SqlDataAdapter sda;
        SqlCommandBuilder scb;
        DataTable dt;

        public Form1()
        {
            InitializeComponent();
        }

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

        private void button2_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(@"Data Source=HDCPO00137\SQLEXPRESS;Initial Catalog=Assets;Integrated Security=True;");
            sda = new SqlDataAdapter("SELECT * FROM Sheet1",con);
            dt = new DataTable();
            sda.Fill(dt);
            dataGridView1.DataSource = dt;
        }
    }
}

Walczę z tym już kilka godzin i nie mogę sobie poradzić więc prosze o pomoc :frowning:


(klonek_wp) #2

to tak prosto nie działa… zobacz co po kolei zrobiłeś - utworzyłeś połączenie, otworzyłeś nowy “adapter” z SELECT’em, utworzyłeś w pamięci tabelę i wypełniłeś ją danymi z “adaptera”, a następnie zawartość tej tabeli przepisałeś do datagridview. skąd twój program ma czerpać wiedzę jakie kolumny datagridview są powiązane z odpowiednimi kolumnami w “fizycznej” bazie??? skąd to ma wiedzieć w jaki sposób update’tować twoją bazę???

 

zacznij od zdefiniowania w projekcie BindingSource i odpowiednich kolumn w datagridview a następnie przypisz ten bindingsource do datagridview.datasource