也许其他人查看此代码将能够告诉我为什么返回ID总是0。我正在尝试从插入的记录中检索新 ID。
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;
}
记录被很好地插入到表中,但返回值不正确。我这样做是否正确?
谢谢
没有
设置ID的位置,因此您可以预期值会更改。你必须这样做
Select @ID = @Scope_Identity() -- If ID column is an Identity column
或
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()";
在 SQL 查询中再添加一行:
选择 @ID = scope_identity()
根据我的经验,方向返回值不起作用。这是有意义的,因为在像 your 这样的命令中,@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()";