2011-02-04 90 views
0

我的要求是讀取第一列中非空的Excel表的所有行,是數字並且長度介於15和20之間。通過OledbCommand在Excel表的第一列中檢索非空行

例如:

358218033354974 
359473035499561 
358218036156129 
354022038366247 
358218032490035 
359473030516492 
040325399 

此列可能有一個非數字的標題,並且可能有空行。這會通過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之間的值

編輯:如果有人能告訴我如何跳過空行,我會很高興。還是我必須選擇整個數據表?由於性能原因,我希望只有一個查詢才能做到這一點。

預先感謝您。

+0

我面臨類似的問題,我解決它使用從數據表中刪除空行。 – Anuraj 2011-02-04 09:44:42

回答

1

這是我的解決方案,也許它會幫助別人以某種方式:

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 

Convert to C#

0

我不明白爲什麼你不應該使用SQL:

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

當HDR在連接字符串中設置爲NO,字段名稱分配爲F1,F2等,從選擇的第一列開始編號。如果您確定列A中有數據,也可以使用[Sheet1 $ A:A]。請注意,表格模式中都返回了兩個命名的範圍和工作表。