Paolo Tansengco Ответов: 4

Ошибка при 2-й попытке входа в систему


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

Необработанное исключение типа 'System.Данных.Sqlclient как.Sqlexception В' произошел в System.Data.dll

Дополнительная информация: имя переменной '@username' уже объявлено. Имена переменных должны быть уникальными в пакете запросов или хранимой процедуре.


Кто-нибудь может помочь мне это исправить. Вот мой код:

Public Class frmLogin

    Dim cn As New SqlConnection("Data Source=TANSENGCO\SQLEXPRESS;Initial Catalog=MonitoringSystem;Integrated Security=True")
    Dim cmd As New SqlCommand
    Dim dr As SqlDataReader
    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
        frmMainMenu.Height = 720
        frmMainMenu.Width = 950
        Dim numID As Integer = 2
        cmd.Connection = cn
        cn.Open()
        cmd.CommandText = "SELECT ID, username, password FROM tblUsers WHERE username = @username and password = @password"
        cmd.Parameters.Add(New SqlClient.SqlParameter("@username", SqlDbType.VarChar, 20)).Value = txtUsername.Text
        cmd.Parameters.Add(New SqlClient.SqlParameter("@password", SqlDbType.VarChar, 20)).Value = txtPassword.Text
        dr = cmd.ExecuteReader
        If dr.HasRows Then
            dr.Read()
            If dr("ID") = numID Then
                Me.Hide()
                frmMainMenu.lblAccessLevel.Text = "Admin"
                frmMainMenu.Show()
            Else
                Me.Hide()
                frmMainMenu.lblAccessLevel.Text = "User"
                frmMainMenu.TSMOffertory.Enabled = False
                frmMainMenu.TSMOffertory.Visible = False
                frmMainMenu.Show()
            End If
        Else
            MsgBox("Invalid Credentials", MsgBoxStyle.Exclamation, "Invalid LogIn")
        End If
        txtPassword.Clear()
        txtUsername.Clear()
        cn.Close()
    End Sub


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

Я действительно не знаю, что происходит, поэтому я не знаю, что попробовать.

[no name]

Сообщение об ошибке ясно говорит вам, в чем проблема.

4 Ответов

Рейтинг:
6

Wendelius

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

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

Взгляните на Хранение паролей: как это сделать.[^]


Рейтинг:
32

Karthik_Mahalingam

объявите эту строку внутри события нажатия кнопки

Dim cmd As New SqlCommand


(или)
добавлять
cmd.Parameters.Clear()

перед этой строкой
cmd.Parameters.Add(New SqlClient.SqlParameter("@username", SqlDbType.VarChar, 20)).Value = txtUsername.Text


Paolo Tansengco

Ух ты, спасибо. Теперь это работает. Большое спасибо!

Karthik_Mahalingam

добро пожаловать Паоло

Рейтинг:
24

pt1401

Ваш cmd является переменной-членом формы, поэтому сохраняет ее параметры после того, как вы использовали ее в первый раз.
Затем, когда вы снова пытаетесь добавить параметр @username к* тому же объекту * cmd, он квакает.

Всегда утилизируйте объект sql-команды, обернув его в блок using, чтобы он был утилизирован правильно.

using (cmd = new SqlCommand(...))
{
   cmd.Open();
   ....
}


Рейтинг:
13

Dave Kreskowiak

Да, Sqlconnection, SqlCommand и SqlDataReaders не должны быть объявлены в области видимости класса. Они должны быть объявлены в области действия метода и удалены, когда ваш запрос больше не нужен. Не вызывая Dispose на соединении, вы утекаете ресурсы и удерживаете соединения гораздо дольше, чем это необходимо.

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


pt1401

& gt; подключайтесь как можно позже, запрашивайте как можно быстрее, отключайтесь и утилизируйте как можно скорее.
Отличная мантра. Разработчики должны иметь эту татуировку на лбу в зеркальном письме :-)