在连接到 sqlserver 期间 System.Windows.Forms.dll 中发生类型 'System.StackOverflowException' 的未处理异常

An unhandled exception of type 'System.StackOverflowException' occurred in System.Windows.Forms.dll during connect to sqlserver

需要有关此错误的帮助,无法找出问题所在..

` 进口 System.Windows.Forms 进口 System.Data.Sql 导入 System.Data.Sql 客户端 进口 System.Configuration

Public Class Celclass

    Dim conn As SqlConnection
    Dim cmd, cmd1, cmd2, cmd3 As SqlCommand
    Dim da, da1, da2, da3 As SqlDataAdapter
    Dim ds, ds1, ds2, ds3 As DataSet
    Dim dt, dt1, dt2, dt3 As DataTable
    Dim dr, dr1, dr2, dr3 As DataRow
    Dim scb, scb1, scb2, scb3 As SqlCommandBuilder

Public Sub conn1(ByVal sql As String, ByVal dsname As String)
    conn = New SqlConnection()
    conn.ConnectionString = ConfigurationManager.AppSettings("ConnectionString")
    cmd = New SqlCommand(sql, conn)
    da = New SqlDataAdapter
    da.SelectCommand = cmd
    ds = New DataSet
    da.Fill(ds, dsname)
End Sub

Public Sub conn2(ByVal sql As String, ByVal dsname As String)
    conn = New SqlConnection()
    conn.ConnectionString = ConfigurationManager.AppSettings("ConnectionString")
    cmd1 = New SqlCommand(sql, conn)
    da1 = New SqlDataAdapter
    da1.SelectCommand = cmd1
    ds1 = New DataSet
    da1.Fill(ds1, dsname)
End Sub

Public Sub conn3(ByVal sql As String, ByVal dsname As String)
    conn = New SqlConnection()
    conn.ConnectionString = ConfigurationManager.AppSettings("ConnectionString")
    cmd2 = New SqlCommand(sql, conn)
    da2 = New SqlDataAdapter
    da2.SelectCommand = cmd2
    ds2 = New DataSet
    da2.Fill(ds2, dsname)
End Sub

Public Sub conn4(ByVal sql As String, ByVal dsname As String)
    conn = New SqlConnection()
    conn.ConnectionString = ConfigurationManager.AppSettings("ConnectionString")
    cmd3 = New SqlCommand(sql, conn)
    da3 = New SqlDataAdapter
    da3.SelectCommand = cmd3
    ds3 = New DataSet
    da3.Fill(ds3, dsname)
End Sub

Public Sub clear()
    txtPart.ReadOnly = True
    txtMpn.ReadOnly = True
    txtdc.ReadOnly = True
    txtQty.ReadOnly = True
    txtPO.ReadOnly = True
    cmbCoo.SelectedIndex = -1
    cmbCoo.Text = ""
    txtPart.Text = ""
    txtMpn.Text = ""
    txtBatch.Text = ""
    txtdc.Text = ""
    txtQty.Text = ""
    txtPO.Text = ""
    chk.Checked = False
End Sub

Private Sub txtJob_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtJob.TextChanged
    txtJob.Text = Trim(txtJob.Text)
    conn1("select p.qty, p.lot, p.mpn, p.dc1, p.dc2, p.dc3, s.raw, s.so_raw, s.prog, s.po, p.job_no from prod_pt p inner join pln_so s on p.so_id=s.so_id where p.job_no='" & txtJob.Text & "'", "pt")
    If ds.Tables("pt").Rows.Count > 0 Then
        dr = ds.Tables("pt").Rows(0)
        If dr("po") = "" Then
            MsgBox("No PO Key in!")
            txtJob.Text = ""
            Exit Sub
        End If
        Dim fulldc As String = ""
        fulldc = fulldc + dr("dc1")
        If UCase(dr("dc2")) <> "NA" And dr("dc2") <> "" Then
            fulldc = fulldc + "/" + dr("dc2")
        End If
        If UCase(dr("dc3")) <> "NA" And dr("dc3") <> "" Then
            fulldc = fulldc + "/" + dr("dc3")
        End If
        txtJob.Text = UCase(dr("job_no"))
        If dr("prog").Equals(System.DBNull.Value) = False Then
            If dr("prog") <> "" Then
                txtPart.Text = UCase(dr("prog"))
            Else
                txtPart.Text = UCase(dr("so_raw"))
            End If
        Else
            txtPart.Text = UCase(dr("so_raw"))
        End If
        txtMpn.Text = UCase(dr("mpn"))
        txtdc.Text = fulldc
        txtQty.Text = dr("qty")
        txtPO.Text = UCase(dr("po"))
        txtBatch.Focus()
    End If
End Sub

Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
    Dim m As Form
    m = Main
    Me.Close()
    m.Show()
End Sub

Private Sub btnEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEdit.Click
    txtPart.ReadOnly = False
    txtMpn.ReadOnly = False
    txtdc.ReadOnly = False
    txtQty.ReadOnly = False
    txtPO.ReadOnly = False
End Sub

Public Sub insert(ByVal qty As String)
    Dim x As Integer
    Dim coo As String
    If chk.Checked = True Then
        x = 2
    Else
        x = 1
    End If

    If cmbCoo.Text = "GERMANY" Then
        coo = "DE"
    ElseIf cmbCoo.Text = "JAPAN" Then
        coo = "JP"
    ElseIf cmbCoo.Text = "MALAYSIA" Then
        coo = "MY"
    ElseIf cmbCoo.Text = "PAPUA NEW GUINEA" Then
        coo = "PG"
    ElseIf cmbCoo.Text = "SINGAPORE" Then
        coo = "SG"
    ElseIf cmbCoo.Text = "UNITED STATES" Then
        coo = "US"
    Else
        coo = cmbCoo.Text
    End If

    For i As Integer = 1 To x
        conn4("select * from label_celclass", "insert")
        dt3 = ds3.Tables("insert")
        dr3 = dt3.NewRow
        dr3("part") = txtPart.Text
        dr3("mpn") = txtMpn.Text
        dr3("batch") = txtBatch.Text
        dr3("dc") = txtdc.Text
        dr3("qty") = qty
        dr3("po") = txtPO.Text
        dr3("coo") = coo
        dt3.Rows.Add(dr3)
        scb3 = New SqlCommandBuilder(da3)
        da3.InsertCommand = scb3.GetInsertCommand
        da3.Update(ds3, "insert")
        ds3.AcceptChanges()
    Next
End Sub

Public Sub delete()
    Dim con As SqlConnection = New SqlConnection(ConfigurationManager.AppSettings("ConnectionString"))
    Dim str As String = "DELETE FROM label_celclass"
    Dim cmd As SqlCommand = New SqlCommand(str, con)
    con.Open()
    cmd.ExecuteNonQuery()
    con.Close()
End Sub

Public Sub printing()
    conn1("select * from label_celclass", "others")
    Dim retval
    retval = Shell(Config.BarTenderFile & " /F=C:\barcode\cele.btw /P /X", vbMinimizedFocus)
    'telford
    'retval = Shell("C:\Program Files\Seagull\BarTender 6.20\Enterprise\bartend.exe /F=C:\barcode\cele.btw /P /X", vbMinimizedFocus)
    'cele
    'retval = Shell("C:\Program Files\Seagull\BarTender.75\bartend.exe /F=C:\barcode\cele.btw /P /X", vbMinimizedFocus)
    'jabil
    'retval = Shell("C:\Program Files\Seagull\BarTender.00\bartend.exe /F=C:\barcode\cele.btw /P /X", vbMinimizedFocus)
End Sub

Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
    If txtBatch.Text = "" Then
        MsgBox("Please key in Batch No")
        txtBatch.Focus()
        Exit Sub
    End If
    If cmbCoo.Text = "" Then
        MsgBox("Please select COO")
        cmbCoo.Focus()
        Exit Sub
    End If
    Dim qty, part, reel As Integer
    delete()
    conn1("select * from production_oqc where job_no='" & txtJob.Text & "' and status='Accept'", "oqc")
    If ds.Tables("oqc").Rows.Count > 0 Then 'oqc record found
        For i As Integer = 0 To ds.Tables("oqc").Rows.Count - 1
            dr = ds.Tables("oqc").Rows(i)
            qty = dr("qty_per_reel")
            insert(CStr(qty))
        Next
    Else 'no oqc record found
        conn2("select s.fa_ref_no, s.revision, s.pkg, s.lead from pln_so s inner join prod_pt p on s.so_id=p.so_id where p.job_no='" & txtJob.Text & "'", "fa")
        dr1 = ds1.Tables("fa").Rows(0)
        If dr1("fa_ref_no") <> "" Then 'get from fa taping
            conn3("select * from fa_taping where fa_ref_no='" & dr1("fa_ref_no") & "' and revision='" & dr1("revision") & "'", "taping")
            If ds2.Tables("taping").Rows.Count > 0 Then 'fa taping record found
                dr2 = ds2.Tables("taping").Rows(0)
                qty = dr2("qty_per_reel")
                If CInt(txtQty.Text) > qty Then 'more than 1 reel
                    part = CInt(txtQty.Text) Mod qty
                    reel = (CInt(txtQty.Text) - part) / qty
                    For j As Integer = 0 To reel - 1
                        insert(CStr(qty))
                    Next
                    If part <> 0 Then
                        insert(CStr(part))
                    End If
                Else
                    insert(txtQty.Text)
                End If
            Else 'no fa taping record found, use fa taping mast
                conn4("select * from fa_taping_mast where pkg='" & dr1("pkg") & "' and lead='" & dr1("lead") & "' and status='Approved'", "mast")
                If ds3.Tables("mast").Rows.Count > 0 Then 'fa taping mast record found
                    dr3 = ds3.Tables("mast").Rows(0)
                    qty = dr3("qty_per_reel")
                    If CInt(txtQty.Text) > qty Then 'more than 1 reel
                        part = CInt(txtQty.Text) Mod qty
                        reel = (CInt(txtQty.Text) - part) / qty
                        For k As Integer = 0 To reel - 1
                            insert(CStr(qty))
                        Next
                        If part <> 0 Then
                            insert(CStr(part))
                        End If
                    Else
                        insert(txtQty.Text)
                    End If
                Else 'no fa taping mast record found
                    insert(txtQty.Text)
                End If
            End If
        Else 'get from fa taping mast
            conn3("select * from fa_taping_mast where pkg='" & dr1("pkg") & "' and lead='" & dr1("lead") & "' and status='Approved'", "taping_mast")
            If ds2.Tables("taping_mast").Rows.Count > 0 Then 'fa taping mast record found
                dr2 = ds2.Tables("taping_mast").Rows(0)
                qty = dr2("qty_per_reel")
                If CInt(txtQty.Text) > qty Then 'more than 1 reel
                    part = CInt(txtQty.Text) Mod qty
                    reel = (CInt(txtQty.Text) - part) / qty
                    For l As Integer = 0 To reel - 1
                        insert(CStr(qty))
                    Next
                    If part <> 0 Then
                        insert(CStr(part))
                    End If
                Else '1 reel
                    insert(txtQty.Text)
                End If
            Else 'no fa taping mast record found
                insert(txtQty.Text)
            End If
        End If
    End If
    printing()
    clear()
    txtJob.Text = ""
    txtJob.Focus()
End Sub

Private Sub btnPaper_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPaper.Click
    Dim p As Form
    p = Celclass_papertaping
    Me.Close()
    p.Show()
End Sub

结束Class

错误

Private Sub txtJob_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtJob.TextChanged conn1("select p.qty, p.lot, p.mpn, p.dc1, p.dc2, p.dc3, s.raw, s.so_raw, s.prog, s.po, p.job_no from prod_pt p inner join pln_so s on p.so_id=s.so_id where p.job_no='" & txtJob.Text & "'", "pt")

精简到最简单的级别,您将得到一个 WhosebugException,因为您正在其自己的 TextChanged 事件处理程序中更改 txtJob.Text。所以最终发生的是:

  1. 用户在 txtJob 中输入了一些内容。
  2. 引发了 txtJob.TextChanged 事件。
  3. 您的 txtJob_TextChanged 事件处理程序被调用。
  4. txtJob_TextChanged 内,您的代码更改 txtJob.Text
  5. 引发了 txtJob.TextChanged 事件。
  6. 重复3-6直到堆栈溢出。

解决方法是添加一个 Boolean 标志,指示代码仍在处理文本更改:

Private _istxtJobProcessing As Boolean

Private Sub txtJob_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtJob.TextChanged
    'If we're already processing, bail out now.
    If _istxtJobProcessing Then Return

    'Set a flag so that we know that we are already processing.
    _istxtjobProcessing = True

    ' Now run your code here...

    ' And afterward, reset the flag.
    _istxtJobProcessing = False

End Sub

您还应注意,您正在编写的 SQL 代码容易受到 SQL injection 的攻击。如果您搜索该主题,您会在 VB.NET.

中找到大量关于如何使用参数化查询避免这种情况的答案