我们正在研究这个项目,在某些时候我们需要验证来自2个不同的Access(mdb)文件的数据。此验证包括根据作为“主键”的列比较这两个文件的条目,以验证其他列是否从文件更改为另一列的值。
我的同事编写了一些代码,将2个文件中的数据导入到Oracle表中,并使用View中的sql连接进行验证。
问题是:文件包含太多数据,需要50多分钟才能将它们加载到Oracle表中。
有没有更好的方法来做这个例程?没有将所有数据导入数据库?
修改
以下是我们用于导入数据的代码(不是由我编写的):
protected void InsereDadosTemp()
{
try
{
String vMesAno = ReportParameter.ReportData.Parameters.Item("pMesAnoCompetencia").Value;
Hashtable hashMesAno = new Hashtable();
hashMesAno.Add(vMesAno, 1);
hashMesAno.Add(MesAnterior(vMesAno), 2);
OleDbConnection objConnOracle = new OleDbConnection(ConfigurationManager.ConnectionStrings["Main"].ToString());
objConnOracle.Open();
OleDbCommand objCmdPciReport = new OleDbCommand("DELETE FROM ZBRICAGEM", objConnOracle);
objCmdPciReport.ExecuteNonQuery();
foreach (DictionaryEntry obj in hashMesAno)
{
string vConnectionString = MontaConnectionString(obj.Key.ToString());
OleDbConnection objConnAccess = new OleDbConnection(vConnectionString);
objConnAccess.Open();
OleDbCommand objCmdAccess = new OleDbCommand("SELECT * FROM TEST where EQUIPE NOT IN ('ONCO', 'DERMA', 'AROMA', 'SOMA', 'IDADE', 'HORMONIO')", objConnAccess);
OleDbDataReader reader = objCmdAccess.ExecuteReader();
if (reader.HasRows)
{
objCmdPciReport = new OleDbCommand("INSERT INTO ZBRICAGEM (ID_BRICK, BRICK, SETOR, EQUIPE, NOME_POOL, BRICKS_UF, BU, ARQUIVO ) Values (" +
"BRICKS_SEQ.NEXTVAL, :p1, :p2, :p3, :p4, :p5, :p6, :p7)", objConnOracle);
objCmdPciReport.CommandType = CommandType.Text;
while (reader.Read())
{
objCmdPciReport.Parameters.Clear();
objCmdPciReport.Parameters.Add(new OleDbParameter(":p1", OleDbType.VarChar, 100)).Value = reader["BRICK"];
objCmdPciReport.Parameters.Add(new OleDbParameter(":p2", OleDbType.VarChar, 100)).Value = reader["SETOR"];
objCmdPciReport.Parameters.Add(new OleDbParameter(":p3", OleDbType.VarChar, 100)).Value = reader["EQUIPE"];
objCmdPciReport.Parameters.Add(new OleDbParameter(":p4", OleDbType.VarChar, 100)).Value = reader["NOME_POOL"];
objCmdPciReport.Parameters.Add(new OleDbParameter(":p5", OleDbType.VarChar, 100)).Value = reader["BRICKS_UF"];
objCmdPciReport.Parameters.Add(new OleDbParameter(":p6", OleDbType.VarChar, 100)).Value = reader["BU"];
objCmdPciReport.Parameters.Add(new OleDbParameter(":p7", OleDbType.VarChar, 100)).Value = Path.GetFileName(objConnAccess.ConnectionString);
objCmdPciReport.ExecuteNonQuery();
}
}
objConnAccess.Close();
}
objConnOracle.Close();
}
catch (Exception ex)
{
throw new Exception("Erro durante a importação de Bricagem: " + ex.Message);
}
}
答案 0 :(得分:0)
如果速度很慢,请尝试将两个文件复制到同一个硬盘。但是如果你没有更新,你可能不会这么做。您还可以考虑以某种方式在只读模式下执行查询(MSA不会尝试锁定.mdb,在网络上速度较慢)。访问可能不像Oracle那样聪明,但是,它可以通过自己的数据格式和简单的连接来体现。它将打破进入甲骨文的大门。
回复评论:
感谢@FastAl,但是我们无法“手动”操纵Access文件,用户将把它们复制到网站的目录中,这是我们与之交互的唯一方式它们是通过C#代码
仍然可以利用这种方法。查询链接表将是速度键。
确保从程序中正确关闭第3个MDB;否则你将无法用新的DB覆盖其他2个DB,它们将在使用中。
也可以以编程方式链接来自c#的访问表 - 我很久以前就已经这样做了,但是忘了如何。您也可以将它们链接到oracle / SQL;这可能需要执行process.execute /.Waitforexit,只是在那些dbms'中运行脚本来处理它。黑客们很好。我看不到他们的'访问链接'驱动程序比访问更快;他们最好只使用'喷气发动机'dll(猜测)。