Не сохраняются данные в БД SQLite (C#)
Проблема возникает при попытке добавления новой/редактирования существующей записи в базе данных. При подтверждении транзакции transaction.Commit() и последующим сохранением изменений db.SaveChanges() вылетает ошибка "An error occurred while starting a transaction on the provider connection. data base is locked". Сказали, что можно обойтись и без db.SaveChanges(), подтверждая транзакцию, ошибка не вылетает, но данные не сохраняются.
public partial class PageIngCreate : Page
{
private AppContext db;
public PageIngCreate(string id)
{
InitializeComponent();
db = new AppContext();
LoadMeasures();
if (id != "null")
{
LoadIngredient(Int32.Parse(id));
}
}
private void LoadMeasures()
{
using (var con = new SQLiteConnection("Data Source=DBConfectioryFabric.db; Version=3;"))
{
con.Open();
using (var cmd = new SQLiteCommand("Select * from Measures", con))
{
using (SQLiteDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
string measureName = reader.GetString(reader.GetOrdinal("MeasureName"));
CmbMeasure.Items.Add(measureName);
}
reader.Close();
}
}
}
}
private void LoadIngredient(int id)
{
using (var con = new SQLiteConnection("Data Source=DBConfectioryFabric.db; Version=3;"))
{
con.Open();
using (var cmd = new SQLiteCommand("Select Ingredients.ID, Ingredients.IngredientName, Measures.MeasureName" +
" From Ingredients" +
" Left Join Measures On Ingredients.Measure = Measures.ID" +
" Where Ingredients.ID = @id", con))
{
cmd.Parameters.AddWithValue("@id", id);
using (SQLiteDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
TxtID.Text = reader.GetInt32(reader.GetOrdinal("ID")).ToString();
TxtName.Text = reader.GetString(reader.GetOrdinal("IngredientName"));
CmbMeasure.Text = reader.GetString(reader.GetOrdinal("MeasureName"));
}
reader.Close();
}
}
}
}
private void BtnSave_Click(object sender, RoutedEventArgs e)
{
using (var con = new SQLiteConnection("Data Source=DBConfectioryFabric.db; Version=3;"))
{
con.Open();
using (var transaction = con.BeginTransaction())
{
try
{
int measureId = GetMeasureId(con, CmbMeasure.Text);
if (string.IsNullOrWhiteSpace(TxtID.Text))
{
Ingredient ingredient = new Ingredient(TxtName.Text, measureId);
db.Ingredients.Add(ingredient);
MessageBox.Show("Ингредиент успешно добавлен!");
}
else
{
Ingredient ingredient = db.Ingredients.Find(Int32.Parse(TxtID.Text));
if (ingredient != null)
{
ingredient.IngredientName = TxtName.Text;
ingredient.Measure = measureId;
MessageBox.Show("Ингредиент успешно изменен!");
}
}
//db.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
MessageBox.Show("Ошибка при сохранении данных: " + ex.Message);
}
}
}
}
private int GetMeasureId(SQLiteConnection con, string measureName)
{
using (var cmd = new SQLiteCommand("Select ID From Measures Where MeasureName = @SelectedName", con))
{
cmd.Parameters.AddWithValue("@SelectedName", measureName);
return Convert.ToInt32(cmd.ExecuteScalar());
}
}
}
Ответы (1 шт):
Автор решения: Сергей Кислицын
→ Ссылка
AlexanderSt помог найти решение. Достаточно было поменять SaveChanges и tranaction.Commit() местами..