2013-08-26 6 views
-1

У меня есть эта хранимая процедура:Как вернуть идентификатор вставленной записи в C#

Insert into dbo.file_row (file_sub_type) values (@file_sub_type) 
DECLARE @result int; 
SET @result = SCOPE_IDENTITY() 
RETURN @result; 

Это прекрасно работает, чтобы вернуть идентификатор в SSMS. Однако, когда я вызываю его из C#, он возвращает -1.

var connection = GetSqlConnection(); 
connection.Open(); 

SqlCommand command = new SqlCommand(); 
command.Connection = connection; 
command.CommandType = CommandType.StoredProcedure; 
command.CommandText = "InsertInto_file_row"; 
command.Parameters.Add(new SqlParameter("@file_sub_type", fileType)); 

int result = command.ExecuteNonQuery(); 
connection.Close(); 
return result; 

Я не вижу, что я делаю неправильно. Мне просто нужен идентификатор вставленной записи.

Грег

+4

использования 'ExecuteScalar' -' ExecuteNonQuery' будет возвращать строки пострадавших. –

ответ

5

Проверьте документы на ExecuteNonQuery():

Выполняет Transact-SQL заявление против соединения и возвращает количество затронутых строк.

(выделено мной)

Если вы хотите получить информацию обратно, у вас есть пара вариантов:

  1. Изменение RETURN к SELECT и ExecuteNonQuery() к ExecuteScalar()
  2. использовать OUTPUT parameter
+0

Получил это. Теперь работает. –

0

Чтобы добавить к ответу Joel Попробуйте ExecuteScalar вместо

Выполняет запрос и возвращает первый столбец первой строки в результирующем наборе, возвращаемом запросом. Дополнительные столбцы или строки игнорируются. (Переопределяет DbCommand.ExecuteScalar().)

0

Это поможет вам. Функция возвращает новое значение столбца Identity, если новая строка была вставлена, 0 при ошибке. Именно из MSDN

static public int AddProductCategory(string newName, string connString) 
{ 
    Int32 newProdID = 0; 
    string sql = 
    "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); " 
    + "SELECT CAST(scope_identity() AS int)"; 
    using (SqlConnection conn = new SqlConnection(connString)) 
    { 
    SqlCommand cmd = new SqlCommand(sql, conn); 
    cmd.Parameters.Add("@Name", SqlDbType.VarChar); 
    cmd.Parameters["@name"].Value = newName; 
    try 
    { 
     conn.Open(); 
     newProdID = (Int32)cmd.ExecuteScalar(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 
return (int)newProdID; 

}

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