2013-08-26 35 views
-1

我有這個存儲過程:如何將插入的記錄的ID返回到C#

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

這工作正常,返回SSMS中的ID。但是,當我從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; 

我沒有看到我做錯了什麼。我只需要插入記錄的Id。

格雷格

+4

使用'ExecuteScalar' - 'ExecuteNonQuery'將返回受影響的行。 –

回答

5

檢查ExecuteNonQuery()文檔:

執行一個Transact-SQL語句對連接和返回受影響的行數。

(重點煤礦)

如果你想獲得信息反饋,你有幾個選擇:

  1. 變化RETURNSELECTExecuteNonQuery()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; 

}

相關問題