2017-08-01 132 views
0

我已经编写了一些代码来将数据从Excel文件导入到Access数据库中。代码首先选择一个目录,然后单击一个按钮导入。将Excel文件导入到Access数据库中

这是我要导入到数据库中的字段:

dataid - ID 

name - NAME 

company - COMPANY 

phone - PHONE NUMBER 

Add1 - ADDRESS 1 

Add2 - ADDRESS 2 

Add3 - ADDRESS 3 

pcode - POSCODE 

city - CITY NAME 

state - STATE 

remark - REMARK 

ShipperRef - REFFERENCE 

可能有多个行这是我无法预测。

代码:

Private Sub TransferExcelFile2Database_Click(sender As System.Object, e As System.EventArgs) Handles TransferExcelFile2Database.Click 

      Try 

      Dim connectexcelstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & Text1.Text & "';" & _ 
       "Extended Properties=""Excel 8.0;HDR=yes""" 
      Dim con As OleDbConnection = New OleDbConnection(connectexcelstring) 

      con.Open() 

      Dim query As String = "Select * from [Sheet1$]" 

      Dim excelcmd As OleDbCommand = New OleDbCommand(query, con) 


      dt.Load(excelcmd.ExecuteReader()) 

      If dt.Rows.Count > 0 Then 
       Dim conn As OleDbConnection = New OleDbConnection(constring) 
       Dim cmdAccess As New OleDbCommand 

       Dim dataid As New OleDbParameter With {.DbType = DbType.Int32, .ParameterName = "dataid"} 
       Dim name As New OleDbParameter With {.DbType = DbType.String, .ParameterName = "name"} 
       Dim company As New OleDbParameter With {.DbType = DbType.String, .ParameterName = "company"} 
       Dim phone As New OleDbParameter With {.DbType = DbType.String, .ParameterName = "phone"} 
       Dim Add1 As New OleDbParameter With {.DbType = DbType.String, .ParameterName = "Add1"} 
       Dim Add2 As New OleDbParameter With {.DbType = DbType.String, .ParameterName = "Add2"} 
       Dim Add3 As New OleDbParameter With {.DbType = DbType.String, .ParameterName = "Add3"} 
       Dim pcode As New OleDbParameter With {.DbType = DbType.String, .ParameterName = "pcode"} 
       Dim City As New OleDbParameter With {.DbType = DbType.String, .ParameterName = "City"} 
       Dim state As New OleDbParameter With {.DbType = DbType.String, .ParameterName = "state"} 
       Dim remark As New OleDbParameter With {.DbType = DbType.String, .ParameterName = "remark"} 
       Dim ShipperRef As New OleDbParameter With {.DbType = DbType.String, .ParameterName = "ShipperRef"} 

       cmdAccess.CommandText = "INSERT INTO TblProject VALUE (@dataid,@name,@company,@phone,@Add1,@Add2,@Add3,@pcode,@City,@state,@remark,@ShipperRef)" 

       conn.Open() 

       Dim Col1Value As Integer 
       Dim Result As Integer 
       For Each row As DataRow In dt.Rows 
        If Integer.TryParse(row("dataid").ToString, Col1Value) Then 
         cmdAccess.Parameters("dataid").Value = row.Item("dataid") 
         cmdAccess.Parameters("name").Value = row.Item("name") 
         cmdAccess.Parameters("company").Value = row.Item("company") 
         cmdAccess.Parameters("phone").Value = row.Item("phone") 
         cmdAccess.Parameters("Add1").Value = row.Item("Add1") 
         cmdAccess.Parameters("Add2").Value = row.Item("Add2") 
         cmdAccess.Parameters("Add3").Value = row.Item("Add3") 
         cmdAccess.Parameters("pcode").Value = row.Item("pcode") 
         cmdAccess.Parameters("city").Value = row.Item("city") 
         cmdAccess.Parameters("state").Value = row.Item("state") 
         cmdAccess.Parameters("remark").Value = row.Item("remark") 
         cmdAccess.Parameters("ShipperRef").Value = row.Item("ShipperRef") 

         Result = cmdAccess.ExecuteNonQuery() 
         If Result = 0 Then 
          MsgBox("Mission to insert failed") 
         End If 
        Else 
         ' 
         ' Value does not represent a valid integer. 
         ' You need to decide how to handle this i.e. 
         ' Abort insert as done here or place a default value in. 
         ' 
        End If 
       Next 

      End If 


     Catch ex As Exception 

      MessageBox.Show(ex.Message) 
     End Try 

    End Sub 

我想在Excel中的数据导入到Access数据库,但我收到此错误:

回答

1

很高兴见到你至少尝试使用参数。我会做的第一件事是在前面加上@到您的参数名称:

Dim dataid As New OleDbParameter With {.DbType = DbType.Int32, .ParameterName = "@dataid"} 

我注意到接下来的事情是,你还没有加入参数,您OleDbCommand:最后的Insert声明不

cmd.Parameters.Add(dataid) 

看起来很正确。您应该在表中指定列名以及要插入的值。也改变VALUEVALUES

"INSERT INTO TblProject (field1, field2, field3...) VALUES (@dataid, @name ,@company...)" 

你会改变field1field2field3到右列的名字,当然,确保所有的列名已被指定。

OleDbCommand重要的是要注意,它不是参数的名称,而是它们声明的顺序很重要。

继续上我也会考虑实施Using

Sometimes your code requires an unmanaged resource, such as a file handle, a COM wrapper, or a SQL connection. A Using block guarantees the disposal of one or more such resources when your code is finished with them. This makes them available for other code to use.

下面是一些示例代码。请注意,我用?作为我的参数占位符:

Using con As New OleDbConnection(connectexcelstring), 
     cmd As New OleDbCommand("INSERT INTO TblProject (field1, field2, field3...) VALUES (?, ?, ?...)", con) 

    'You could also add the parameters to the command at this point 
    cmd.Parameters.Add("@dataid", OleDbType.Integer) 
    cmd.Parameters.Add("@name", OleDbType.VarChar) 
    ... 

    For Each row As DataRow In dt.Rows 
     Dim Col1Value As Integer 
     If Integer.TryParse(row("dataid").ToString(), Col1Value) Then 
      cmd.Parameters("@dataid").Value = Col1Value 'If Integer.TryParse is successful then "Col1Value" will also contain the value of "row("dataid")" 
      cmd.Parameters("@name").Value = row.Item("name").ToString() 
      ... 

      If cmd.ExecuteNonQuery() = 0 Then 
       MessageBox.Show("Mission to insert failed") 
      End If 

     Else 
      ' Value does not represent a valid integer. 
      ' You need to decide how to handle this i.e. 
      ' Abort insert as done here or place a default value in. 
     End If 

    Next 

End Using 

就像我说的,这只是示例代码,所以你必须填写你的领域,其余参数的空白,但是这应该让你回到你的办法。

相关问题