Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用DataTable.update()不会在一种方法中向我的SQL Server数据库添加条目,但会在另一种方法中添加条目_C#_Sql Server_Datatable - Fatal编程技术网

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吗?如果是,为什么?因为我可以引用其中的数据行并获取值?我认为您会收到否决票,因为您的问题无法得到回答。罪犯代码在其他地方,但您没有显示。