Подключение к собственной базе данных SQL в Visual Basi c не работает - PullRequest
0 голосов
/ 21 марта 2020

У меня было несколько проблем с 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

1 Ответ

0 голосов
/ 22 марта 2020

Соединение необходимо не только закрыть, но и утилизировать, чтобы оно могло быть возвращено в пул соединений. Использование ... Конец Использование блоков обрабатывает это для вас, даже если есть ошибка.

Строка подключения не завершена. См. https://www.connectionstrings.com/microsoft-data-sqlclient/ Как видите, вы не подключаетесь к файлу с Sql Server. Вы подключаетесь к базе данных на сервере.

Сохраняйте объекты базы данных локально по отношению к методу, в котором они используются, чтобы их можно было закрывать и удалять.

Параметры следует добавлять с помощью метода .Add это включает в себя аргументы SqlDbType и Size. Необязательно просить код интерфейса пользователя знать об этих параметрах.

Не возвращать данные, когда все, что вам нужно, это количество записей.

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
...