2013-11-16 9 views
0

Ниже приведен фрагмент кода с двумя частями. Почти идентичны друг другу. Они оба вставляют что-то в таблицу, а затем вызывают Scope_identity. Я проверил, чтобы был вставлен AddressType, и это дает мне CityId все в порядке. Я не вижу разницы. Я просмотрел код и не могу найти свою ошибку. Я надеюсь, что кто-то может быть дополнительным набором глаз и указать, что, я уверен, должно быть очевидной ошибкой.Scope_Identity() возвращает пустую строку

SqlCommand addressTypeCommand = new SqlCommand(
     "INSERT INTO AddressType VALUES ('" + customerRow.AddressType + "');", 
        newCustConnection); 
try 
{ 
    addressTypeCommand.ExecuteNonQuery(); 
} 
catch (SqlException addressTypeException) 
{ 
    if (addressTypeException.ToString().StartsWith(
      "Violation of UNIQUE KEY constraint")) 
    { 
     Console.WriteLine("Unique Key exception on 'AddressType'."); 
    } 
} 

SqlCommand selectAddressTypeID = new SqlCommand(
     "select SCOPE_IDENTITY();", newCustConnection); 
string addressTypeID = selectAddressTypeID.ExecuteScalar().ToString(); 

SqlCommand cityCommand = new SqlCommand(
     "INSERT INTO City VALUES ('" + customerRow.City + "');", 
     newCustConnection); 
try 
{ 
    cityCommand.ExecuteNonQuery(); 
} 
catch (SqlException cityException) 
{ 
    if (cityException.ToString().StartsWith(
      "Violation of UNIQUE KEY constraint")) 
    { 
     Console.WriteLine("Unique Key exception on 'City'."); 
    } 
} 
SqlCommand selectCityID = new SqlCommand(
     "select SCOPE_IDENTITY();", newCustConnection); 
string cityID = selectCityID.ExecuteScalar().ToString(); 
+0

Каковы определения таблиц? У них обоих есть столбцы «IDENTITY»? Также вы должны использовать параметризованные запросы. И лучше всего иметь '; SELECT SCOPE_IDENTITY()' сразу после инструкции 'INSERT'. –

+3

Вместо 'if (addressTypeException.ToString(). StartsWith (« Нарушение ограничения UNIQUE KEY »))' вы должны проверить ['Number'] (http://msdn.microsoft.com/en-us/library/ свойство system.data.sqlclient.sqlexception.number (v = vs.110) .aspx), исключение ограничения имеет значение «2627». В противном случае ваш код зависит от локализованного сообщения об ошибке. –

+0

Для работы 'scope_identity()' он должен быть в той же области, что и вставка. Из книг в Интернете область видимости - это «модуль: хранимая процедура, триггер, функция или партия». Я не уверен, что вы попали в любой из них. – Laurence

ответ

3

Для использования scope_identity() вы должны быть в том же объеме, как и вставки. Самый простой способ добиться этого - передать его как часть той же партии.

например.

SqlCommand addressTypeCommand = new SqlCommand(
    "insert into AddressType values (@addressType); select scope_identity()" 
); 

addressTypeCommand.Parameters.AddWithValue(
    // replace with correct datatype, possibly set data length 
    "@addressType", SqlDbType.VarChar, customerRow.AddressType 
); 
addressTypeID = addressTypeCommand.ExecuteScalar().ToString(); 
Смежные вопросы