Я использую VS 2008 (C #) и SQLite через провайдера ADO.NET 2.0 (проект SourceForce).
База данных, используемая приложением, содержит таблицы данных «работники» (родитель) и «история трудоустройства» (дети). Предполагается, что таблицы данных «eploymentHistory» содержат все рабочие контракты для любого данного сотрудника с первого дня (например, повышение в должности приведет к созданию нового контракта).
К сожалению, SQLite не поддерживает внешние ключи, поэтому мне нужно самому позаботиться о согласованности данных.
База данных EmploymentHistory содержит столбцы "id INTEGER ПЕРВИЧНЫЙ КЛЮЧ НЕ НУЛЬ, а employeeID INTEGER ..." столбцы
Очевидно, что employeeID будет ссылаться на Employess.ID, первичный ключ в таблице сотрудников. Он определяет, чей это контракт.
Я пишу способ добавления нового сотрудника. У каждого будет хотя бы один контракт (первый), поэтому добавление нового сотрудника связано с добавлением контракта.
Вот метод:
internal static void AddNewEmployee(Employee e, ContractChange c)
{
SQLiteCommandBuilder builder = new SQLiteCommandBuilder(adapter);
var insert = new SQLiteCommand(connection);
insert.CommandText = @"INSERT INTO employees VALUES ( null, @firstName, @lastName, @phone, @mobile, null, null, ";
insert.CommandText+= @"@birthDate, @sex, @address, @nin, null, null); ";
insert.Parameters.AddWithValue("firstName", e.info.name);
insert.Parameters.AddWithValue("lastName", e.info.surname);
insert.Parameters.AddWithValue("phone", e.info.phone);
insert.Parameters.AddWithValue("mobile", e.info.mobile);
insert.Parameters.AddWithValue("birthDate", e.info.DOB);
insert.Parameters.AddWithValue("sex", e.info.sex);
insert.Parameters.AddWithValue("address", e.info.address);
insert.Parameters.AddWithValue("nin", e.info.NIN);
insert.CommandText += @"INSERT INTO employmentHistory VALUES ( null, null, @startDate, 'true', @position, @contractHrs, ";
insert.CommandText += @"@holidayAllowance, @comments, null); ";
insert.Parameters.AddWithValue("startDate", c.date);
insert.Parameters.AddWithValue("position", (int)c.role);
insert.Parameters.AddWithValue("contractHrs", (int)c.contractHrs);
insert.Parameters.AddWithValue("holidayAllowance", c.holidayAllowance);
insert.Parameters.AddWithValue("comments", c.comments);
DataTable employees = dataset.Tables[0];
var datarowEmp = employees.NewRow();
datarowEmp = e.ToDataRow(datarowEmp);
employees.Rows.Add(datarowEmp);
DataTable employmentHistory = dataset.Tables[1];
var datarowContract = employmentHistory.NewRow();
datarowContract = c.ToDataRow(datarowContract);
employmentHistory.Rows.Add(datarowContract);
adapter.UpdateCommand = insert;
adapter.InsertCommand = insert;
adapter.SelectCommand = new SQLiteCommand("SELECT * FROM employees; SELECT * FROM employmentHistory;", connection);
adapter.Update(dataset);
}
Так что я подумал, что установлю идентификатор сотрудника "вручную" с быстрым обновлением. Но - как мне узнать, какой идентификатор был присвоен сотруднику, которого я только что добавил ???
Удивительно (для меня), даже после того, как SQLiteDataAdapter обновляет данные (я установил точку останова в самом конце метода), эта информация все еще отсутствует в наборе данных. Поле все еще нулевое. И все же SQLite действительно приписывает уникальный номер в какой-то момент, поскольку исключение не выдается, и сотрудники действительно получают первичные ключи (я видел базу данных в браузере баз данных SQLite).
Так что я не могу сделать это автоматически, и я не могу сделать это вручную - как я должен обеспечить согласованность базы данных? (