Witajcie,
piszę właśnie moduł bazodanowy do mojej aplikacji i mam problem z aktualizacją danych. Korzystam z SqlClient'a. Pobieram dane za pomocą SqlDataAdapter'a poprzez odpowiednie ustawienie SqlConnection. Dane ładowane są do DataTable, a następnie do DataGridView.
Przy pomocy buttona aktualizuję dane w bazie danych za pomocą SqlDataAdapter/SqlCommandBuilder.
Program pobiera dane do DataTable bez problemu, wszystko ładuje się do DataGridView. Jednakże jakakolwiek próba aktualizacji danych w bazie danych kończy się fiaskiem. Dane nie są aktualizowane w bazie danych, lecz w DataTable (RowState zmienia się z Modified/Deleted/Added na Unchanged).
//EDIT
ConnectionState w momencie zapisu - Open.
Builder tworzy dobre zapytania. DataTable zwraca odpowiednie rekordy podczas wywołania GetChanges.
Po wyjściu z formatki z DataGridView i wejściu w nią ponownie program wyświetli zaktualizowane dane (uzupełni m.in. primary key). Natomiast jeśli wyłączę program i włączę ponownie, w DataGridzie ujrzę "pierwotny" stan bazy danych.
Poniżej zamieszczam napisane przeze mnie procedury do odczytu/zapisu danych z/do bazy danych:
//Metoda odczytująca dane z bazy danych
public class TADOReader
{
public DataTable Read(TADOConnection _connection)
{
DataTable dt = new DataTable();
SqlDataAdapter adapter = new SqlDataAdapter(new SqlCommand("SELECT * FROM GroundWireDatabase", _connection.connection));
adapter.Fill(dt);
//Kolumna z kluczem głównym jako tylko do odczytu
dt.Columns[0].ReadOnly = true;
return dt;
}
}
//Metoda zapisująca dane w bazie danych
public class TADOWriter
{
public void Write(TADOConnection _connection, DataTable _table)
{
try
{
SqlDataAdapter adapter = new SqlDataAdapter(new SqlCommand("SELECT * FROM GroundWireDatabase", _connection.connection));
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
adapter.DeleteCommand = builder.GetDeleteCommand(true);
adapter.UpdateCommand = builder.GetUpdateCommand(true);
adapter.InsertCommand = builder.GetInsertCommand(true);
int result = adapter.Update(_table); // Zwraca liczbę <> 0
// _table.AcceptChanges();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
//Fragment klasy łączeniowej
public class TADOConnection
{
private const string DATASOURCE = @"(LocalDB)\v11.0";
private const string INTEGRATED_SECURITY = "True";
private const string ATTACH_DB_FILENAME = @"|DataDirectory|\IO\Database\GroundWireDatabase.mdf";
private const string ConnectionString = "Data Source=" + DATASOURCE +
";AttachDbFilename= " + ATTACH_DB_FILENAME +
";Integrated Security=" + INTEGRATED_SECURITY;
public TADOConnection()
{
Fconnection = new SqlConnection(ConnectionString);
Connect();
}
}
//wywołania w formatce
private void GroundWireDatabaseForm_Load(object sender, EventArgs e)
{
TADOReader reader = new TADOReader();
dgGroundwire.DataSource = reader.Read(new TADOConnection());
}
private void btnAktualizuj_Click(object sender, EventArgs e)
{
TADOWriter writer = new TADOWriter();
writer.Write(new TADOConnection(), dgGroundwire.DataSource as DataTable);
}
Schema bazy danych
CREATE TABLE [dbo].[GroundWireDatabase] (
[CableID] INT IDENTITY (1, 1) NOT NULL,
[Producer] TEXT NULL,
[CrossSection] FLOAT (53) NULL,
[Radius] FLOAT (53) NULL,
[Resistance] FLOAT (53) NULL,
[MagneticConductivity] FLOAT (53) NULL,
PRIMARY KEY CLUSTERED ([CableID] ASC)
);
Z góry dziękuję za pomoc!
Pozdrawiam