【发布时间】:2019-01-28 15:06:15
【问题描述】:
以最后一种可能性(subtract_QtyFromStock_Ex
我检查了参数的数量 我不使用全局 sqlcommand 我单独测试了这个功能,效果很好
有问题的存储过程
ALTER proc [dbo].[DeleteFromtb_QtyEx]
@autoCodeIdentifier int
As
Delete from tb_Quantity_Expire
where tb_Quantity_Expire.item_auto_code=@autoCodeIdentifier
DataAccessLayer 处的代码
public void ExecuteCommand(string stored_procedure, SqlParameter[] param)
{
SqlCommand cmd = new SqlCommand(stored_procedure, con);
cmd.CommandType = CommandType.StoredProcedure;
if(param != null)
{
cmd.Parameters.AddRange(param);
}
cmd.ExecuteNonQuery();
}
课堂上的代码
public void DeleteFromtb_QtyEx(int autoCodeIdentifier)
{
Cls_DataAccessLayer DAL = new Cls_DataAccessLayer();
DAL.OpenCon();
SqlParameter[] param = new SqlParameter[1];
param[0] = new SqlParameter("@autoCodeIdentifier", SqlDbType.Int);
param[0].Value = autoCodeIdentifier;
DAL.ExecuteCommand("DeleteFromtb_QtyEx", param);
DAL.CloseCon();
}
btn_click 上的代码
private void btnTender_Click(object sender, EventArgs e)
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
decimal qty_entered =
Convert.ToDecimal(dataGridView1.Rows[i].Cells[3].Value);
decimal stk =
Convert.ToDecimal(dataGridView1.Rows[i].Cells[5].Value);
decimal subtract = stk - qty_entered;
if (subtract < 0)
{
Cls.DeleteFromtb_QtyEx(Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value));
Cls.InsertTotb_QtyEx(Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value), subtract);
}else if(subtract==0)
{
Cls.DeleteFromtb_QtyEx(Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value));
Cls.InsertTotb_QtyEx(Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value), subtract);
}else if (subtract > 0)
{
DataTable dt_QtyEx = new DataTable();
dt_QtyEx = Cls.SelectFromtb_QtyEx(Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value));
decimal subtract_QtyFromStock_Ex = 0;
//decimal qty = Convert.ToDecimal(dataGridView1.Rows[i].Cells[3].Value);
for (int x = 0; x < dt_QtyEx.Rows.Count; x++)
{
if (x == 0)
{
subtract_QtyFromStock_Ex = Convert.ToDecimal(dt_QtyEx.Rows[x][2]) - qty_entered;
}
else
{
subtract_QtyFromStock_Ex = Convert.ToDecimal(dt_QtyEx.Rows[x][2]) - (0 - subtract_QtyFromStock_Ex);
}
if (subtract_QtyFromStock_Ex > 0)
{
Cls.Updatetb_QtyEx(Convert.ToInt32(dt_QtyEx.Rows[x][0]), Convert.ToDateTime(dt_QtyEx.Rows[x][1]), subtract_QtyFromStock_Ex);
break;
}
else if (subtract_QtyFromStock_Ex == 0)
{
Cls.DeleteFromtb_QtyEx_Expire(Convert.ToInt32(dt_QtyEx.Rows[x][0]), Convert.ToDateTime(dt_QtyEx.Rows[x][1]));
break;
}
else if (subtract_QtyFromStock_Ex < 0)
{
Cls.DeleteFromtb_QtyEx_Expire(Convert.ToInt32(dt_QtyEx.Rows[x][0]), Convert.ToDateTime(dt_QtyEx.Rows[x][1]));
}
}
}
}
【问题讨论】:
-
使用 SQL Profiler 准确查看传递给服务器的命令可能有助于诊断发生了什么
-
如果您必须编辑问题标题以包含短语“不重复”,因为该标题已经存在,那么您的问题是否重复?
-
你发布的函数是:public void DeleteFromtb_QtyEx(int autoCodeIdentifier)。您正在调用的是 DeleteFromtb_QtyEx_Expire。不一样。
-
另外,方法
DeleteFromtb_QtyEx_Expire的代码是什么,在条件subtract_QtyFromStock_Ex < 0中被调用的方法是什么?你只显示DeleteFromtb_QtyEx的代码 -
您确定目标数据库上的 SP 是您认为的那样吗?例如,是否有可能在不同的模式中有多个版本的
DeleteFromtb_QtyEx?一个非常 常见的错误是简单地混淆了你所击中的SP。如果 actual 解析的 SP 没有参数(因为它是中途完整版本):boom。附带说明:您没有正确处理命令。我强烈推荐使用像“dapper”这样的工具,它极大地简化了ADO.NET的使用
标签: c# sql-server winforms for-loop stored-procedures