【问题标题】:Send large amount of data in Oracle in C#C#中Oracle发送大量数据
【发布时间】:2023-01-10 00:21:50
【问题描述】:

[初学者] 对不起我的英语不好。 我在一家新公司工作了很短的时间,我认为自己是 BDD 的新手,因为除了学校我没有练习过。

[环境] 我正在用 C# 开发一个我需要优化的现有软件。有一个很大的限制,那就是不要修改基地,因为许多客户已经在使用它们并且不想更改他们的服务器。一般来说,如果他使用 ORACLE,那是因为他也将它用于其他软件。

软件使用了System.Data.OracleClient,但是后者已经过时了,我开始实现Oracle.ManagedDataAccess.Client。我可以和数据库通信,读写数据,但是不能快速发送大量数据。

在现场,我们有一台带有远程基地的服务器,因此带有 Oracle 或 MySQL(我目前感兴趣的是 Oracle) 并且有使用 SQLite 数据库的本地工作站,并且必须能够在没有远程数据库的情况下运行。

默认情况下,所有内容都保存在本地,如果可以访问远程数据库,我需要进行同步。因此可能有大量数据要传输。 (有测量记录)

[对于我的测试] 我恢复了一个客户数据库,以便用真实数据进行测试,并恢复了其中一个超过 650,000 行的表。 一行一行地传输这条线需要很多时间,即使我当然没有在每条线上进行断开连接。 我想尝试发送参数块,但我现在做不到。

[我的研究] 我一直在寻找,但我发现要么使用付费 DLL,要么我不了解它们的用途。

[我的代码] 在我离开它的那一刻,真的在测试中:

        public void testOracle()
        {
            try
            {
                if (Connection == null)
                {
                    Connection = OracleConnection();
                }
                string commandString = "INSERT INTO GRAPHE (ID, MESUREE_ID, DATE_MESURE, POINT_GRAPHE, D0, D1) VALUES (:IDp, :MESUREE_IDp, to_timestamp( :DATE_MESUREp ,'DD/MM/RR HH24:MI:SSXFF'), :POINT_GRAPHEp, :D0p, :D1p)";
                int _ID = 1;
                int _MESUREE_ID = 9624;
                string _DATE_MESURE = "16/12/ 08 00:00:00,000000000";
                int _POINT_GRAPHE = 1229421394;
                int[] _D0 = 0;
                int[] _D1 = 0;

                using (OracleCommand command = new OracleCommand(commandString, Connection))
                {

                    using (var transaction = Connection.BeginTransaction())
                    {
                        for (int i = 0; i < _ID.Length; i++)
                        {
                            command.Parameters.Add("IDp", OracleDbType.Decimal).Value = _ID;
                            command.Parameters.Add("MESUREE_IDp", OracleDbType.Decimal).Value = _MESUREE_ID];
                            command.Parameters.Add("DATE_MESUREp", OracleDbType.Varchar2).Value = _DATE_MESURE[i];
                            command.Parameters.Add("POINT_GRAPHEp", OracleDbType.Decimal).Value = _POINT_GRAPHE[i];
                            command.Parameters.Add("DOS10p", OracleDbType.Decimal).Value = _D0[i];
                            command.Parameters.Add("DOS07p", OracleDbType.Decimal).Value = _D1[i];
                            command.ExecuteNonQuery();
                        }
                        transaction.Commit();
                    }
                }
            }
            catch (Exception ex)
            {

            }
            Connection.Close();
        }


        public OracleConnection OracleConnection()
        {
            string serveur_name = "192.168.0.1";
            string database_name = "oracle.dev";
            string user_name = "name";
            string password = "pass";
            string oraclePort = "1521";
            OracleConnection _con = null;
            try
            {
                string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + serveur_name + ")(PORT=" + oraclePort + ")) (CONNECT_DATA=(SERVICE_NAME=" + database_name + "))); User Id=" + user_name + ";Password=" + password + ";";
                _con = new OracleConnection(connectionString);
                try
                {
                    _con.Open();
                }
                catch (Exception e)
                {

                }
            }
            catch (Exception e)
            {
      
            }
            return _con;
        }
    }```

【问题讨论】:

  • 如果我正确理解你的问题,你想将多条记录插入到数据库表中?
  • 是的,就是这样。我试图将数组放入参数值中,但它不需要任何数组。我尝试做一个 for 循环来逐个添加,直到 ExecuteNonQuery();但是在第二轮他告诉我这个对象不存在。

标签: c# oracle bulkinsert


【解决方案1】:

然后您可以创建一个 DataTable 并进行批量插入

using (var bulkCopy = new OracleBulkCopy(yourConnectionString, OracleBulkCopyOptions.UseInternalTransaction))
{
   bulkCopy.DestinationTableName = "GRAPHE";
   bulkCopy.WriteToServer(dataTable);
}

您还可以根据需要使用 BatchSize 属性。

【讨论】:

  • 好的,我会试试的。
  • 太完美了,我到了我做了一个模拟现实的测试:1)读取330,000行的SQLite,检索一个DataTable。 2) 然后从要恢复的数据表中重新创建一个数据表,因为我有一个字段在我的 SQLite 数据库中是 Unixtime,但在 Oracle 中是 DateTime。 3) 然后我就应用了你的代码,它在 2-3 秒内插入了 330,000 行,太完美了,非常感谢。它与 SQlite 一起工作(以不同的方式),我认为付费软件 Oracle 不可能没有解决方案。非常感谢你,。
  • @Megamario 很高兴为您提供帮助
猜你喜欢
  • 1970-01-01
  • 2013-11-28
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多