【发布时间】: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