Я хочу обновить свою базу данных sqlite из сетки данных. У меня есть 2 отметки в таблицах и ученики. мой код xaml
<DataGrid ItemsSource="{Binding}" Name="dtGrid" BeginningEdit="dtGrid_BeginningEdit" RowEditEnding="dtGrid_RowEditEnding" AutoGenerateColumns="True" AutoGeneratingColumn="dtGrid_AutoGeneratingColumn" />
в панели стека
Код С#
инициализирует форму
myConn.Open();
myDataAdapter = new SQLiteDataAdapter
{
SelectCommand = new SQLiteCommand()
{
Connection = myConn,
CommandText = "SELECT students.name, marks.One, marks.Two FROM marks INNER JOIN students on students.id == marks.id where marks.classId = 1" }
};
myDataSet = new DataSet();
myDataAdapter.Fill(myDataSet, "marks");
dtGrid.DataContext = myDataSet.Tables["marks"].DefaultView;
до этой части
private void dtGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
myBuilder = new SQLiteCommandBuilder(myDataAdapter);
DataRowView myDRV = (DataRowView)dtGrid.SelectedItem;
myDRV.BeginEdit();
}
private void dtGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
DataRowView myDRV = (DataRowView)dtGrid.SelectedItem;
myDRV.EndEdit();
myDataAdapter.UpdateCommand = (Finisar.SQLite.SQLiteCommand)myBuilder.GetUpdateCommand();
myDataAdapter.Update(myDataSet, "marks");
}
private void dtGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var tc = e.Column as System.Windows.Controls.DataGridTextColumn;
var b = tc.Binding as System.Windows.Data.Binding;
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
b.ValidatesOnDataErrors = true;
b.NotifyOnValidationError = true;
}
при обновлении из сетки данных возникает ошибка повторной настройки "SQLiteCommandBuilder не может работать с запросами без уникальных или ключевых столбцов", хотя у меня есть первичный ключ
Какая строка кода? Также я вижу, что
myDataAdapter
используется несколько раз, и выглядит как оставленный открытым. Это экземпляр адаптера данных, который вы всегда держите открытым? Вы действительно должны избегать этого. Оберните каждый экземпляр в блокusing
и создавайте новые по мере необходимости. Это поможет отладке, а также использованию базы данных.Это не так, как это должно было работать; вы не загружаете данные в таблицу данных с помощью JOIN, если хотите отредактировать ее и вернуть в базу данных. Конечно, его можно заставить работать (как и все остальное), но вам придется гораздо больше участвовать в определении запроса на обновление и настройке адаптера, который будет его использовать, чтобы он знал, какие исходные столбцы выбрать для отправки. таблицу оценок, игнорируя данные учащихся. Я бы написал полный ответ, который советует вам создать файл DataSet и добавить к нему адаптеры таблиц, но я точно не знаю, поддерживается ли он для SQLite.