【发布时间】:2012-07-19 18:18:07
【问题描述】:
我们正在处理这个项目,有时我们需要验证来自 2 个不同 Access(mdb) 文件的数据。此验证包括根据“主键”列比较这两个文件的条目,以验证其他列的值是否从文件更改为另一个。
我的同事编写了一些代码,将这两个文件中的数据导入到 Oracle 表中,并在视图中使用 sql 连接进行验证。
问题是:文件数据太多,加载到 Oracle 表需要 50 多分钟。
有没有更好的方法来制作这个例程?无需将所有数据导入数据库?
编辑
这是我们用来导入数据的代码(不是我写的):
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);
}
}
【问题讨论】:
-
问题是这个验证是向客户显示的报告的一部分。所以,他选择了他要比较的文件,然后我们将文件的数据插入数据库中,比较它们并呈现文件之间的差异。该文件将由用户复制到一个目录中,程序将读取它们。因此,很遗憾,我们无法处理 Access 文件中的查询。
-
这里的一些注释:stackoverflow.com/questions/4648565/tablediff-example/… 我在某个阶段编写了一些代码,用于将所有表与相关主键进行比较。
-
如何将访问数据加载到 oracle 中?也许对该过程进行一些性能调整会有所帮助。
-
我已经添加了我们用来导入数据的代码。
标签: c# asp.net oracle ms-access