数据表插入数据的错误问题

遇到一个很奇怪的问题,我的表单,先查询两个月的数据,再新增一条数据时,点保存,能正常保存成功,若是查询两年的数据,我新增一条时,保存就如下报错,其中表格的有计算公式,当前行库存 =上一行库存+入库-出库,但我感觉应该与此无关吧,以下是问题现像,及数据表,及我的插入代码,请指导一下;

img

img

   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方法执行操作。

希望这个解决方案能够帮助到你,如果你对其中的具体部分有任何疑问,请随时向我提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^