将查询出来的数据,插入到另一数据库的表里面,报错;

我想从ERP的SQL sever数据库里面,提取想要的内容,插入到我们另一个生产数据库的sql server数据表里面,对应字段都设置好了,但在执行插入时,程序总提示报错,列XX找不到,断点错误提示在插入命令行(insertCommand.Parameters.AddWithValue("@date", row["date"])) 及向下;

请给看看是什么原因 ,单独在ERP数据库里,单独执行查询是没有问题,有数据的;

img

 private void btnK3_Click(object sender, EventArgs e)
        {
            try
            {
                using (SqlConnection conn = new SqlConnection("server=192.168.2.5;database=AIS20211229104826;user=sa;password=zzwrcwzx"))
                {
                    conn.Open();

                    // 获取读取到的字段值
                    DateTime inputdate = dateTimePicker1.Value.Date;

                    // 从k3数据表中读取数据
                    string selectSql = @"select t2.FDate,t4.FName,t1.FBatchNo,t1.Fauxqty,t1.FEntrySelfA0242 
                                          from ICStockBillEntry t1 
                                          join ICStockBill t2 on t1.FInterID=t2.FInterID 
                                          join t_ICItem t4 on t1.FItemID=t4.FItemID ----(产品表,包含产品名称、编码等信息)
                                          join ICTransactionType t5 on t2.FTranType=t5.FID
                                          where t2.FTranType=2 --(产品入库单,不含外部入库等信息)
                                          and isnull(t1.FEntrySelfA0242,0)<>0 ---(取样数量不为零)
                                          order by t2.FDate,t2.FBillNo";

                    using (SqlCommand selectCommand = new SqlCommand(selectSql, conn))
                    {
                        selectCommand.Parameters.AddWithValue("@date", inputdate);

                        DataTable dataTable = new DataTable();
                        using (SqlDataAdapter dataAdapter = new SqlDataAdapter(selectCommand))
                        {
                            dataAdapter.Fill(dataTable);
                        }

                        // 遍历DataTable中的每一行,并插入到w_protran表中
                        foreach (DataRow row in dataTable.Rows)
                        {
                            // 插入到新数据表的对应字段值
                            string insertSql = @"INSERT INTO [dbo].[w_k3tran]([date],[batchNo],[proname],[instock],[outstock],[sample])
                                    VALUES (@date, @batchNo, @proname,@instock,@outstock,@sample)";
                            using (SqlCommand insertCommand = new SqlCommand(insertSql, conn))
                            {
                                insertCommand.Parameters.AddWithValue("@date", row["date"]);
                                insertCommand.Parameters.AddWithValue("@batchNo", row["batchNo"]);                              
                                insertCommand.Parameters.AddWithValue("@proname", row["proname"]);
                                insertCommand.Parameters.AddWithValue("@instock", row["instock"]);
                                insertCommand.Parameters.AddWithValue("@outstock", row["outstock"]);
                                insertCommand.Parameters.AddWithValue("@sample", row["sample"]);

                                insertCommand.ExecuteNonQuery();
                            }
                        }

                        MessageBox.Show("插入成功");
                    }

                    conn.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }     
        }
    }

因为你sql里没有date这个变量,导致dateTable里也没有

根据你说的错误 insertCommand.Parameters.AddWithValue("@date", row["date"]))
那你打个断点检查一下 foreach (DataRow row in dataTable.Rows)这一行的dataTable 是否真有这行

想起来了,因为不同的数据库,需要打开不同的链接,我又加上了个生产数据库的链接,但仍报错如上;


