【问题标题】:Reading Data from XML and storing them into SQL Server database从 XML 读取数据并将它们存储到 SQL Server 数据库中
【发布时间】:2019-08-10 05:06:01
【问题描述】:

我正在开发一个 C# Windows 窗体应用程序。我正在从来自 Web API 的 XML 读取数据,并将 XML 数据存储到 SQL Server 数据库中。

我能够做到这一点。但我唯一担心的是,在生产环境中,此应用程序将投入使用,并且将有超过 100 000 个数据从 XML 同步到 SQL Server 数据库。任何人都可以查看我的代码并告诉我这是否是一种有效的方法,或者如果不是,请提出更改建议。

因为这是我第一次从事 API 方面的工作,甚至在编码方面我也是一个新手。

什么都做完了,能达到我的要求。但我需要专家对我的代码进行审查。

public void save_vendor_info()
{
    SqlConnection con = new SqlConnection(@"server=localhost;Database=TEST;integrated security=true");
    con.Open();

    DataTable dt = new DataTable();

    XmlDocument doc = new XmlDocument();
    doc.Load("https://testdata/api/vendordata");

    try
    {
        XmlNode node = doc.DocumentElement.ChildNodes.Cast<XmlNode>().ToList()[0];

        foreach (XmlNode column in node.ChildNodes)
        {
            dt.Columns.Add(column.Name, typeof(String));
        }

        XmlNode Filas = doc.DocumentElement;

        foreach (XmlNode Fila in Filas.ChildNodes)
        {
            List<string> Valores = Fila.ChildNodes.Cast<XmlNode>().ToList().Select(x => x.InnerText).ToList();

           SqlCommand cmd = new SqlCommand(("IF NOT EXISTS (Select Vendorcode From Vendors where Vendorcode = @Vendorcode) INSERT INTO Vendors VALUES (@Vendorcode, @STCD3, @Name1, @Name2, @Name3, @street1, @street2, @street3, @city1, @city2, @city3, @state1, @state2, @state3, @zip1, @zip2, @zip3, @countrycode, @BusinessUnitId, @VATID, @nationalVATID, @IBAN, @BankAccount, @BankCode)"), con);
            cmd.CommandType = CommandType.Text;

            cmd.Parameters.AddWithValue("@Vendorcode", Valores[0]);
            cmd.Parameters.AddWithValue("@STCD3", Valores[1]);
            cmd.Parameters.AddWithValue("@Name1", Valores[2]);
            cmd.Parameters.AddWithValue("@Name2", Valores[3]);
            cmd.Parameters.AddWithValue("@Name3", Valores[4]);
            cmd.Parameters.AddWithValue("@street1", Valores[5]);
            cmd.Parameters.AddWithValue("@street2", Valores[6]);
            cmd.Parameters.AddWithValue("@street3", Valores[7]);
            cmd.Parameters.AddWithValue("@city1", Valores[8]);
            cmd.Parameters.AddWithValue("@city2", Valores[9]);
            cmd.Parameters.AddWithValue("@city3", Valores[10]);
            cmd.Parameters.AddWithValue("@state1", Valores[11]);
            cmd.Parameters.AddWithValue("@state2", Valores[12]);
            cmd.Parameters.AddWithValue("@state3", Valores[13]);
            cmd.Parameters.AddWithValue("@zip1", Valores[14]);
            cmd.Parameters.AddWithValue("@zip2", Valores[15]);
            cmd.Parameters.AddWithValue("@zip3", Valores[16]);
            cmd.Parameters.AddWithValue("@countrycode", Valores[17]);
            cmd.Parameters.AddWithValue("@BusinessUnitId", Valores[18]);
            cmd.Parameters.AddWithValue("@VATID", Valores[19]);
            cmd.Parameters.AddWithValue("@nationalVATID", Valores[20]);
            cmd.Parameters.AddWithValue("@IBAN", Valores[21]);
            cmd.Parameters.AddWithValue("@BankAccount", Valores[22]);
            cmd.Parameters.AddWithValue("@BankCode", Valores[23]);

            cmd.ExecuteNonQuery();
        }
    }
    catch (Exception ex)
    {
    }
}

【问题讨论】:

  • 我投票结束这个问题,因为它属于codereview.stackexchange.com
  • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...
  • 使用 SQL Client 类会比使用 Entity 慢。如果速度不是问题,请使用当前代码。
  • 最重要的小改动是使用事务来批量更改。否则 SQL Server 将在每一行之后提交。真正加快加载速度的更大变化是使用 SqlBulkCopy 暂存数据并将其合并到目标表中。

标签: c# sql-server winforms xmldocument


【解决方案1】:

有些事情突然想到了。

  1. XML 通过网络和memory &amp; GC 的通信会受到伤害,特别是谈到您声称要发送的数据量。 GC会停止进程释放内存

  2. 为什么要使用数据表?

  3. 重复使用 SQL 连接,确保池已开启

  4. 准备SqlCommand 并仅在准备执行它时分配参数值。

  5. 使用存储过程

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多