Получить не пустые строки в первом столбце Excel-листа с помощью OledbCommand - PullRequest
0 голосов
/ 04 февраля 2011

Мое требование - прочитать все строки таблицы Excel в первом столбце, которые не являются пустыми, имеют числовую длину и длину от 15 до 20.

Например:

358218033354974
359473035499561
358218036156129
354022038366247
358218032490035
359473030516492
353210040325399

В этом столбце может быть не числовой заголовок, и могут быть пустые строки.Это может вызвать исключение при импорте их через SqlBulkCopy.Поэтому я хочу предварительно отфильтровать правильные строки через OleDbCommand.

То, что я пробовал до сих пор, следующее (C # также приветствуется):

Using connection As New OleDbConnection(sExcelConnectionString)
   connection.Open()
   Dim schemaTable As DataTable = _
       connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
       New Object() {Nothing, Nothing, Nothing, "TABLE"})
   For Each row As DataRow In schemaTable.Rows
      'loop every Worksheet
      Dim OleDbCmd As OleDbCommand = New OleDbCommand("SELECT * FROM [" & row("TABLE_NAME").ToString & "]", connection)
      Dim dr As OleDbDataReader = OleDbCmd.ExecuteReader()
      Dim bulkCopy As SqlBulkCopy = New SqlBulkCopy(sSqlConnectionString)
      bulkCopy.DestinationTableName = destTable
      bulkCopy.WriteToServer(dr)
   Next
End Using

Но это вызывает исключение, если есть пустыестроки или формат значения неверен.Итак, мой вопрос:

Q: Как ограничить строки OleDbCommand следующим образом:

  • получить только первый столбец каждого листа
  • все значения, которые являются числовыми
  • пропускать пустые значения
  • в идеале только значения длиной от 15 до 20

Редактировать : если бы кто-то мог только показать мне путьКак пропустить пустые строки, я был бы счастлив.Или я должен выбрать все данные?Я надеялся, что это возможно сделать только одним запросом из-за соображений производительности.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

Не понимаю, почему не стоит использовать SQL:

 "SELECT F1 from [Sheet1$] WHERE Len(F1)>14 AND Len(F1)<21 AND IsNumeric(F1)"

Когда в строке подключения для HDR установлено значение NO, имена полей назначаются как F1, F2 и т. Д., Нумерация начинается с первого столбца выбора. Также можно использовать [Sheet1 $ A: A], если вы уверены, что в столбце A есть данные. Обратите внимание, что в схеме таблицы возвращаются как именованные диапазоны, так и листы.

1 голос
/ 04 февраля 2011

Это мое решение, может быть, оно кому-нибудь поможет каким-то образом:

Using connection As New OleDbConnection(sExcelConnectionString)
    connection.Open()
    Dim schemaTable As DataTable = _
        connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
        New Object() {Nothing, Nothing, Nothing, "TABLE"})
    Dim schemaColTable As DataTable = _
        connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, _
        New Object() {Nothing, Nothing, Nothing, Nothing})
    Dim firstWorkSheet As String = schemaTable.Rows(0)("TABLE_NAME").ToString
    Dim firstColumnName As String = schemaColTable.Rows(0)("COLUMN_NAME").ToString
    Dim OleDbSQL As String = String.Format( _
        "SELECT TRIM([{1}]) AS IMEI " & _
        "FROM [{0}] " & _
        "WHERE LEN(TRIM([{1}])) BETWEEN 10 AND 15 " & _
        "ORDER BY [{1}]", firstWorkSheet, firstColumnName)
    Dim OleDbCmd As OleDbCommand = New OleDbCommand(OleDbSQL, connection)
    Using bulkCopy As New SqlBulkCopy(sSqlConnectionString)
         bulkCopy.DestinationTableName = destTable
         bulkCopy.WriteToServer(OleDbCmd.ExecuteReader)
    End Using
End Using

Конвертировать в C #

...