```c#
private void btnK3_Click(object sender, EventArgs e)
        {
            try
            {
                using (SqlConnection conn = new SqlConnection("server=192.168.2.5;database=AIS20211229104826;user=sa;password=zzwrcwzx"))
                {
                    conn.Open();

                    SqlConnection conn1 = new SqlConnection("server=192.168.100.247;database=WHMesInfo;user=sa;password=whyy@2021");

                    conn1.Open();

                    // 获取读取到的字段值
                    DateTime inputdate = dateTimePicker1.Value.Date;

                    // 从k3数据表中读取数据
                    string selectSql = @"select t2.FDate,t4.FName,t1.FBatchNo,t1.Fauxqty,t1.FEntrySelfA0242 
                                          from ICStockBillEntry t1 
                                          join ICStockBill t2 on t1.FInterID=t2.FInterID 
                                          join t_ICItem t4 on t1.FItemID=t4.FItemID ----(产品表,包含产品名称、编码等信息)
                                          join ICTransactionType t5 on t2.FTranType=t5.FID
                                          where t2.FTranType=2 --(产品入库单,不含外部入库等信息)
                                          and isnull(t1.FEntrySelfA0242,0)<>0 ---(取样数量不为零)
                                          order by t2.FDate,t2.FBillNo";

                    using (SqlCommand selectCommand = new SqlCommand(selectSql, conn))
                    {
                        selectCommand.Parameters.AddWithValue("@date", inputdate);

                        DataTable dataTable = new DataTable();
                        using (SqlDataAdapter dataAdapter = new SqlDataAdapter(selectCommand))
                        {
                            dataAdapter.Fill(dataTable);
                        }

                       
                        // 遍历DataTable中的每一行,并插入到w_protran表中
                        foreach (DataRow row in dataTable.Rows)
                        {
                            // 插入到新数据表的对应字段值
                            string insertSql = @"INSERT INTO [dbo].[w_k3tran]([date],[batchNo],[proname],[instock],[outstock],[sample])
                                    VALUES (@date, @batchNo, @proname,@instock,@outstock,@sample)";
                            using (SqlCommand insertCommand = new SqlCommand(insertSql, conn1))
                            {
                                insertCommand.Parameters.AddWithValue("@date", row["date"]);
                                insertCommand.Parameters.AddWithValue("@batchNo", row["batchNo"]);                              
                                insertCommand.Parameters.AddWithValue("@proname", row["proname"]);
                                insertCommand.Parameters.AddWithValue("@instock", row["instock"]);
                                insertCommand.Parameters.AddWithValue("@outstock", row["outstock"]);
                                insertCommand.Parameters.AddWithValue("@sample", row["sample"]);

                                insertCommand.ExecuteNonQuery();
                            }
                        }

                        MessageBox.Show("插入成功");
                    }

                    conn.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }     
        }
    }

```

【以下回答由 GPT 生成】

问题出在insertCommand.Parameters.AddWithValue("@date", row["date"])处。根据你提供的代码,row["date"]指的是从ERP数据库中读取出的日期值,但这个值并没有指定具体类型,因此插入命令中的参数类型也无法确定。由于从ERP数据库读取出的日期值的类型可能是datetimestring,所以在插入命令中无法确定参数的类型,导致错误。

解决方案是将selectSql语句中的日期字段转换为字符串类型,然后在插入命令中将参数类型指定为string。具体步骤如下:

// 从k3数据表中读取数据,并将日期字段转换为字符串类型
string selectSql = @"select CONVERT(varchar(10), t2.FDate, 120) as FDate, t4.FName, t1.FBatchNo, t1.Fauxqty, t1.FEntrySelfA0242 
                     from ICStockBillEntry t1 
                     join ICStockBill t2 on t1.FInterID=t2.FInterID 
                     join t_ICItem t4 on t1.FItemID=t4.FItemID ----(产品表,包含产品名称、编码等信息)
                     join ICTransactionType t5 on t2.FTranType=t5.FID
                     where t2.FTranType=2 --(产品入库单,不含外部入库等信息)
                     and isnull(t1.FEntrySelfA0242,0)<>0 --(取样数量不为零)
                     order by t2.FDate,t2.FBillNo;";

// 遍历DataTable中的每一行,并插入到w_protran表中
foreach (DataRow row in dataTable.Rows)
{
    // 插入到新数据表的对应字段值
    string insertSql = @"INSERT INTO [dbo].[w_k3tran]([date],[batchNo],[proname],[instock],[outstock],[sample])
                         VALUES (@date, @batchNo, @proname, @instock, @outstock, @sample);";
    using (SqlCommand insertCommand = new SqlCommand(insertSql, conn))
    {
        // 将参数类型指定为string,并将日期值转换为字符串类型
        insertCommand.Parameters.Add("@date", SqlDbType.VarChar).Value = row["FDate"].ToString();
        insertCommand.Parameters.AddWithValue("@batchNo", row["batchNo"]);
        insertCommand.Parameters.AddWithValue("@proname", row["FName"]);
        insertCommand.Parameters.AddWithValue("@instock", row["Fauxqty"]);
        insertCommand.Parameters.AddWithValue("@outstock", "0");
        insertCommand.Parameters.AddWithValue("@sample", row["FEntrySelfA0242"]);

        insertCommand.ExecuteNonQuery();
    }
}

通过上述修改,将日期字段转换为字符串类型,并在插入命令中显式指定参数类型为string,即可解决问题。如果还有其他报错,请提供完整的错误信息,以便进一步帮助分析和解决问题。


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