【问题标题】:Exception message when trying to load data to DataGridView尝试将数据加载到 DataGridView 时出现异常消息
【发布时间】:2020-09-02 00:19:41
【问题描述】:
Imports System.Data.SqlClient

Public Class SQLCONTROL
    Private DBcon As New SqlConnection("Data Source=DESKTOP-DQ7NOIF\SQLEXPRESS;Integrated Security=True")
    Private DBcom As New SqlCommand

    Public DBDA As SqlDataAdapter
    Public DBDT As DataTable
    Public Params As New List(Of SqlParameter)
    Public RecordCount As Integer
    Public Exception As String

    Public Sub New()

    End Sub

    Public Sub New(ConnctionString As String)
        DBcon = New SqlConnection(ConnctionString)

    End Sub

    Public Sub ExecQuery(Query As String)
        RecordCount = 0
        Exception = ""

        Try
            DBcon.Open()
            DBcom = New SqlCommand(Query, DBcon)
            Params.ForEach(Sub(p) DBcom.Parameters.Add(p))
            DBDT = New DataTable
            DBDA = New SqlDataAdapter(DBcom)
            RecordCount = DBDA.Fill(DBDT)
        Catch ex As Exception
            Exception = "ExecQuery Error" & vbNewLine & ex.Message
        Finally
            If DBcon.State = ConnectionState.Open Then DBcon.Close()

        End Try
    End Sub

    Public Sub AddParam(Name As String, Value As Object)
        Dim NewParam As New SqlParameter(Name, Value)
        Params.Add(NewParam)
    End Sub

    Public Function HasException(Optional Report As Boolean = False) As Boolean
        If String.IsNullOrEmpty(Exception) Then Return False
        If Report = True Then MsgBox(Exception, MsgBoxStyle.Critical, "Exception:")
        Return True
    End Function

End Class

异常消息是“System.Data.dll 中发生'System.Data.SqlClient.SqlException' 类型的第一次机会异常

附加信息:Nom d'objet 'Utilisateurs' 无效。"

谢谢

【问题讨论】:

  • 尽管您发布了未经翻译的法语错误消息,但您似乎被告知数据库对象名称Utilisateurs 无效。您的 SQL 代码似乎存在问题,但这是您没有向我们展示的一件事。我建议您检查 SQL 代码中的所有表名和列名,以确保它们都是正确的。
  • 为了将来参考,标题应该是您问题的简明摘要。不要包括对您专业水平的问候或描述。此外,这里的例外似乎是在执行查询时,因此DataGridView 没有相关性。最后,该网站出于某种原因提供了您帖子的预览。确保您使用它,如果您的代码格式不正确,请不要提交。如果您不知道如何正确格式化代码,请在发布之前努力找出答案。
  • 这是一个将用户界面代码与数据访问代码分开的好主意,但您会强制您的 ui 代码了解 Sql Server。我怀疑您正在检查用户登录,因为您没有返回任何数据,只是记录计数。您需要特定的方法来处理不同类型的查询。

标签: sql vb.net tsql exception datagridview


【解决方案1】:

许多数据库对象(包括连接和命令)公开了.Dispose 方法,这意味着它们可能正在使用需要释放的非托管资源。为了保证.Dispose 被调用.net 提供Using...End Using

任何错误都会冒泡到调用代码,您可以在其中处理它们并通知用户。毕竟,您的课程可以在 MsgBox 不起作用的网络应用程序或电话应用程序中使用。将通知用户留给用户界面代码。

Public Class SQLCONTROL

    Private ConStr As String = "Data Source=DESKTOP-DQ7NOIF\SQLEXPRESS;Integrated Security=True"

    Public Function IsUserValid(userName As String, password As String) As Boolean
        Dim RetVal As Integer
        Using DBcon As New SqlConnection(ConStr),
                DBcom As New SqlCommand("Select Count(*) From [Utilisateurs] Where UserName = @UserName And Password = @Password;", DBcon)
            DBcom.Parameters.Add("@UserName", SqlDbType.NVarChar, 50).Value = userName
            DBcom.Parameters.Add("@Password", SqlDbType.NVarChar, 100).Value = password
            DBcon.Open()
            RetVal = CInt(DBcom.ExecuteScalar)
        End Using
        If RetVal = 0 Then
            Return False
        End If
        Return True
    End Function

    'To return a DataTable for a DataGridView
    Public Function GetCustomerOrders(Customer As String) As DataTable
        Dim dt As New DataTable
        Using DBcon As New SqlConnection(ConStr),
                DBcom As New SqlCommand("Select * From Orders Where CustomerName = @CustomerName;", DBcon)
            DBcom.Parameters.Add("@CustomerName", SqlDbType.NVarChar, 100).Value = Customer
            DBcon.Open()
            dt.Load(DBcom.ExecuteReader)
        End Using
        Return dt
    End Function

End Class

在表格中的使用

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim sql As New SQLCONTROL
    If sql.IsUserValid("Mary", "MySecretPassword") Then
        'Do something
    End If
End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Dim sql As New SQLCONTROL
    DataGridView1.DataSource = sql.GetCustomerOrders("General Motors")
End Sub

当然,我只猜测字段名称、类型和大小。检查您的数据库。

在实际应用程序中,您永远不会将密码存储为纯文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多