【问题标题】:oledb, visual fox pro and c#oledb、visual fox pro 和 c#
【发布时间】:2012-08-01 22:35:26
【问题描述】:

我有数千行的可视化 fox pro 数据库。我正在使用 oledb 从 fox pro 获取数据并将其导出(在进行一些计算和格式化之后)到 sql server。我使用数据集一次填充 2-3 个数据表(相关表)。

第一个问题是内存使用非常高,因为数据集很大。我想减少内存占用。对此有任何建议。

所以我决定一次获取几行。如何使用 oledb 命令获取行,以便我可以获取例如 1-20 和 20-40 等

【问题讨论】:

    标签: c# oledb visual-foxpro


    【解决方案1】:

    根据所有 cmets 和 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;
         } 
    }
    

    【讨论】:

    • 但是有一个小问题。当有内部连接时,recno() 似乎不起作用。
    • @arjun 您能否提供一个示例说明您如何尝试在内部连接中使用 RECNO()?
    【解决方案2】:
    string queryString = "SELECT OrderID, CustomerID FROM Orders WHERE ORDERID >= @StartOrderID AND ORDERID <= @EndOrderID";
    
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            OleDbCommand command = new OleDbCommand(queryString, connection);
            command.Parameters.Add(new OleDbParameter("@StartOrderID", "PASS THE VALUE HERE"));
            command.Parameters.Add(new OleDbParameter("@EndOrderID", "PASS THE VALUE HERE"));
    
            connection.Open();
            OleDbDataReader reader = command.ExecuteReader();
    
            while (reader.Read())
            {
    //Retrieve records here
            }
            reader.Close();
        }
    

    【讨论】:

    • 我的大部分表都没有主键ID。我们能不能像sql server一样在查询中使用row_number()之类的东西。
    • @arjun 在你的情况下是的,你可以
    • @arjun 我有事请等 15 分钟
    • @arjun 你需要修改你的 sql 查询来使用 ROW_NUM 看看这里的例子msdn.microsoft.com/en-us/library/ms186734.aspx
    • 我说的是visual fox pro而不是sql server
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    相关资源
    最近更新 更多