使用 sql 2008 r2、vb.net 2010、excel 2010、xls 模式下的文件
我想通过 vb.net 以编程方式将 excel 电子表格导入 sql 2010。我有 2 个版本的电子表格。第一个是我用于 SQL 导入向导导入表的原始表(导入向导中显示的工作表名称是 Dictionary$)。
第二个版本是从 sql 导出到 excel(因为我做了很多手动更改)。
我可以看到文件之间的明显差异是:
- 导入向导中的工作表名称在字典后没有 $。
- 电子表格中的每个单元格都有一个'(单元格开头的单引号')。
现在到问题的问题。以编程方式执行此操作并使用第二个版本(导出)将毫无问题地导入所有预先存在的行,但如果我将行添加到电子表格中,则导入将看不到这些行。
如果我尝试以编程方式导入原始电子表格,则不会导入任何行,因为它在 excel 文件中找不到表字典(字典在向导的末尾显示 $)。
我正在寻找的解决方案是:
- 我需要在 excel 文件中启用什么以允许以编程方式导入 SQL 吗?
- 我可以对从 sql 导出的文件做些什么,以便如果我添加行,它可以在以后需要时重新导入?
代码如下,请注意以下代码适用于电子表格的第二个版本,并且使用 SQL 导出向导生成它。此外,如果我将行添加到电子表格的底部,这些行将不会以编程方式导入。
Private Shared Sub ImportDictionary()
Dim curFile As String = "dictionary.xls"
Dim fullPath As String = Path.GetFullPath(curFile)
Dim Excelconnection = New OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; data source=" + fullPath + "; Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'")
Dim myConnection As New SqlConnection(SQLdbString)
Try
myConnection.Open()
Excelconnection.Open()
Dim mySelectQuery As String = "SELECT * from dictionary"
Dim myCommand2 As New OleDbCommand(mySelectQuery, Excelconnection)
Dim myReader2 As OleDbDataReader
myReader2 = myCommand2.ExecuteReader()
While myReader2.Read()
Dim myCommand As New SqlCommand
Try
myCommand.Connection = myConnection
MyQueue.Enqueue(String.Format("{0} {1} {2} {3} {4}", myReader2.GetString(0), myReader2.GetString(1), myReader2.GetString(2), myReader2.GetString(3), myReader2.GetString(4)))
myCommand.Parameters.Add("@G0", SqlDbType.VarChar).Value = myReader2.GetString(0)
myCommand.Parameters.Add("@G1", SqlDbType.VarChar).Value = myReader2.GetString(1)
myCommand.Parameters.Add("@G2", SqlDbType.VarChar).Value = myReader2.GetString(2)
myCommand.Parameters.Add("@G3", SqlDbType.VarChar).Value = myReader2.GetString(3)
myCommand.Parameters.Add("@G4", SqlDbType.VarChar).Value = myReader2.GetString(4)
myCommand.CommandText = "INSERT INTO dictionary values(@G0,@G1,@G2,@G3,@G4)"
myCommand.ExecuteNonQuery()
Catch e As Exception
Console.WriteLine(e.ToString())
Finally
myCommand.Dispose()
End Try
End While
Catch e As Exception
Console.WriteLine(e.ToString())
Finally
myConnection.Dispose()
End Try
Excelconnection.Dispose()
End Sub