Wafiqque Ответов: 3

У меня возникли проблемы с моим кодированием


Привет, я новичок в этом деле VB.net, я пытаюсь вставить свои данные в базу данных, но, похоже, продолжаю получать ошибки. Что я сделал не так?

Imports System.Data.OleDb

Public Class frmRegister

    Dim provider As String
    Dim datafile As String
    Dim connString As String
    Dim myConnection As OleDbConnection = New OleDbConnection
    Dim gender As String
    Dim age As Int32

    Private Sub BtnReg_Click(sender As Object, e As EventArgs) Handles btnReg.Click
        If txtFName.Text = "" Or txtUsername.Text = "" Or txtPassword.Text = "" Or txtEmail.Text = "" Then
            MsgBox("Please fill in the info")
        Else

            If radFemale.Checked Then
                gender = "Female"
            ElseIf radMale.Checked Then
                gender = "Male"
            End If

            age = DateTime.Today.Year - dateAge.Value.Year

            provider = "Provider=Microsoft.JET.OLEDB.4.0;Data Source="
            datafile = "C:\Users\User\Desktop\Part 5\CSC 301\Project\Flight\test.mdb"
            connString = provider & datafile
            myConnection.ConnectionString = connString
            myConnection.Open()
            Dim str As String
            str = "Insert into User ([Username],[Password],[Full Name],[Email],[Gender],[Birthdate],[Age]) Values (?,?,?,?,?,?,?) "
            Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
            cmd.Parameters.Add(New OleDbParameter("Username", CType(txtUsername.Text, String)))
            cmd.Parameters.Add(New OleDbParameter("Password", CType(txtPassword.Text, String)))
            cmd.Parameters.Add(New OleDbParameter("Full Name", CType(txtFName.Text, String)))
            cmd.Parameters.Add(New OleDbParameter("Email", CType(txtEmail.Text, String)))
            cmd.Parameters.Add(New OleDbParameter("Gender", CType(gender, String)))
            cmd.Parameters.Add(New OleDbParameter("Birthdate", CType(dateAge.Value, String)))
            cmd.Parameters.Add(New OleDbParameter("Age", CType(age, String)))

            Try
                cmd.ExecuteNonQuery()
                cmd.Dispose()
                myConnection.Close()
                txtEmail.Clear()
                txtFName.Clear()
                txtPassword.Clear()
                txtUsername.Clear()
                MsgBox("create success")
            Catch ex As Exception
                MsgBox("Error")
            End Try

        End If
    End Sub
End Class


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

Я изменил свой код с более простого способа подключения его к базе данных на эти, но все еще получаю ошибку

Richard Deeming

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

Нажмите на зеленую ссылку "улучшить вопрос" и обновите свой вопрос, чтобы добавить полную информацию об ошибке, которую вы получаете. Не забудьте указать, из какой строки кода он выбрасывается.

NB: Вам, вероятно, придется изменить свой Catch блок, который в данный момент игнорирует исключение и просто отображает общее сообщение "Ошибка". Попросите его отобразить сведения об исключении или записать сведения об исключении в журнал.

Wafiqque

Спасибо, после того, как я изменил свой блок Catch, это ошибка, которую я получаю

Синтаксическая ошибка в инструкции INSERT INTO.
около
Система.Данные.Oledb для.Объект oledbcommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
около
Система.Данные.Oledb для.Объект oledbcommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
около
Система.Данные.Oledb для.Объект oledbcommand.ExecuteCommandText(Object&executeResult)
около
Система.Данные.Oledb для.Объект oledbcommand.Метод executecommand(поведение метода commandbehavior,объект&амп; executeResult)
около
Система.Данные.Oledb для.Объект oledbcommand.Исполнить команду.ExecuteReaderInternal(поведение CommandBehavior, строковый метод)
около
Система.Данные.Oledb для.Объект oledbcommand.Метод executenonquery()
около
Полета.frmRegister.BtnReg_Click(объект отправителя, EventArgs В Е) в C:\Users\User\Desktop\Part 5\КБК 301\проект\полет\полет\зарегистрироваться.В. Б.:линия 42

Richard Deeming

Кроме того, вы храните пароли в виде обычного текста. Не делай этого.

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]

MadMyche

Было бы полезно, если бы вы указали фактическую ошибку....
Есть недостаток по вашей логике, для расчета возраста; но недостаточно, чтобы оправдать исключение само по себе.

Richard Deeming

Я бы сказал, что есть недостаток в хранении возраста в базе данных вообще, учитывая, что это не статическое значение. :)

MadMyche

Может быть, намерение таково возраст на момент регистрации

3 Ответов

Рейтинг:
2

phil.o

Вы могли бы начать с

Catch ex As Exception
   MsgBox(ex.Message + vbCrLf + ex.StackTrace)
Это, по крайней мере, даст вам более осмысленное сообщение, чем общая "ошибка".


Wafiqque

Спасибо, это помогает показать реальное сообщение об ошибке

Рейтинг:
1

Patrice T

Цитата:
Что я сделал не так?

Что неправильно, так это попытка/уловка в вашем коде, то, как вы это сделали, скрывает реальное сообщение об ошибке и позицию.

Совет: никогда не используйте try/catch во время отладки кода. Try/catch следует использовать только для обработки особых случаев после того, как вы знаете, что обычные случаи обрабатываются правильно.


Рейтинг:
1

Wafiqque

Я исправил это, поставив квадратную скобку на имя таблицы, похоже, это sql-инъекция, если я не ошибаюсь


Richard Deeming

Это не ... SQL-инъекция[^] вопрос. Дело в том, что User это зарезервированное слово в MS Access:
Список зарезервированных слов в Access 2002 и в более поздних версиях Access[^]