遇到一个很奇怪的问题,我的表单,先查询两个月的数据,再新增一条数据时,点保存,能正常保存成功,若是查询两年的数据,我新增一条时,保存就如下报错,其中表格的有计算公式,当前行库存 =上一行库存+入库-出库,但我感觉应该与此无关吧,以下是问题现像,及数据表,及我的插入代码,请指导一下;
private void btnmodify_Click(object sender, EventArgs e)
{
conn = new SqlConnection("server=192.168.1.2;database=Whmesinfo;user=sa;password=whyy");
conn.Open();
try
{
DataTable changedt = dt.GetChanges(); //将发生变化的内容,存储在另一个表内;
foreach (DataRow dr in changedt.Rows)
{
string strsql = string.Empty;
if (dr.RowState == System.Data.DataRowState.Modified)//修改操作
{
if (string.IsNullOrEmpty(dr["stotime"].ToString())) // 检查日期是否为空
{
MessageBox.Show("请输入日期,再点保存");
return; // 返回,不继续执行保存操作
}
strsql = @"UPDATE [dbo].[w_packstock]
SET [stotime] = '" + Convert.ToDateTime(dr["stotime"]) + @"'
,[name] = '" + dr["name"].ToString() + @"'
,[unit] = '" + dr["unit"].ToString() + @"'
,[inamount] = '" + dr["inamount"].ToString() + @"'
,[outamount] = '" + dr["outamount"].ToString() + @"'
,[inv] = '" + dr["inv"].ToString() + @"'
,[app] = '" + dr["app"].ToString() + @"'
,[note] = '" + dr["note"].ToString() + @"'
where id = '" + dr["id"].ToString() + "'";
SqlCommand comm = new SqlCommand(strsql, conn);
comm.ExecuteNonQuery();
}
else if (dr.RowState == System.Data.DataRowState.Added)//增加操作
{
if (string.IsNullOrEmpty(dr["stotime"].ToString())) // 检查日期是否为空
{
MessageBox.Show("请输入日期,再点保存");
return; // 返回,不继续执行保存操作
}
sqlstring = @"INSERT INTO [dbo].[w_packstock]
([stotime],[name],[unit],[inamount],[outamount],[inv],[app],[note])
VALUES
(@stotime, @name, @unit, @inamount, @outamount, @inv, @app, @note)";
SqlCommand comm = new SqlCommand(sqlstring, conn);
comm.Parameters.AddWithValue("@stotime", Convert.ToDateTime(dr["stotime"].ToString()));
comm.Parameters.AddWithValue("@name", dr["name"].ToString());
comm.Parameters.AddWithValue("@unit", dr["unit"].ToString());
comm.Parameters.AddWithValue("@inamount", decimal.Parse(dr["inamount"].ToString()));
comm.Parameters.AddWithValue("@outamount", decimal.Parse(dr["outamount"].ToString()));
comm.Parameters.AddWithValue("@inv", decimal.Parse(dr["inv"].ToString()));
comm.Parameters.AddWithValue("@app", dr["app"].ToString());
comm.Parameters.AddWithValue("@note", dr["note"].ToString());
comm.ExecuteNonQuery();
}
}
MessageBox.Show("更新成功");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
MessageBox.Show("请输入修改内容后,再保存修改");
}
finally
{
conn.Close();
}
}
【以下回答由 GPT 生成】
对于你遇到的问题,可能是因为在查询两年数据时,导致插入数据的操作所需要执行的SQL语句过长,超出了数据库的限制。你可以尝试将保存操作的SQL语句拆分成多个较短的语句来解决这个问题。以下是一个可能的解决方案:
private void btnmodify_Click(object sender, EventArgs e)
{
conn = new SqlConnection("server=192.168.1.2;database=Whmesinfo;user=sa;password=whyy");
conn.Open();
try
{
DataTable changedt = dt.GetChanges(); //将发生变化的内容存储在另一个表内
foreach (DataRow dr in changedt.Rows)
{
string strsql = string.Empty;
if (dr.RowState == System.Data.DataRowState.Modified) //修改操作
{
if (string.IsNullOrEmpty(dr["stotime"].ToString())) // 检查日期是否为空
{
MessageBox.Show("请输入日期,再点保存");
return; // 返回,不继续执行保存操作
}
// 拆分SQL语句,将更新操作分成多个较短的操作
strsql += @"
UPDATE [dbo].[w_packstock]
SET [stotime] = '" + Convert.ToDateTime(dr["stotime"]) + @"'
WHERE id = '" + dr["id"].ToString() + "';";
strsql += @"
UPDATE [dbo].[w_packstock]
SET [name] = '" + dr["name"].ToString() + @"'
WHERE id = '" + dr["id"].ToString() + "';";
// 继续拆分更新语句的代码...
// 执行拆分后的SQL语句
SqlCommand cmd = new SqlCommand(strsql, conn);
cmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
// 处理异常的代码...
// ...
}
finally
{
conn.Close();
}
}
请注意,在上述代码中,我只给出了拆分SQL语句的一个例子。根据你的具体数据表结构和更新需求,你可能需要根据实际情况拆分更多的操作。同时,记得在执行SQL语句之前要先为每个操作创建一个新的SqlCommand对象,并通过ExecuteNonQuery
方法执行操作。
希望这个解决方案能够帮助到你,如果你对其中的具体部分有任何疑问,请随时向我提问。
【相关推荐】