【问题标题】:Connection to own made SQL database in Visual Basic not working在 Visual Basic 中连接到自己制作的 SQL 数据库不起作用
【发布时间】:2020-03-21 16:22:19
【问题描述】:

我在使用 Visual Studio 2019 时遇到了一些问题。我想创建一个本地数据库,然后对其进行扩展。

首先,我想看看我是否仍然可以建立一个简单的连接,但我没有这样做(我导入了 NuGet 包 System.Data.SqlClient 以供参考)。

所以到目前为止我做了什么:

  • 我创建了一个类SQLControl(见下图代码)
  • 我还创建了一个扩展名为 .mdf 的简单数据库,其中包含一个名为 Food 的新表:
CREATE TABLE [dbo].[Food] 
(
    [Id]        INT           NOT NULL,
    [Food_Name] NVARCHAR (30) NOT NULL,
    [Food_Type] NVARCHAR (30) NOT NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC)
);

通过编辑“显示表数据”界面,我用 5 个 ID 条目填充了这个数据表。

之后我想看看连接是否有效,所以我做了一个表格:

public Class Form1
    Private SQL As New SQLControl
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        GetFoods()
    End Sub

    Private Sub GetFoods()
        SQL.ExecQuery("SELECT Food_Name FROM Food")

        MsgBox(SQL.RecordCount)

    End Sub
End Class

这应该简单地计算 5 个条目并返回值 5 作为弹出窗口。但它只给我一个 0。你们能帮帮我吗?

类 SQLControl.vb:

Imports System.Data
Imports System.Data.SqlClient


Public Class SQLControl

    Private SQLCon As New SqlConnection("Data Source = Database1.mdf;")
    Private SQLCmd As SqlCommand

    Public SQLDA As SqlDataAdapter
    Public SQLDS As DataSet

    Public Params As New List(Of SqlParameter)

    Public RecordCount As Integer
    Public Exception As String
    Public Sub ExecQuery(Query As String)
        Try
            SQLCon.Open()
            SQLCmd = New SqlCommand(Query, SQLCon)

            Params.ForEach(Sub(x) SQLCmd.Parameters.Add(x))

            Params.Clear()

            SQLDS = New DataSet
            SQLDA = New SqlDataAdapter(SQLCmd)
            RecordCount = SQLDA.Fill(SQLDS)

            SQLCon.Close()
        Catch ex As Exception
            Exception = ex.Message
        End Try
        If SQLCon.State = ConnectionState.Open Then SQLCon.Close()
    End Sub

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

【问题讨论】:

  • 您不能直接从 .NET 代码中打开 SQL Server .mdf 文件。 .mdf 文件(以及任何随附的 .ndf.ldf 文件)必须由 SQL Server 或 SQL Server Express 托管和管理,并且您的代码通过 SQL 与 Server=localhost,1433;Database=Database1;User Id=MySqlLogin;Password=MyStr0ngP4assw0rd; 之类的东西连接。

标签: sql-server database vb.net


【解决方案1】:

连接不仅需要关闭,还需要释放,这样连接才能返回连接池。即使出现错误,使用 ...End Using 块也会为您处理。

您的连接字符串不完整。见https://www.connectionstrings.com/microsoft-data-sqlclient/ 如您所见,您没有使用 Sql Server 连接到文件。您连接到服务器上的数据库。

将您的数据库对象保留在使用它们的方法的本地,以便可以关闭和处置它们。

应使用包含 SqlDbType 和 Size 参数的 .Add 方法添加参数。要求用户界面代码了解这些参数是不合理的。

当你想要的只是记录数时,不要返回数据。

Public Class Form1
    Private SQL As New SQLControl
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        GetFoods()
    End Sub

    Private Sub GetFoods()
        Dim RecordCount = SQL.GetRecordCount("SELECT Count(Food_Name) FROM Food")
        MsgBox(RecordCount.ToString)
    End Sub

End Class

Public Class SQLControl

    Private ConString As String = "Data Source = Database1.mdf;" 'Not a proper connection string

    Public Function GetRecordCount(Query As String) As Integer
        Dim Count As Integer
        Using SQLCon As New SqlConnection(ConString),
                SQLCmd As New SqlCommand(Query, SQLCon)
            SQLCon.Open()
            Count = CInt(SQLCmd.ExecuteScalar)
        End Using
        Return Count
    End Function
End Class

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    相关资源
    最近更新 更多