C# 使用DataTable.update()不会在一种方法中向我的SQL Server数据库添加条目,但会在另一种方法中添加条目
我有一个方法(C# 使用DataTable.update()不会在一种方法中向我的SQL Server数据库添加条目,但会在另一种方法中添加条目,c#,sql-server,datatable,C#,Sql Server,Datatable,我有一个方法(AddRowToSQLTable())传递一行,然后它创建一个包含该行的行数组,然后将其传递给DataTable.update() 这个很好用。SQL Server将更新,下次运行(调试)程序时,新数据将出现 另一种方法(AddStock())使用类似的结构,但不起作用 不同之处在于,我在Update()中传递的是一个数据表,而不是行[]但是没有引发异常,只是服务器上没有更新/添加任何内容 有人能解释一下到底发生了什么以及为什么这些不同吗?我想知道这一点,即使解决方案是使用不同的结
AddRowToSQLTable()
)传递一行,然后它创建一个包含该行的行数组,然后将其传递给DataTable.update()
这个很好用。SQL Server将更新,下次运行(调试)程序时,新数据将出现
另一种方法(AddStock()
)使用类似的结构,但不起作用
不同之处在于,我在Update()
中传递的是一个数据表,而不是行[]
但是没有引发异常,只是服务器上没有更新/添加任何内容
有人能解释一下到底发生了什么以及为什么这些不同吗?我想知道这一点,即使解决方案是使用不同的结构来实现我想要的,这样我就知道了未来,并有了更好的理解
注意:
我已测试以确保传递的DataTable
包含记录。DataTable
与目标SQL Server表的格式相同
我也尝试过SqlBulkCopy
,但遇到了同样的问题
非常感谢
private DataTable StockAdditions;
public void PrepareStockQuantitiesForAdding()
{
if (StockAdditions != null)
{
StockAdditions.Clear();
}
StockAdditions = StockQuantitiesTable.Clone();
int Count = 0;
DataRow RowToAdd = StockQuantitiesTable.NewRow();
DataView AreaIDs = new DataView(AreaTable);
DataView Conditions = new DataView(ConditionsTable);
int AreaID;
string ConditionCode;
foreach (DataRow Row in SessionSKUScanned.Rows)
{
if (Row["Serial Number"].ToString() == "")
{
Conditions.RowFilter = "([Name] = '" + Row["Condition"] + "')";
ConditionCode = Conditions[0][2].ToString();
AreaIDs.RowFilter = "([StorageAreaName] = '" + Row["Area"] + "')";
AreaID = Convert.ToInt32(AreaIDs[0][0]);
DataView StockQuantities = new DataView(StockQuantitiesTable);
StockQuantities.RowFilter = "([QuantityID] = '" + AreaID + "-" + Row["SKU"] + "-" + ConditionCode + "')";
if (StockQuantities.Count > 0)
{
StockQuantities[0][3] = Convert.ToInt32(StockQuantities[0][3]) + 1;
RowToAdd["QuantityID"] = AreaID + "-" + Row["SKU"] + "-" + ConditionCode;
RowToAdd["SKU"] = Row["SKU"];
RowToAdd["AreaID"] = AreaID;
RowToAdd["Quantity"] = StockQuantities[0][3] = Convert.ToInt32(StockQuantities[0][3]) + 1;
RowToAdd["Condition"] = Row["Condition"];
}
else
{
RowToAdd["QuantityID"] = AreaID + "-" + Row["SKU"] + "-" + ConditionCode;
RowToAdd["SKU"] = Row["SKU"];
RowToAdd["AreaID"] = AreaID;
RowToAdd["Quantity"] = 1;
RowToAdd["Condition"] = Row["Condition"];
}
Count++;
}
else
{
RowToAdd["QuantityID"] = Row["Serial Number"];
RowToAdd["SKU"] = Row["SKU"];
AreaIDs.RowFilter = "([StorageAreaName] = '" + Row["Area"] + "')";
RowToAdd["AreaID"] = Convert.ToInt32(AreaIDs[0][0]);
RowToAdd["Quantity"] = 1;
RowToAdd["Condition"] = Row["Condition"];
Count++;
}
StockQuantitiesTable.ImportRow(RowToAdd);
MessageBox.Show(RowToAdd[0].ToString());
StockAdditions.ImportRow(RowToAdd);
}
}
private void AddRowToSQLTable(DataRow Row, string SQLTableName)
{
DataRow[] Rows = new DataRow[1];
Rows[0] = Row;
SqlConnection SQLConn = new SqlConnection(ConfigurationManager.ConnectionStrings["eCommStock.Properties.Settings.Demo_SiteConnectionString"].ConnectionString);
SQLConn.Open();
SqlDataAdapter daUpdateTable = new SqlDataAdapter("Select * From " + SQLTableName, SQLConn);
SqlCommandBuilder SQLcmdBuilder = new SqlCommandBuilder(daUpdateTable);
daUpdateTable.Update(Rows);
SQLConn.Close();
}
public void AddStock()
{
SqlConnection SQLConn = new SqlConnection(ConfigurationManager.ConnectionStrings["eCommStock.Properties.Settings.Demo_SiteConnectionString"].ConnectionString);
SQLConn.Open();
SqlDataAdapter daUpdateTable = new SqlDataAdapter("Select * From StockQuantities", SQLConn);
SqlCommandBuilder SQLcmdBuilder = new SqlCommandBuilder(daUpdateTable);
daUpdateTable.Update(StockAdditions);
SQLConn.Close();
}
它不工作,因为RowToAdd.RowState已分离。我不喜欢它,但下面是一个快速而肮脏的解决方案,在将行导入StockAdditions之前,请确保该行处于添加状态,稍后您可以再次“分离”该行
StockQuantitiesTable.Rows.Add(RowToAdd);
StockAdditions.ImportRow(RowToAdd);
StockQuantitiesTable.Rows.Remove(RowToAdd);
股票从哪里来?StockAdditions.GetChanges()返回行吗?如果没有,则adapter.Update()不执行任何操作。它是类中的一个数据表,包含需要发送到SQLServer进行更新或插入的软件端记录。我确实觉得我可能使用了错误的方法,但我真的不明白为什么它在一种方法中有效,而在另一种方法中无效。SQLBulkCopy似乎更适合?它是否包含更改?你有在什么地方打过AcceptChanges吗?我需要在StockAdditions上打AcceptChanges吗?如果是,为什么?因为我可以引用其中的数据行并获取值?我认为您会收到否决票,因为您的问题无法得到回答。罪犯代码在其他地方,但您没有显示。