2015-05-01 3 views
-1

У меня есть приложение C#, использующее базу данных SQL Server. После вставки строки мне понадобится ID строки, которая была создана. Я попробовал select max(id) from mytable, но результат от этого неверен, если другой пользователь вставил строку за это время.Как получить идентификатор строки, которая вставляется (новая)

Это мой код:

public string ConnectionString = @"Data Source=.;Initial Catalog=n_hesabdata;Integrated Security=True"; 

public void ExecuteNonQuery(string CommandText) 
{  
    try {  
     connection.ConnectionString = ConnectionString; 
     connection.Open(); 
     command.CommandText = CommandText; 
     command.Connection = connection; 
     command.ExecuteNonQuery();   
     command.Dispose(); 
     connection.Close();  
    } catch (Exception error) { 
     connection.Close(); 
    } 
} 

ExecuteNonQuery("insert into Orders (Ctm_phone, Ctm_FullName) VALUES (" + Ctm_phone.text + ", N'" + Ctm_name.Text + "')"); 

Как получить ID из свеже вставленной строки?

+2

Стоит отметить, что вы открыты для SQL-инъекций. вставляя необработанные данные, подобные этому – Jonesopolis

+0

Это связано с PHP/MySQL каким-либо образом? – Maximus2012

+1

Это C#, а не php – user4035

ответ

1

Вы должны изменить свой код, чтобы что-то вроде этого

ConnectionString = @"Data Source=.;Initial Catalog=n_hesabdata;Integrated Security=True"; 
public int ExecuteInsertWithIdentity(string CommandText, List<SqlParameter> prms) 
{  
    using(SqlConnection connection = new SqlConnection(ConnectionString)) 
    using(SqlCommand cmd = new SqlCommand(CommandText + 
           ";SELECT SCOPE_IDENTITY();", connection)) 
    { 
     connection.Open(); 
     if(prms != null && prms.Count > 0) 
      cmd.Parameters.AddRange(prms.ToArray()); 
     int lastID = Convert.ToInt32(cmd.ExecuteScalar());   
     return lastID; 
    } 
} 
.... 

List<SqlParameter> prms = new List<SqlParameter>(); 
SqlParameter p1 = new SqlParameter() {ParameterName = "@phone", 
             SqlDbType = SqlDbType.NVarChar, 
             Value = Ctm_phone.text}; 
SqlParameter p2 = new SqlParameter() {ParameterName = "@Name", 
             SqlDbType = SqlDbType.NVarChar, 
             Value = Ctm_name.Text}; 
prms.AddRange(new SqlParameter[] {p1, p2}); 
int lastOrderID = ExecuteInsertWithIdentity(@"insert into Orders 
              (Ctm_phone,Ctm_FullName) 
              VALUES (@phone, @name)", prms); 

в этом случае код, который выполняет запрос требует сбора параметров значений. Это исключает возможность инъекции Sql. Теперь проблема возврата последнего идентификатора, вставленного механизмом базы данных в вашу таблицу Orders, просто разрешила добавление SELECT SCOPE_IDENTITY() к вашей команде. Класс SqlCommand SqlClient способен выполнять несколько операторов за одну поездку в базу данных и возвращает последний оператор. В этом случае это значение столбца IDENTITY строки, добавленной в вашу таблицу Orders, из вашего соединения (а не из других соединений)

+0

благодарит за вашу помощь. Я тестирую его ... –

+0

он дает ошибку в: prms.Add ("@ phone", SqlDbType.NVarChar) .Value = Ctm_phone.text; prms.Add ("@ name", SqlDbType.NVarChar) .Value = Ctm_name.Text; ****Зачем? –

+0

Да, извините, пытаясь исправить это. – Steve

0
  • Обычно вы должны вставлять новые записи с помощью entitymanager. Когда атрибут id он аннотируется как @Id, он должен получить следующее бесплатное значение при вызове объекта MERGEing в таблицу, если раньше значение было NULL.
  • Но если вы действительно хотите INSERT явно использовать SQL, тогда вы должны разделить INSERT на 1.) получение нового идентификатора из последовательности 2.) запись данных в таблицу (с последовательностью nimber с шага 1.)
Смежные вопросы