2011-03-10 147 views
0

我想导入一个Excel表格到sql数据库。我能够使用sqlbulkcopy获得它的工作。我现在试图逐行执行。代码工作正常,只有第一行被添加到数据库中。我使用msgbox来确保我遍历所有的excel值。所以我不确定什么是错的。VB导入excel到sql

Imports System.Data 
Imports System.Data.SqlClient 
Imports System.Data.OleDb 
Imports System.IO 
Imports System.Text 

Module Module1 

    Sub Main() 

     Dim strSql As String = "" 
     strSQL = "INSERT INTO tblExcel (Name, Location) VALUES (@Name, @Location)" 

     'SQL Server Connection String 
     Dim cn As New SqlClient.SqlConnection 
     cn.ConnectionString = "Data Source=MyDB;Initial Catalog=DB123;Integrated Security=True" 

     Dim cmd As New SqlClient.SqlCommand 
     cmd.Connection = cn 
     cmd.CommandType = CommandType.Text 
     cmd.CommandText = strSql 

     cn.Open() 

     'Connection String to Excel Workbook 
     Dim excelConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Documents and Settings\cl3j\Desktop\ExcelTest.xlsx;Extended Properties=""Excel 12.0;HDR=YES;""" 

     ' Create Connection to Excel Workbook 
     Using connection As New System.Data.OleDb.OleDbConnection(excelConnectionString) 

      'List columns you need from the Excel file 
      Dim command As New System.Data.OleDb.OleDbCommand("Select [Name],[Location] FROM [Sheet1$]", connection) 
      connection.Open() 

      ' Create DbDataReader to Data Worksheet 
      Using dr As System.Data.OleDb.OleDbDataReader = command.ExecuteReader() 

       If dr.HasRows() then 
        While dr.Read() 
         cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = Convert.ToString(dr.Item("Name")) 
         cmd.Parameters.Add("@Location", SqlDbType.VarChar).Value = Convert.ToString(dr.Item("Location")) 
         cmd.ExecuteScalar() 
        End While 
       End If 

      End Using 

     End Using 

     cn.Close() 
     cn = Nothing 

    End Sub 

End Module 

回答

0

发现问题。需要将cmd行移动到dr.hasrows循环中。看起来像这样:

   If dr.HasRows() then 
        While dr.Read() 
         Dim cmd As New SqlClient.SqlCommand 
         cmd.Connection = cn 
         cmd.CommandType = CommandType.Text 
         cmd.CommandText = strSql 

         cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = Convert.ToString(dr.Item("Name")) 
         cmd.Parameters.Add("@Location", SqlDbType.VarChar).Value = Convert.ToString(dr.Item("Location")) 
         cmd.ExecuteScalar() 
        End While 
       End If