2011-02-04 93 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]。请注意,表格模式中都返回了两个命名的范围和工作表。