November 25, 2014
Hot Topics:

Managed Extensions: Using the .NET OLE DB Classes to Read Text Files

  • September 28, 2004
  • By Tom Archer
  • Send Email »
  • More Articles »

Demo Application

This article includes a simple demo that reads and displays the text from a small text file. Here's a screen shot of that application:

Now, here's the actual code from the function in the application that uses much of what you've read in this article (with the addition of some basic error-handling and clean-up):
void CReadingCsvFilesWithOledbDlg::DisplayCsvFile()
{
#pragma push_macro("new")
#undef new
  CWaitCursor wc;

  m_lstCsvData.DeleteAllItems();
  DeleteAllColumns(m_lstCsvData);

  OleDbConnection* connection = NULL;
  OleDbDataReader* reader = NULL;
  try
  {
    StringBuilder* connString = new StringBuilder();

    connString->Append(S"Provider=Microsoft.Jet.OLEDB.4.0;");
    connString->AppendFormat(S"Data Source={0};", Path::GetDirectoryName(m_strFileName));
    connString->Append(S"Extended Properties='text;HDR=No;FMT=TabDelimited'");

    connection = new OleDbConnection(connString->ToString());
    connection->Open();

    CString strSelect;
    strSelect.Format(_T("SELECT * FROM [%s]"), Path::GetFileName(m_strFileName));
    OleDbCommand* command = new OleDbCommand(strSelect, connection);

    reader = command->ExecuteReader();
    int iCurrRow = 0;
    while (reader->Read()) 
    {
      int idx;
      for (int iCurrCol = 0; iCurrCol < reader->FieldCount; iCurrCol++) 
      {
        if (0 == iCurrRow)
        {
          // assumes a schema.ini file
          m_lstCsvData.InsertColumn(iCurrCol, (CString)reader->GetName(iCurrCol));
        }

        if (0 == iCurrCol) 
        {
          idx = m_lstCsvData.InsertItem(iCurrRow, (CString)(reader->GetValue(iCurrCol)->ToString()));
        }
        else 
          m_lstCsvData.SetItemText(idx, iCurrCol, (CString)(reader->GetValue(iCurrCol)->ToString()));
      }
      iCurrRow++;
    }
    SizeAllColumns(m_lstCsvData);
  }
  catch(Exception* e)
  {
    m_strFileName = _T("");
    UpdateData(FALSE);

    AfxMessageBox((CString)e->Message);
  }
  __finally
  {
    if (NULL != reader) reader->Close();
    if (NULL != connection) connection->Close();
  }
#pragma pop_macro("new")
}
After looking at the screen shot and the following code, you should be able to surmise that I have a schema.ini file that specifies the names of the columns that are displayed in the listview control.

Using the Registry

If you do not wish to use a schema.ini file—for example, if you wanted a given machine to always handle text files the same way without having to maintain a bunch of separate schema.ini files and without having to hard-code the Extended Properties parameter to each OLE DB connection string—you can control how the Microsoft Text Driver works with your text files by modifying the following registry key:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text\Format

Since these values are to be used in lieu of having a schema.ini file, you can find the valid values on the Microsoft Web site.

The following figure shows what the registry key looks like on my development machine:



Click here for larger image

Download the Code

To download the accompanying source code for this article, click here.

About the Author

The founder of the Archer Consulting Group (ACG), Tom Archer has been the project lead on three award-winning applications and is a best-selling author of 10 programming books as well as countless magazine and online articles.





Page 2 of 2



Comment and Contribute

 


(Maximum characters: 1200). You have characters left.

 

 


Enterprise Development Update

Don't miss an article. Subscribe to our newsletter below.

Sitemap | Contact Us

Rocket Fuel