Member 13711215 Ответов: 2

Выберите несколько столбцов из базы данных access


Привет,

не могли бы вы помочь мне, как я могу выбрать несколько столбцов из таблицы? Я не знаю, где у меня есть ошибка, потому что приложение не показывает мне ошибку.

спасибо

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

provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="
        dataFile = "sdf.accdb" ' Change it to your Access Database location
        connString = provider & dataFile
        myConnection.ConnectionString = connString

Try
            myConnection.Open()
            Dim str As String
            str = "SELECT TYP_STROJE, Strana, NAZEV_PROJEKTU, CIS_PRAC, NAZ_PRAC FROM IDSTROJE WHERE EVID_CIS_STROJE= '" & Serial_no & "'"
            Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)

            'cmd.Parameters.Add(New OleDbParameter("EVID_CIS_STROJE", CType(Serial_no, String)))
            cmd.Parameters.Add(New OleDbParameter("TYP_STROJE", CType(Typ_stroj, String)))
            cmd.Parameters.Add(New OleDbParameter("Strana", CType(strana, String)))
            cmd.Parameters.Add(New OleDbParameter("NAZEV_PROJEKTU", CType(nazev_proj, String)))
            cmd.Parameters.Add(New OleDbParameter("CIS_PRAC", CType(Cislo_prac, String)))
            cmd.Parameters.Add(New OleDbParameter("NAZ_PRAC", CType(Nazev_prac, String)))
            'cmd.Parameters.Add(New OleDbParameter("NAZEV_STROJE", CType(Nazev_stroj, String)))


            cmd.ExecuteNonQuery()
            cmd.Dispose()

            myConnection.Close()
            myConnection.Dispose()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

2 Ответов

Рейтинг:
20

OriginalGriff

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

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы вход / выход был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
Private Function Double(ByVal value As Integer) As Integer
    Return value * value
End Function

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!

Теперь давайте поговорим о конкретных проблемах с вашим кодом, и мы начнем с самого важного, который вы еще не заметили: никогда не объединяйте строки для построения команды 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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

Я знаю, что вы можете использовать параметры, потому что ваш код показывает некоторые из них ... но они просто вставлены откуда-то еще, потому что ваша команда их не использует! Он передает серийный номер в качестве параметра - или сделал бы это, если бы вы его не прокомментировали, - поэтому используйте его вместо конкатенации и сбросьте остальное...

Тогда есть фактический доступ к БД ... почему вы выполняете не-запрос для выбора? SELECT - это запрос, он предназначен для возврата данных, а ExecuteNonQuery специально говорит: "это не возвращает никаких данных", что означает, что у вас нет возможности получить доступ к выбранным данным! Вместо этого используйте DataAdapter или DataReader:
Using con As New SqlConnection(strConnect)
	con.Open()
	Using cmd As New SqlCommand("SELECT iD, description FROM myTable", con)
		Using reader As SqlDataReader = cmd.ExecuteReader()
			While reader.Read()
				Dim iD As Integer = CInt(reader("iD"))
				Dim desc As String = DirectCast(reader("description"), String)
				Console.WriteLine("ID: {0}" & vbLf & "    {1}", iD, desc)
			End While
		End Using
	End Using
End Using


Member 13711215

Спасибо

OriginalGriff

Всегда пожалуйста!

Рейтинг:
1

Member 13711215

provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="
        dataFile = "sdf.accdb" ' Change it to your Access Database location
        connString = provider & dataFile
        myConnection.ConnectionString = connString

        myConnection.Open()
        Dim str As String
        str = "SELECT TYP_STROJE, Strana, NAZEV_PROJEKTU, CIS_PRAC, NAZ_PRAC " & "FROM [IDSTROJE] " & "WHERE EVID_CIS_STROJE= '" & Serial_no & "'"
        Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)

        Using reader As OleDbDataReader = cmd.ExecuteReader()

            If reader.HasRows Then
                reader.Read()
            End If
            Try
                Dim iD As String = reader("TYP_STROJE") IsNot DBNull.Value = False
                If iD = False Then
                    iD = reader("TYP_STROJE")
                    Assy_rozcestnik_porucha.nazev_stroj.Text = iD
                Else
                End If
            Catch EX As Exception
                MsgBox("Informace o záznamu nebyly nalezeny")
                Assy_rozcestnik_porucha.RichTextBox2.Clear()
                Assy_rozcestnik_porucha.RichTextBox2.Select()
            End Try


Richard Deeming

Это все еще уязвимо для SQL-инъекция[^].

Const str As String = "SELECT TYP_STROJE, Strana, NAZEV_PROJEKTU, CIS_PRAC, NAZ_PRAC FROM [IDSTROJE] WHERE EVID_CIS_STROJE = ?"
Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
cmd.Parameters.AddWithValue("1", Serial_no)