Member 13002361 Ответов: 2

Как вставить данные в базу данных MS access из VB.NET?


Привет, ребята!
Я пытаюсь вставить данные в базу данных MS Access из VB.net. Соединение работает, и нет никакой ошибки, но когда я посетил свою базу данных, там нет никаких добавленных данных. Что я должен сделать, чтобы увидеть мои вставленные данные в ms access?

Вот мой код:

Public Class RegForm

    Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\DBCaseStudy.mdb;Persist Security Info=False")


    Private Sub RegForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'DBCaseStudyDataSet.tblAdmins' table. You can move, or remove it, as needed.
        Me.TblAdminsTableAdapter.Fill(Me.DBCaseStudyDataSet.tblAdmins)
    End Sub

    Private Sub btnRegCreate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegCreate.Click
        conn.Open()

        Dim comd As New OleDb.OleDbCommand("INSERT INTO tblAdmins([ID],[Firstname],[Lastname],[Username],[Password]) VALUES ('" & txtRegID.Text & "','" & txtRegFirst.Text & "','" & txtRegLast.Text & "','" & txtRegUsername.Text & "','" & txtRegPass.Text & "')", conn)

        Try
            comd.ExecuteNonQuery()
            comd.Dispose()
            MsgBox("Record Appended", MsgBoxStyle.Information, "Successfully Added!")
            conn.Close()
        Catch ex As Exception
            MsgBox(ex.InnerException)
        End Try
    End Sub

    Private Sub btnBack_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBack.Click
        LoginForm.Show()
        Me.Close()
    End Sub
End Class


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

Я попробовал использовать
comd.Parameters.Add(New OledbParameter("ID", CType(txtRegID.Text,String))) ',etc. 
Но это все равно не работает.

[no name]

Я считаю, что вам нужно будет исправить вашу строку подключения. Приложение Winforms обычно не имеет папок DataDirectory.

Richard Deeming

Работа с локальными базами данных[^]
– Для приложений, размещенных в каталоге на компьютере пользователя, это будет папка приложения (.exe).
– Для приложений, работающих под управлением ClickOnce, это будет специальная папка данных, созданная ClickOnce
– Для веб-приложений это будет папка App_Data

[no name]

Спасибо. Сегодня я узнал кое-что новое.

2 Ответов

Рейтинг:
2

Dave Kreskowiak

Вдобавок ко всему, что говорили все остальные, если ваша база данных Access находится в вашем проекте, она копируется в папку bin\Debug|Release каждый раз, когда вы запускаете свой проект в Visual Studio. Таким образом, при первом запуске вашего приложения база данных копируется из папки проекта в папку bin\Debug|Release, где вы вносите свои изменения в базу данных. Затем вы выходите из этого экземпляра, вносите некоторые изменения и снова запускаете свой проект. Затем база данных снова копируется в папку bin\Debug|Release, перезаписывая то, что вы изменили в прошлый раз.

Если база данных выглядит точно так же, как при каждом запуске приложения, то именно это и происходит.

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


Рейтинг:
0

Richard Deeming

Начните с фиксации SQL-инъекция[^] уязвимость в вашем коде.

Private Function CreateConnection() As OleDb.OleDbConnection
    Return New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\DBCaseStudy.mdb;Persist Security Info=False")
End Function

Private Sub btnRegCreate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegCreate.Click
    Using conn As OleDb.OleDbConnection = CreateConnection()
        Using comd As New OleDb.OleDbCommand("INSERT INTO tblAdmins ([ID], [Firstname], [Lastname], [Username], [Password] VALUES (@ID, @Firstname, @Lastname, @Username, @Password)", conn)
            comd.Parameters.AddWithValue("@ID", txtRegID.Text)
            comd.Parameters.AddWithValue("@Firstname", txtRegFirst.Text)
            comd.Parameters.AddWithValue("@Lastname", txtRegLast.Text)
            comd.Parameters.AddWithValue("@Username", txtRegUsername.Text)
            comd.Parameters.AddWithValue("@Password", txtRegPass.Text)
            
            conn.Open()
            Try
                comd.ExecuteNonQuery()
                MsgBox("Record Appended", MsgBoxStyle.Information, "Successfully Added!")
            Catch ex As Exception
                MsgBox(ex.ToString())
            End Try
        End Using
    End Using
End Sub


Затем вам нужно будет исправить хранилище паролей. В настоящее время вы храните пароли в виде обычного текста, который является чрезвычайно плохая идея. Вы должны всегда хранить только соленый хэш пароля, используя уникальную соль для каждой записи.
Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хеширование паролей - все правильно[^]


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]