我的要求是读取第一列中非空的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
但是如果存在空行或者值的格式不正确,则抛出异常。所以我的问题是:
问:如何将OleDbCommand的行限制为:
编辑:如果有人只能告诉我如何跳过空行,我会很高兴。或者我必须选择整个数据表?我希望由于性能原因,只能通过一个查询来实现这一点。
提前谢谢。
答案 0 :(得分: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
答案 1 :(得分:1)
我不明白为什么你不应该使用SQL:
"SELECT F1 from [Sheet1$] WHERE Len(F1)>14 AND Len(F1)<21 AND IsNumeric(F1)"
当连接字符串中的HDR设置为NO时,字段名称将分配为F1,F2等,从选择的第一列开始编号。如果您确定A列中有数据,也可以使用[Sheet1 $ A:A]。请注意,表格架构中都会返回命名范围和工作表。