oledb, visual fox pro и c#

У меня есть база данных Visual Fox Pro с тысячами строк. Я использую oledb для извлечения данных из fox pro и экспорта (после некоторых расчетов и форматирования) их на сервер sql. Я использовал набор данных для заполнения 2-3 таблиц данных (связанных таблиц) за раз.

Первая проблема заключается в том, что использование памяти очень велико, потому что набор данных огромен. Я хочу уменьшить объем памяти. Любое предложение для этого.

Поэтому я решил получить несколько строк за раз. Как мне получить строки с помощью команды oledb, чтобы я мог получить, например, 1-20, а затем 20-40 и т. д.


person arjun    schedule 31.07.2012    source источник


Ответы (2)


Основываясь на всех комментариях и коде HatSoft, вот то, что я думаю, вы ищете. Это псевдокод, который означает, что он не будет компилироваться, но должен дать вам хорошее представление о том, что делать дальше.

int NumberOfRecordsToRetrieve = 10000;
int StartRecordNumber = 1;
bool EndOfFile = false;

 string queryString = "SELECT OrderID, CustomerID FROM Orders WHERE RECNO() BETWEEN @StartRecordNumber AND @EndRecordNumber"; 

While (!EndOfFile)
{
     using (OleDbConnection connection = new OleDbConnection(connectionString)) 
     { 
         OleDbCommand command = new OleDbCommand(queryString, connection); 
         command.Parameters.Add(new OleDbParameter("@StartRecordNumber", StartRecordNumber)); 
         command.Parameters.Add(new OleDbParameter("@EndRecordNumber", StartRecordNumber + NumberOfRecordsToRetrieve)); 

         connection.Open(); 
         OleDbDataReader reader = command.ExecuteReader(); 

          EndOfFile = true;
          while (reader.Read()) 
          { 
               EndOfFile = false

               //Retrieve records here and do whatever process you wish to do
           } 
           reader.Close(); 

           StartRecordNumber += NumberOfRecordsToRetrieve;
     } 
}
person Gene S    schedule 01.08.2012
comment
Но есть небольшая проблема. Когда есть внутренние соединения, recno(), похоже, не работает. - person arjun; 03.08.2012
comment
@arjun Не могли бы вы привести пример того, как вы пытаетесь использовать RECNO() во внутреннем соединении? - person Gene S; 22.08.2012

person    schedule
comment
большинство моих таблиц не имеют идентификаторов первичного ключа. Можем ли мы не использовать что-то вроде row_number() в запросе, например, на сервере sql. - person arjun; 01.08.2012
comment
@arjun в твоем случае да, можешь - person HatSoft; 01.08.2012
comment
@arjun Я чем-то занят, пожалуйста, подожди 15 минут - person HatSoft; 01.08.2012
comment
@arjun вам нужно будет изменить свой sql-запрос, чтобы использовать ROW_NUM, посмотрите пример здесь msdn.microsoft.com/en-us/library/ms186734.aspx - person HatSoft; 01.08.2012
comment
Я говорил о Visual Fox Pro, а не о SQL-сервере. - person arjun; 01.08.2012
comment
Visual FoxPro имеет функцию RECNO(), которую вы можете использовать в SQL-запросе для получения определенных номеров записей. - person Gene S; 01.08.2012
comment
@GeneS Но RECNO() не работает при использовании с соединениями. Есть ли другие варианты? - person arjun; 04.08.2012
comment
@GeneS Но recno() не работает при использовании с соединениями. Есть ли другие решения для этого? - person arjun; 06.08.2012
comment
Не могли бы вы привести пример в своем вопросе, чтобы я мог понять, о чем вы говорите? - person Gene S; 22.08.2012
comment
@GeneS OP - это Арджун, а не я, пожалуйста, спросите его, также он уже принял ответ, так почему вы хотите спросить его сейчас, после столь долгого времени? - person HatSoft; 22.08.2012
comment
@HatSoft Извините за этот HatSoft. Он принял ответ, но затем задал вопрос о проблемах с INNER JOIN. Он задавал вопрос в этом разделе комментариев, и я не обратил внимания, где был задан его вопрос. Я задам свой вопрос в разделе комментариев под принятым ответом. - person Gene S; 22.08.2012