2016-09-15 1 views
1

Я создаю систему баз данных в C# для библиотечной системы (используя базу данных Access), и я ударил кирпичную стену. У меня есть таблица под названием «BSUser», которая имеет столбец автоинкремента для первичного ключа «UserID»; Я хочу, чтобы это было автоматически сгенерировано, если пользователь не вводит значение при определении нового пользователя, но я также хочу, чтобы он мог принять значение, определенное вручную. Я использую следующий код для создания моей новой строки, учитывая информацию, введенную пользователем. Обратите внимание на проверку того, является ли нулевой идентификатор пользователя ...Как вручную установить идентификатор для столбца AUTOINCREMENT с помощью созданного конструктором DataTable?

BookshelfDataSet.BSUserRow user = dataSet.BSUser.NewBSUserRow(); 
if (userID != null) user.UserID = userID.Value; 
user.Forename = forename; 
user.Surname = surname; 
user.IsAdmin = isAdmin; 
dataSet.BSUser.AddBSUserRow(user); 
SaveDataSetToDatabase(); 

Вот код, который должен обновить базу данных ...

private void SaveDataSetToDatabase() 
{ 
    this.bookTableAdapter.Update(this.dataSet); 
    this.copyTableAdapter.Update(this.dataSet); 
    this.userTableAdapter.Update(this.dataSet); 
    this.loanTableAdapter.Update(this.dataSet); 
    this.ratingTableAdapter.Update(this.dataSet); 
} 

Строка успешно сохраняются в базе данных, но его идентификатор автоматически создается, несмотря на то, что я установил его вручную. Это проблема, так как у существующих пользователей библиотеки уже есть идентификаторы из старой системы, поэтому мне нужно перенести их в новую систему. Пожалуйста, может кто-нибудь сказать мне, что я делаю неправильно, и как решить проблему?

+0

Какая цель это послужит? – Plutonix

+0

Пользователи библиотеки имеют библиотечную карточку со штрих-кодом; Поэтому я должен иметь возможность набирать эти штрих-коды для существующих пользователей для их настройки в новой системе. Существуют также штрих-коды, прикрепленные к существующим книгам, чтобы однозначно идентифицировать их. Я хочу иметь соответствующие столбцы как автоинкремент, поэтому, когда новые пользователи или книги .etc. добавляются в базу данных (которые еще не имеют штрих-кода), система сможет генерировать идентификаторы и штрих-коды для новых объектов. –

+0

Создайте новый основной ключ в таблице, который является идентификатором GUID или строкой или автоинкремент. Создайте индекс в старом Pkey-поле, и у вас будет лучшее из обоих миров, абсолютный уникальный идентификатор для каждой строки и уникальный идентификатор для элемента. –

ответ

0

Вам нужно либо использовать значение автоматического увеличения, либо установить его самостоятельно. Нет возможности сделать то и другое.

+0

Это своего рода отстой; если я реализую код базы данных вручную (т.не используя DataSet), я могу иметь лучшее из обоих миров (столбец с автоматическим приращением с ключом, который можно указать вручную). Я думаю, это один из недостатков использования кода, который был создан дизайнером, а не кода, который был создан вручную! –

+1

(cc: @ Lee.J.Baxter) re: * «Нет возможности делать оба.» * - Не совсем верно, потому что (1) механизм Database Database позволяет вставлять произвольные значения в столбец AutoNumber, когда добавлена ​​новая строка и (2) вместо макроса AutoNumber можно использовать управляемый событиями макрос данных (подробнее см. [мой ответ] (http://stackoverflow.com/a/39534557/2144390)). –

+0

@GordThompson - Я не знал, что эта функция была в Access 2010. Спасибо за информацию! Ли Джей Бакстер, это похоже на путь. – STLDeveloper

2

Для тех, кто использует Access 2010 или новее, желаемый результат может быть достигнут с помощью макроса данных перед изменением. Для таблицы выборки по имени [BSUser]:

[Идентификатор_пользователя] – Long Integer, первичный ключ
[ExistingID] – Long Integer
[Имя, отчество] – Текст (100)
[Фамилия] – Текст (100)

и до изменения данных макро

BeforeChange.png

если мы включают в себя значение [ExistingID], то он будет использоваться в качестве первичного ключа [Идентификатор_пользователя] (при условии, что он уже не существует в таблице)

var ta = new Database1DataSetTableAdapters.BSUserTableAdapter(); 
ta.Insert(null, 3, "Gord", "Thompson"); // insert with ExistingID = 3 

приводит к

UserID ExistingID Forename Surname  
------ ---------- -------- ----------- 
    3   3 Gord  Thompson 

и если мы не «т включают [ExistingID] значение, то макрос будет присвоить один для нас

var ta = new Database1DataSetTableAdapters.BSUserTableAdapter(); 
ta.Insert(null, null, "Nora", "Newuser"); // insert with ExistingID = null 

как так

UserID ExistingID Forename Surname  
------ ---------- -------- ----------- 
    3   3 Gord  Thompson 
    1000    Nora  Newuser 
Смежные вопросы