C# 为什么用第一个读卡器read()运行第二个读卡器要比在上面运行更快';她自己的读者读什么?
好的,我正在运行这段代码,将大量数据从普及数据库移动到access数据库C# 为什么用第一个读卡器read()运行第二个读卡器要比在上面运行更快';她自己的读者读什么?,c#,sql,ms-access,oledb,C#,Sql,Ms Access,Oledb,好的,我正在运行这段代码,将大量数据从普及数据库移动到access数据库 public List<HBPData> LoadData() { loadConnect(); //<-- get's the Pervasive/Access string from a text file List<HBPData> listofhbpdata1 = new List<HBPData>(); List&
public List<HBPData> LoadData()
{
loadConnect(); //<-- get's the Pervasive/Access string from a text file
List<HBPData> listofhbpdata1 = new List<HBPData>();
List<HBPData> listofhbpdata2 = new List<HBPData>();
PsqlConnection myConnection = new PsqlConnection();
myConnection.ConnectionString = PervasiveString;
myConnection.Open();
PsqlCommand myCommand = new PsqlCommand("Select NUMBER, CUST_NAME, PO_NO, REQD_DATE, PO_NO, CUST_PO_NO, ORD_DATE, STATUS FROM SALES_ORDER_HEADER WHERE ORD_DATE > 20120220 Order By ORD_DATE desc", myConnection);
PsqlDataReader myreader = null;
myreader = myCommand.ExecuteReader();
while (myreader.Read())
{
HBPData DataEntity = new HBPData();
DataEntity.NUMBER = (myreader["NUMBER"].ToString());
DataEntity.CUST_NO = (myreader["CUST_NAME"].ToString()).Replace("'","");
DataEntity.PO_NO = (myreader["PO_NO"].ToString());
DataEntity.RequiredDateTime = (myreader["REQD_DATE"].ToString());
DataEntity.Tag = (myreader["PO_NO"].ToString());
DataEntity.Shape = (myreader["CUST_PO_NO"].ToString());
DataEntity.ExpectedCompletion = myreader["ORD_DATE"].ToString().Substring(0, 4) + "/" + myreader["ORD_DATE"].ToString().Substring(4, 2) + "/" + myreader["ORD_DATE"].ToString().Substring(6, 2);
DataEntity.MostRecentStatus = (myreader["STATUS"].ToString());
listofhbpdata1.Add(DataEntity);
}
PsqlCommand myCommand1 = new PsqlCommand("Select NUMBER, RECNO, CODE, ORDD_DESCRIPTION, BVORDQTY FROM SALES_ORDER_DETAIL WHERE BVRVADDDATE > 20120220 AND (PROD_CODE = \'MET\' OR PROD_CODE = \'MDT\') Order By NUMBER desc", myConnection);
PsqlDataReader myreader1 = null;
myreader1 = myCommand1.ExecuteReader();
while (myreader.Read())
{
HBPData DataEntity = new HBPData();
DataEntity.NUMBER = (myreader1["NUMBER"].ToString());
DataEntity.RECNO = (myreader1["RECNO"].ToString());
DataEntity.CODE = (myreader1["CODE"].ToString());
DataEntity.DESCRIPTION = (myreader1["ORDD_DESCRIPTION"].ToString());
DataEntity.Quantity = (myreader1["BVORDQTY"].ToString());
listofhbpdata2.Add(DataEntity);
}
myConnection.Close();
myreader1.Close();
myreader.Close();
System.Data.OleDb.OleDbConnection myAccessConnection = new System.Data.OleDb.OleDbConnection();
myAccessConnection.ConnectionString = AccessString;
myAccessConnection.Open();
System.Data.OleDb.OleDbCommand myAccessCommand3 = new System.Data.OleDb.OleDbCommand("delete from AllOrders", myAccessConnection);
myAccessCommand3.ExecuteNonQuery();
for (int i = 0; i < listofhbpdata2.Count(); ++i)
{
System.Data.OleDb.OleDbCommand myAccessCommand2 = new System.Data.OleDb.OleDbCommand("" +
"Insert into AllOrders VALUES('" +
listofhbpdata2[i].NUMBER + "'" + ",'" + listofhbpdata2[i].RECNO.ToString() + "'" +
",'" + listofhbpdata2[i].CODE + "','" + listofhbpdata2[i].DESCRIPTION.Replace("\'", "F") + "'" +
",'" + listofhbpdata2[i].Quantity + "')", myAccessConnection);
myAccessCommand2.ExecuteNonQuery();
}
myAccessConnection.Close();
return listofhbpdata1;
}
公共列表加载数据()
{
loadConnect();//20120220和(产品代码=\'MET\'或产品代码=\'MDT\')按编号顺序描述,myConnection);
PsqlDataReader myreader1=null;
myreader1=myCommand.ExecuteReader();
while(myreader.Read())
{
HBPData DataEntity=新的HBPData();
DataEntity.NUMBER=(myreader1[“NUMBER”].ToString());
DataEntity.RECNO=(myreader1[“RECNO”].ToString());
DataEntity.CODE=(myreader1[“CODE”].ToString());
DataEntity.DESCRIPTION=(myreader1[“ORDD_DESCRIPTION”].ToString());
DataEntity.Quantity=(myreader1[“BVORDQTY”].ToString());
ListHbPData2.Add(数据实体);
}
myConnection.Close();
myreader1.Close();
myreader.Close();
System.Data.OleDb.OleDbConnection myAccessConnection=新的System.Data.OleDb.OleDbConnection();
myAccessConnection.ConnectionString=AccessString;
myAccessConnection.Open();
System.Data.OleDb.OleDbCommand myAccessCommand3=新的System.Data.OleDb.OleDbCommand(“从AllOrders中删除”,myAccessConnection);
myAccessCommand3.ExecuteOnQuery();
对于(int i=0;i
现在,。如果你仔细看,我输入了第二个阅读器,它应该是在(myreader1.read())…我不小心放了myreader.read()的时候读的
让我大吃一惊的是,myreader.read()居然成功运行了。。。
这是什么样的打击我的心,。。。
我把它改为“myreader1.read()”
代码的运行时间几乎是原来的两倍,
不管怎样,检查数据库,所有的数据都在那里
所以,根据常识,我认为,它可能只是在每次运行第一个阅读器时都执行这两组代码
但是为什么所有的数据都在那里呢
Sales\u Order\u标题中的字段比Sales\u Order\u Detail中的字段要少得多,如果它在读第一个字段,它不应该在标题表的末尾完成,然后停止吗?那么为什么所有的数据都在那里
无论如何,这段代码的运行时间相对较慢,有人对改进我的代码有什么建议吗
编辑:只是为了表明第二个读取器实际上没有返回false:
如您所见,调试器已经进入了读卡器的内部您能告诉我们运行最慢的行吗 尝试使用块来处理IDisposable对象,例如DB连接。这样,在出现异常时您将是安全的。并且您不需要明确地调用Close()
For循环添加了大量字符串。请改用StringBuilder。是否确定在第二次调用
myreader
时获得了正确的数据?
有些地方看起来不对劲:你在myreader
中循环,它应该从你的第一个SELECT
语句中获取数据,但是你的内部代码引用了myreader1
因此,这里奇怪的不是第二次迭代应该比第一次更快:而是第二次迭代正在返回您期望的数据。所以问题是:你确定在第二个循环中:
- 您将从第二条
语句中获得所有记录的预期迭代次数,比如5000(与第一条语句中的记录次数相反,比如1000)SELECT
- 实际上,您在第二个
语句中获得的是每条记录的数据,而不是每次都是同一条顶部记录SELECT
- 通过执行单个
语句添加数据的速度会很慢。INSERT
看看这个问题,可以找到一些非常快速的备选方案:
- 如果要在Access数据库上执行大量工作,请保持与该数据库的连接永久打开,而不是打开/关闭。有关这会对性能产生重大影响的原因,请参阅。
我通常创建一个我调用的表
,其中只有一条记录(不管它是什么),然后在该表上打开一个数据读取器,该读取器在关闭应用程序之前一直保持打开状态。这可确保数据库锁文件保持在原位,并且不会在每次对数据库执行某些操作时创建/删除。如果对数据库执行大量操作,您会惊讶于这对性能的影响Dummy
- 我不知道为什么,但我想我会写下我自己问题的答案
虽然我没有一个很好的答案来解释为什么第二个读卡器能够成功运行(不丢失数据),但我有一些方法可以让代码运行得更快,这是没有人建议的
先发~
while (myreader.Read())
{
HBPData DataEntity = new HBPData();
DataEntity.NUMBER = (myreader1["NUMBER"].ToString());
DataEntity.RECNO = (myreader1["RECNO"].ToString());
DataEntity.CODE = (myreader1["CODE"].ToString());
DataEntity.DESCRIPTION = (myreader1["ORDD_DESCRIPTION"].ToString());
DataEntity.Quantity = (myreader1["BVORDQTY"].ToString());
listofhbpdata2.Add(DataEntity);
}
myConnection.Close();
myreader1.Close();
myreader.Close();
System.Data.OleDb.OleDbConnection myAccessConnection = new System.Data.OleDb.OleDbConnection();
myAccessConnection.ConnectionString = AccessString;
myAccessConnection.Open();
System.Data.OleDb.OleDbCommand myAccessCommand3 = new System.Data.OleDb.OleDbCommand("delete from AllOrders", myAccessConnection);
myAccessCommand3.ExecuteNonQuery();
for (int i = 0; i < listofhbpdata2.Count(); ++i)
{
System.Data.OleDb.OleDbCommand myAccessCommand2 = new System.Data.OleDb.OleDbCommand("" +
"Insert into AllOrders VALUES('" +
listofhbpdata2[i].NUMBER + "'" + ",'" + listofhbpdata2[i].RECNO.ToString() + "'" +
",'" + listofhbpdata2[i].CODE + "','" + listofhbpdata2[i].DESCRIPTION.Replace("\'", "F") + "'" +
",'" + listofhbpdata2[i].Quantity + "')", myAccessConnection);
myAccessCommand2.ExecuteNonQuery();
}
现在
尽管运行myreader.read似乎速度更快,但我还是用myreader1替换了它,以防它做了些什么
while (myreader1.Read())
{
System.Data.OleDb.OleDbCommand myAccessCommand2 = new System.Data.OleDb.OleDbCommand(
"INSERT INTO AllOrders(OrderNumber,RecordNumber,Code, Description, Quantity) " +
"SELECT TOP 1 '" + (myreader1["NUMBER"].ToString()) + "'" + ",'" + myreader1["RECNO"].ToString() + "'" +
",'" + (myreader1["CODE"].ToString()) + "','" + (myreader1["ORDD_DESCRIPTION"].ToString()).Replace("\'", "F") + "'" +
",'" + (myreader1["BVORDQTY"].ToString()) + "'" +
" from AllOrders " +
"WHERE NOT EXISTS(SELECT TOP 1 OrderNumber FROM AllOrders Where OrderNumber = '" + myreader1["NUMBER"].ToString() +"')", myAccessConnection);
myAccessCommand2.ExecuteNonQuery();
}