2012-10-14 61 views
3

也许有人在看这个代码将能够告诉我为什么returnID总是0.我试图从插入的记录中检索新的ID。SqlCommand返回值参数

public int AddToInventory(int PartID, int QtyOnHand, int SpokenFor, int LowOrderQty, int HighOrderQty, decimal LastBuyPrice, 
            decimal AvgBuyPrice) 

     { 
     ConfigDAL config = new ConfigDAL(); 
     string connstr = config.GetConnString(); 
     SqlConnection conn = new SqlConnection(connstr); 

     string query; 
     query = "INSERT INTO Inventory (PartID, QtyOnHand, SpokenFor, LowOrderQty, HighOrderQty, LastBuyPrice, " 
        + "AvgBuyPrice, CreatedOn, CreatedBy, ModifiedOn, ModifiedBy) " 
        + "Values (@PartID, @QtyOnHand, @SpokenFor, @LowOrderQty, @HighOrderQty, @LastBuyPrice, @AvgBuyPrice, " 
        + "@CreatedOn, @CreatedBy, @ModifiedOn, @ModifiedBy)"; 

     SqlCommand cmd = new SqlCommand(query, conn); 
     cmd.CommandType = System.Data.CommandType.Text; 
     cmd.Parameters.AddWithValue("@PartID", PartID); 
     cmd.Parameters.AddWithValue("@QtyOnHand", QtyOnHand); 
     cmd.Parameters.AddWithValue("@SpokenFor", SpokenFor); 
     cmd.Parameters.AddWithValue("@LowOrderQty", LowOrderQty); 
     cmd.Parameters.AddWithValue("@HighOrderQty", HighOrderQty); 
     cmd.Parameters.AddWithValue("@LastBuyPrice", LastBuyPrice); 
     cmd.Parameters.AddWithValue("@AvgBuyPrice", AvgBuyPrice); 
     cmd.Parameters.AddWithValue("@CreatedOn", DateTime.Now); 
     cmd.Parameters.AddWithValue("@CreatedBy", GlobalProp.UserName); 
     cmd.Parameters.AddWithValue("@ModifiedOn", DateTime.Now); 
     cmd.Parameters.AddWithValue("@ModifiedBy", GlobalProp.UserName); 
     cmd.Parameters.Add("@ID", SqlDbType.Int).Direction = ParameterDirection.ReturnValue; 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     conn.Close(); 
     int returnID = (int)cmd.Parameters["@ID"].Value; 

     return returnID; 
     } 

记录插入到表格中,但返回值不正确。我是否正确地做这件事?

感谢

回答

2

没有你在哪里设置的ID,这样你就可以期望价值改变。你必须做到这一点与

Select @ID = @Scope_Identity() -- If ID column is an Identity column 

OR

Select @ID = @SomeGeneratedValue 

试试这个

query = "INSERT INTO Inventory (PartID, QtyOnHand, SpokenFor, LowOrderQty, HighOrderQty, LastBuyPrice, " 
       + "AvgBuyPrice, CreatedOn, CreatedBy, ModifiedOn, ModifiedBy) " 
       + "Values (@PartID, @QtyOnHand, @SpokenFor, @LowOrderQty, @HighOrderQty, @LastBuyPrice, @AvgBuyPrice, " 
       + "@CreatedOn, @CreatedBy, @ModifiedOn, @ModifiedBy);" 
       + " Declare @ID int;" 
       + " Select @ID = Scope_Identity()"; 
+0

你的方法告诉我,行cmd.ExecuteNonQuery()运行,我必须声明标量变量“@ID” – Ryan

+0

我已更新我的答案'Declare @ID int;' – codingbiz

2

在SQL查询中增加一个行:

选择@ID = SCOPE_IDENTITY()

+0

...到底... :-) – Gorgsenegger

1

以我的经验方向返回值不工作。它有道理,因为在像你这样的命令中,@ID是一个脚本变量,所以更多的是输出参数而不是返回值。

对我来说,最好使用ParameterDirection.Output没有申报@ID(它被声明与。输出选项):

cmd.Parameters.Add("@ID", SqlDbType.Int).Direction = ParameterDirection.Output; 
query = "INSERT INTO Inventory (PartID, QtyOnHand, SpokenFor, LowOrderQty, HighOrderQty, LastBuyPrice, " 
      + "AvgBuyPrice, CreatedOn, CreatedBy, ModifiedOn, ModifiedBy) " 
      + "Values (@PartID, @QtyOnHand, @SpokenFor, @LowOrderQty, @HighOrderQty, @LastBuyPrice, @AvgBuyPrice, " 
      + "@CreatedOn, @CreatedBy, @ModifiedOn, @ModifiedBy);" 
      + " Set @ID = Scope_Identity()";