2016-03-07 2 views
0

Dans mon formulaire de facturation, j'ai un bouton pour insérer les données de datagridview dans deux bases de données d'accès. i utilisé ce code pour insérer la première base de données:comment puis-je exécuter ce code plus rapidement?

Private Sub inserttotblbill() 
    Dim billcon As OleDbConnection = New OleDbConnection(constr) 
    Dim billcmd As New OleDbCommand 

    For i = 0 To dgv.Rows.Count - 1 
     billcon.Open() 
     billcmd.Connection = billcon 
     billcmd.CommandText = ("insert into tblbill(inum,snum,idate,cname,iname,iprc,iqnt,ipaid,itotal,iuser,itype) " _ 
       & " values('" _ 
       & TextBox1.Text _ 
       & "','" _ 
       & TextBox6.Text _ 
       & "','" _ 
       & TextBox2.Text _ 
       & "','" _ 
       & TextBox3.Text _ 
       & "','" _ 
       & dgv.Rows(i).Cells(0).Value _ 
       & "','" _ 
       & dgv.Rows(i).Cells(1).Value _ 
       & "','" _ 
       & dgv.Rows(i).Cells(2).Value _ 
       & "','" _ 
       & TextBox4.Text _ 
       & "','" _ 
       & dgv.Rows(i).Cells(3).Value _ 
       & "','" _ 
       & username _ 
       & "','" _ 
       & Label2.Text _ 
       & "')") 
     If Not ListBox1.Items.Contains(dgv.Rows(i).Cells(4).Value) Then 
      ListBox1.Items.Add(dgv.Rows(i).Cells(4).Value) 
     End If 
     billcmd.ExecuteNonQuery() 
     billcon.Close() 
    Next i 
    end sub 

i utilisé ce code à insérer à la seconde base de données:

Private Sub inserttoreport() 
    Dim rptcon As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\report.mdb; Jet OLEDB:Database Password=KNOZ1003") 
    Dim rptcmd As New OleDbCommand 

    For k = 0 To dgv.Rows.Count - 1 
     rptcon.Open() 
     rptcmd.Connection = rptcon 
     If dgv.Rows(k).Cells(4).Value = "101" Then 
      rptcmd.CommandText = ("insert into tab1(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13) " _ 
      & " values('" _ 
      & TextBox1.Text _ 
      & "','" _ 
      & TextBox6.Text _ 
      & "','" _ 
      & TextBox2.Text _ 
      & "','" _ 
      & TextBox3.Text _ 
      & "','" _ 
      & dgv.Rows(k).Cells(0).Value _ 
      & "','" _ 
      & dgv.Rows(k).Cells(1).Value _ 
      & "','" _ 
      & dgv.Rows(k).Cells(2).Value _ 
      & "','" _ 
      & TextBox4.Text _ 
      & "','" _ 
      & dgv.Rows(k).Cells(3).Value _ 
      & "','" _ 
      & TextBox5.Text _ 
      & "','" _ 
      & Label2.Text _ 
      & "','" _ 
      & username _ 
      & "','" _ 
      & xxxx _ 
      & "')") 

     ElseIf dgv.Rows(k).Cells(4).Value = "102" Then 
      rptcmd.CommandText = ("insert into tab2(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13) " _ 
      & " values('" _ 
      & TextBox1.Text _ 
      & "','" _ 
      & TextBox6.Text _ 
      & "','" _ 
      & TextBox2.Text _ 
      & "','" _ 
      & TextBox3.Text _ 
      & "','" _ 
      & dgv.Rows(k).Cells(0).Value _ 
      & "','" _ 
      & dgv.Rows(k).Cells(1).Value _ 
      & "','" _ 
      & dgv.Rows(k).Cells(2).Value _ 
      & "','" _ 
      & TextBox4.Text _ 
      & "','" _ 
      & dgv.Rows(k).Cells(3).Value _ 
      & "','" _ 
      & TextBox5.Text _ 
      & "','" _ 
      & Label2.Text _ 
      & "','" _ 
      & username _ 
      & "','" _ 
      & xxxx _ 
      & "')") 
     End If 
     rptcmd.ExecuteNonQuery() 
     rptcon.Close() 
    Next k 
    End Sub 

Mais quand je presse le bouton pour exécuter le code ci-dessus, il faut tandis que comment puis-je le rendre plus rapide?

+0

Cette question ressemble appartenant à CodeReview SE. –

+0

first: Modifiez votre code pour utiliser sqlParameters. Alors vous n'aurez aucun problème avec la chaîne contenant 'et/ou, (et évitez l'injection SQL). Deuxièmement: Veuillez définir "cela prend du temps". Combien de temps pour combien d'enregistrements? Et, ne pas ouvrir la connexion pour chaque enregistrement. Cela coûte beaucoup de temps. – nabuchodonossor

+0

Cela peut être sur le sujet pour l'examen du code, si ** A ** le code fonctionne, ** et B ** il n'est pas hypothétique ou incomplète en aucune façon. Si vous décidez de poster, veuillez lire le centre d'aide avant de poster. – Quill

Répondre

0

Vous pouvez utiliser Multi Thread pour accélérer le code. Task Class

Cette version est également disponible pour vb. Essayez d'utiliser le fil de fond pour la poignée de poids en hauteur.

5

Comme la première chose, faire passer la connexion de la boucle:

billcon.Open() 
billcmd.Connection = billcon 
For i = 0 To dgv.Rows.Count - 1 
    ' ... 
Next 
billcon.Close() 
+0

merci beaucoup –