2014-12-15 1 views
2

У меня есть две таблицы в соответствии с приведенной ниже диаграммой, а также некоторые примеры данных в таблице.Чтение последнего вставленного UID из базы данных с помощью команды SQL

enter image description here

То, что я пытаюсь добиться в моем проекте заключается в следующем. У меня есть 4 окна в моем проекте. Первая форма с двумя кнопками

enter image description here

New User имеет событие щелчка зача-

private void button1_Click(object sender, EventArgs e) 
{ 
    NewUser nu = new NewUser(); 
    nu.Show(); 

} 

Upon мыши, она воспитывает NEWUSER образуют enter image description here

План добавить данные здесь Users Table, затем нажмите Save and Proceed (прямо сейчас я использую кнопку Save по умолчанию на панели NAV), которая примет UID от Users Table и добавьте его под столбцом UID (который является внешним ключом в Address Table) и открытой формой FormAddress, где я могу ввести данные для таблицы. enter image description here

Нажмите событие для Save and Proceed is--

private void button1_Click(object sender, EventArgs e) 
{ 
    FormAddress ad = new FormAddress(); 
    ad.Show(); 
    getdata(); 
} 

Upon исследования я узнал, что мне нужно использовать SCOPE_IDENTITY, чтобы получить значение UID от последнего ввода данных и нести его к следующей форме. Таким образом, я создал метод getdata() следующим образом и добавить его под кнопкой события Save and Proceed

Код я попытался это

private void getdata() 
{ 

    SqlConnection sqlConnection1 = new SqlConnection(@"mycon string is here;" + "Initial Catalog=Stack;Integrated Security=YES"); 
    SqlCommand cmd = new SqlCommand(); 
    SqlDataReader reader; 

    cmd.CommandText = "SELECT * FROM Users"; 
    cmd.CommandType = CommandType.Text; 
    cmd.Connection = sqlConnection1; 

    sqlConnection1.Open(); 

    reader = cmd.ExecuteReader(); 
    // Data is accessible through the DataReader object here. 

    cmd.CommandText = "SCOPE_IDENTITY();"; 

    sqlConnection1.Close(); 
} 

Я просто не могу получить мою голову на работу и выяснить, как получить SCOPE_IDENTITY и заставить его работать. Пожалуйста, спросите меня, прежде чем я приступлю к голосованию. Я отвечу и отвечу/внесем необходимые изменения. И я заархивировал проект и файл сервера SQL HERE, если кто-то хочет загрузить их для запуска и тестирования. Я использовал SQL Server 2014 и Visual Studio 2013.

+1

'SCOPE_IDENTITY()' возвращает последний идентификатор, созданный в рамках правильной партии, другими словами, идентификатор записи, который был только что вставили. Вы не вставляете запись, поэтому она неприменима. Что вы на самом деле хотите? Самый высокий текущий 'UID'? 'SELECT MAX (UID) FROM Users' –

+0

@BenRobinson Во второй форме' NewUser' Я вставляю новую строку. Я хочу, чтобы UID переносился автоматически в следующую форму «Адрес», где я могу продолжать заполнять данные под тем же UID, что и «Таблица пользователей» – envyM6

ответ

3

Если вы не только сделали INSERT по этому соединению, SCOPE_IDENTITY() не определено. Вы не можете отображать новое значение IDENTITYзаранее, потому что большинство баз данных являются многопользовательскими - поэтому это значение не может быть известно, пока вы на самом деле не сделаете INSERT. Было бы неверно отображать «вероятно, будет это» значение - пользователь может записать его или использовать его в общении с кем-то, например. Вы можете только показать это значение после он есть в базе данных.

Но: когда вы INSERT, вы можете сразу просто запросить SCOPE_IDENTITY() посмотреть, что значение. Совсем недавно, you can use the OUTPUT clause of an INSERT operation - проще, только один набор операций SQL, и он работает с несколькими строками: все выигрыши.

+0

Я вставляю новую строку во вторую форму и сохраняю ее с помощью кнопки «Сохранить» на панели навигации – envyM6

+0

@ envyM6 затем ... просто 'SELECT SCOPE_IDENTITY()' после 'INSERT'. –

+0

Mark Я вставляю данные, используя вид сетки. не программно. – envyM6

1

Получить удостоверение личности с этой линии:

cmd.CommandText = "SELECT SCOPE_IDENTITY()";

+0

Как сохранить его в переменной? – envyM6

+0

@ envyM6 'int id = Convert.ToInt32 (cmd.ExecuteScalar());', но опять же: это не поможет, если вы не являетесь: в том же соединении (вы не являетесь) и b: t сделал что-нибудь еще в этом соединении –

+0

Проблема с другим соединением может быть решена легко. Просто используйте одно соединение для всего сеанса (после входа в систему), а не для открытия/закрытия его для каждого запроса - используйте одно и то же соединение для запроса Identity. Я надеюсь, что окна редактора тоже могут работать. Я думаю, что это лучший метод для настольных приложений, а не для закрытия соединения для каждого запроса. Посмотрите, что MS SQL Studio работает одинаково. Даже с помощью «sp_who» вы можете увидеть свое приложение в списке. – i486

Смежные вопросы