Member 13771028 Ответов: 1

Преобразование строки "type" В тип "integer" недопустимо. " пожалуйста, помогите мне


Private Sub OKbt1_Click(sender As Object, e As EventArgs) Handles OKbt1.Click
       Call Connect() ' [ connection to module ]'

       Dim Reader As SqlDataReader
       Try
           'selecting DATA from DATABASE
           Dim query As String
           query = "select * from uinfo where  password = '" & PASStb2.Text & "' "
           command = New SqlCommand(query, sqlConn)
           'Dim command As New SqlCommand("select * from uinfo where password = '" & PASStb2.Text & "'", sqlConn)
           'Dim dt As New DataTable
           'Dim adapter As New SqlDataAdapter(command)
           'adapter.Fill(dt)
           Reader = command.ExecuteReader


           Dim count As Integer
           count = 0
           While Reader.Read
               count = count + 1

           End While

           If count = 1 Then

               Dim usertype = Reader.GetString("Type")

               If usertype = "admin" Then
                   'MsgBox("username and password are correct")
                   MAIN_MENU.Show()


                   For a = 0 To 500

                   Next
                   Me.Hide()
                   sqlConn.Close()
                   sqlConn.Dispose()

               ElseIf usertype = "user" Then

                   For a = 0 To 500

                   Next
                   Me.Hide()
                   'MsgBox("username and password are correct")
                   USERMENU.Show()




               End If

           ElseIf count > 1 Then



               MsgBox("username and password are duplicate")



           Else
               MsgBox("username and password are not correct")


           End If

           sqlConn.Close()
       Catch ex As SqlException
           MsgBox(ex.Message)
       Finally
           sqlConn.Dispose()


       End Try
   End Sub


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

я попытался изменить его на двойной но та же ошибка d Sub
ошибка выглядит примерно так "
System.InvalidCastException: 'Conversion from string "Type" to type 'Integer' is not valid.'"

RedDk

Нет никаких причин использовать безопасный код, который не уязвим для sql-инъекций, как правило, путем создания cte, на коробке, которая не имеет требований безопасности ... но, навскидку, эта ошибка "преобразование из строки в целое число" кажется мне первой вещью, показанной в том, что, вероятно, является каскадной ошибкой, относящейся к методу, который пытается запихнуть много вещей в контейнер, который будет содержать только одну вещь. Поэтому исправьте TSQL, указав имя столбца в операторе SELECT.

1 Ответов

Рейтинг:
0

OriginalGriff

Так много плохих идей в таком коротком куске кода...

Не делай этого так! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

И когда вы исправите это во всем своем приложении, вы можете посмотреть на следующее большое изменение, которое вам нужно сделать: никогда не храните пароли в открытом тексте - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^] - код написан на C#, но это довольно очевидно, и онлайн-конвертеры могут помочь, если вы застряли.
Просто чтобы дать вам представление о том, как мало внимания уделяется текстовым паролям: Криминальный Кодекс 1[^]