Хорошо, сейчас я запускаю этот код для перемещения набора данных из распространяющейся базы данных в базу данных доступа.
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;
}
Теперь ,. Если вы посмотрите внимательно, я опечатал 2-го читателя, он должен читать пока (myreader1.read ()) ... я случайно положил myreader.read ()
К моему удивлению, положив myreader.read (), я успешно запустился ...
это то, что взорвал мой разум, ...
я изменил его на "myreader1.read ()"
и время выполнения кода было почти в два раза ......,
во всяком случае, проверяя базу данных, все данные были там .....
так что, используя здравый смысл, я вроде хорошо понял, он, вероятно, просто выполняет оба набора кода каждый раз, когда запускает первый читатель,
но тогда откуда все данные?
В Sales_Order_Header значительно меньше полей, чем в Sales_Order_Detail. Если он выполняет чтение для первого, разве он не должен заканчиваться в конце таблицы заголовков, а затем останавливаться? так почему все данные там?
В любом случае время выполнения этого кода относительно медленное, у кого-нибудь есть предложения по улучшению моего кода?
Edit: просто чтобы показать, что 2-й читатель не на самом деле возвращает false:
как видите, отладчик вышел из считывателя