我想从ERP的SQL sever数据库里面,提取想要的内容,插入到我们另一个生产数据库的sql server数据表里面,对应字段都设置好了,但在执行插入时,程序总提示报错,列XX找不到,断点错误提示在插入命令行(insertCommand.Parameters.AddWithValue("@date", row["date"])) 及向下;
请给看看是什么原因 ,单独在ERP数据库里,单独执行查询是没有问题,有数据的;
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数据库读取出的日期值的类型可能是datetime
或string
,所以在插入命令中无法确定参数的类型,导致错误。
解决方案是将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
,即可解决问题。如果还有其他报错,请提供完整的错误信息,以便进一步帮助分析和解决问题。