2015-11-19 119 views
0

我遇到了使用excel工作表更新sql表格的問題。事實是,我正在處理這個小型項目,用戶首先可以通過單擊vb.net應用程序中的按鈕導出或打印帶有StudentNumber,SubjectID,ClassScore,ExamScore的班級列表來優化工作表,然後編輯工作表通過填寫ClassScore和ExamScore,然後通過vb.net將表單上傳回sql。 問題是如何檢查當前的StudentNumber或行是否存在於sql表中,然後更新表或者插入新行。 這是使用SQLBulk複製,只剩下更新SQL表中的所有在vb.net如何使用Excel中的數據從vb.net更新sql表格

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
Dim ofd As New OpenFileDialog 

    If ofd.ShowDialog() <> System.Windows.Forms.DialogResult.OK Then Exit Sub 
    ' Dim dgv As System.Windows.Forms.DataGridView 
    With ofd 
     .Filter = "Excel files(*.xls)|*.xls|All files (*.*)|*.*" 
     .FilterIndex = 1 
     .Title = "Import data from Excel file" 
    End With 
    Dim nme As String = ofd.FileName 
      Import(nme, dgv) 

End Sub 
Public Shared Function Import(ByVal FileName As String, ByVal dgv As DataGridView) As Boolean 
    Dim MyConnection As System.Data.OleDb.OleDbConnection 
    Dim DtSet As System.Data.DataSet 
    Dim MyCommand As System.Data.OleDb.OleDbDataAdapter 
    MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties=Excel 12.0 Xml;") 
    'MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\vb.net-informations.xls';Extended Properties=Excel 8.0;") 
    MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection) 
    MyCommand.TableMappings.Add("Table", "Scores") 
    DtSet = New System.Data.DataSet 
    MyCommand.Fill(DtSet) 
    dgv.DataSource = DtSet.Tables(0) 
    MyConnection.Close() 


    Dim expr As String = "SELECT * FROM [Sheet1$]" 


    Dim SQLconn As New SqlConnection() 
    Dim ConnString As String = "Data Source=xxxx-PC;Initial Catalog=TryExcel;Persist Security Info=True;User ID=xx;Password=xxxx" 
    Dim objCmdSelect As OleDbCommand = New OleDbCommand(expr, MyConnection) 
    Dim objDR As OleDbDataReader 

    SQLconn.ConnectionString = ConnString 

    Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(ConnString) 
     bulkCopy.DestinationTableName = "Scores" 

     MyConnection.Open() 
     objDR = objCmdSelect.ExecuteReader 
     bulkCopy.WriteToServer(objDR) 
     objDR.Close() 
     SQLconn.Close() 

    End Using 
    Return True 
End Function 

Private Shared Function safefilename() As String 
    Throw New NotImplementedException 
End Function 

回答

0
Private Sub Upload_Workbook() 

     Dim t As New Thread(New ThreadStart(Sub() 
               dt = New DataTable 

               dt = New DataTable("Table_Name") 
               dt.Columns.Add("Column_1") 
               dt.Columns.Add("Column_2) 
               dt.Columns.Add("Column_3") 
               dt.Columns.Add("Column_4") 
               dt.Columns.Add("Column_5") 
               dt.Columns.Add("Column_6") 
               dt.Columns.Add("Column_7") 

               ds = New DataSet 
               ds.Tables.Add(dt) 

               Dim i As Integer 

               For i = 2 To (Cells(1, 11).Text) 

                dr = dt.NewRow 
                dr(0) = Cells(i, 1).Text 
                dr(1) = Cells(i, 2).Text 
                dr(2) = Cells(i, 3).Text 
                dr(3) = Cells(i, 4).Text 
                dr(4) = Cells(i, 5).Text 
                dr(5) = Cells(i, 6).Text 
                dr(6) = Cells(i, 7).Text 

                dt.Rows.Add(dr) 
               Next i 

               trans = con.BeginTransaction 
               Try 
                Dim row As Integer 

                While (row < dt.Rows.Count) 

                 Dim cmd As New SqlCommand("Sheet1_Upload", con, trans) 

                 cmd.CommandType = CommandType.StoredProcedure 

                 cmd.Parameters.AddWithValue("Column_1", dt.Rows(row).ItemArray(0)) 
                 cmd.Parameters.AddWithValue("Column_2", dt.Rows(row).ItemArray(1)) 
                 cmd.Parameters.AddWithValue("Column_3", dt.Rows(row).ItemArray(2)) 
                 cmd.Parameters.AddWithValue("Column_4", dt.Rows(row).ItemArray(3)) 
                 cmd.Parameters.AddWithValue("Column_5", dt.Rows(row).ItemArray(4)) 
                 cmd.Parameters.AddWithValue("Column_6", dt.Rows(row).ItemArray(5)) 
                 cmd.Parameters.AddWithValue("Column_7", dt.Rows(row).ItemArray(6)) 
                 cmd.ExecuteNonQuery() 

                 row = row + 1 

                End While 

                trans.Commit() 

               Catch ex As Exception 
                MsgBox(ex.Message) 
                trans.Rollback() 
               End Try 

              End Sub)) 

     t.Start() 
End Sub 

'' ''' 'SQL存儲過程' '' '' ''

我的代碼(50),@ Column_1 varchar(50),@ Column_3 varchar(50),@ Column_4 varchar(50),@ Column_5 varchar(50),@ Column_6 varchar(50)) as(

創建過程Sheet1_Upload begin

Insert INTO Table_Name(Column_1,Column_2,Column_3,Column_4 ,Column_5,Column_6)VALUES(@ COLUMN_1,@ COLUMN_2,@ Column_3,@ Column_4,@ Column_5,@ Column_6) 結束

請創建Visual Basic的這個項目>辦公室/共享點>的Excel 2013工作簿。 File Path Image 然後使用另一個程序打開工作簿。

oXL = CreateObject("Excel.Application") 
    oXL.Visible = False 
    oWB = oXL.Workbooks.Open("D:\workbook.xlsm") 
    oWB.Activate() 
    oWB.RunAutoMacros(Excel.XlRunAutoMacro.xlAutoOpen) 

使用Excel Auto_Open宏和片改變的事件在VB.net。

+0

好吧,不太確定我是否能得到它,呃我會仔細看看它,並會給你隨我所得。非常感謝 –

+0

歡迎好友.. –

相關問題