Member 13704851 Ответов: 1

Эй ребята как я могу подключиться и добавить данные в базу данных ms access в VB.NET -что ?


он все еще дает мне ошибки !!! иногда синтаксические ошибки (отсутствует операция в выражении запроса)
а иногда и так :"не разрешается изменять свойство 'ConnectionString'. Текущее состояние соединения открыто."}

Что я уже пробовал:

Dim provider As String
    Dim dataFile As String
    Dim connString As String
    Dim myConnection As OleDbConnection = New OleDbConnection
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="

        dataFile = "D:\Dat.accdb;"

        connString = provider & dataFile
        myConnection.ConnectionString = connString

        myConnection.Open()
        Dim str As String
        str = "insert into Dat ([No], [Date], [Name], [Gender],[Age],[Phone],[Desease],[Address],[Building],[Room No],[Room Type],[Price]) VALUES (@No,@Date,@Name,@Gender,@Age,@Phone,@Desease,@Address,@Building,@Room No,@Room Type,@Price) "


        Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
        cmd.Parameters.Add(New OleDbParameter("No", CType(TextBox1.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Name", CType(TextBox2.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Gender", CType(TextBox3.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Age", CType(TextBox4.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Phone", CType(TextBox6.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Desease", CType(TextBox7.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Address", CType(TextBox8.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Building", CType(TextBox10.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Room No", CType(TextBox11.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Room Type", CType(TextBox12.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Price", CType(TextBox13.Text, String)))
        Try
            cmd.ExecuteNonQuery()
            cmd.Dispose()
            myConnection.Close()
            TextBox1.Clear()
            TextBox2.Clear()
            TextBox3.Clear()
            TextBox4.Clear()
            TextBox5.Clear()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Me.Close()

    End Sub
End Class

Richard MacCutchan

Почему вы храните возраст в виде строки? Скоро это будет неправильно. Храните данные о рождении в виде значения даты, чтобы вы могли вычислить правильный возраст в любое время. Также цена должна быть числового типа, если вы хотите использовать ее для расчетов.

Что касается сообщений об ошибках, покажите нам точно, когда и где они происходят, и какие значения параметров задействованы.

CHill60

Первая ошибка, скорее всего, будет связана с тем, что одно из текстовых полей пусто - кстати, заведите привычку давать своим текстовым полям собственные имена, а не только стандартные.
2-я ошибка, скорее всего, будет заключаться в том, что вы не закрываете свое соединение после каждого вызова.
Тем не менее, слава за использование параметров команды! Я лично предпочитаю использовать AddWithValue, однако каждый по-своему.

Как сказал Ричард, скажите нам точно, в какой строке происходят ошибки и с какими данными

1 Ответов

Рейтинг:
2

OriginalGriff

Если вы объявите один объект соединения - а вы это делаете - вы всегда должны убедиться, что он закрыт - если ваш запрос завершится неудачей, соединение останется открытым, и тогда вы получите ошибки, которые вы описываете. Блок finally используется на попробовать ... Поймать, и закрыть соединение есть.

Затем... предположим, что вы не поленились и создали базу данных, которая полностью основана на строках - то есть возраст, цена и т. д. хранятся в виде чисел, а не строк, - тогда вам нужно проверить значения, введенные пользователем, чтобы предотвратить сбой вставки. Лучший способ сделать это-использовать соответствующий метод TryParse для преобразования содержимого текстового поля в начале вашего метода и сообщать о проблемах пользователю вместо того, чтобы погружаться вперед. Пользователи совершают ошибки: если вы не допускаете этого, то ваше приложение потерпит неудачу или, что еще хуже, ваши данные станут мусором.
Если вы сохранили их в виде струн, они вернутся, чтобы укусить вас довольно скоро...

И кстати: сделайте себе одолжение и перестаньте использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам придется изменить его через три недели, вы тогда это сделаете? Используйте описательные имена - например, "tbMobileNo" - и ваш код станет легче читать, более самодокументируемым, более легким в обслуживании - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...