2014-02-08 3 views
0

Я уже давно занимаюсь поиском в Google, но я просто не уверен, «как» задать вопрос, чтобы Google знал, что я имею в виду. У меня есть приложение, которое я разрабатываю в визуальной студии. Прямо сейчас это просто базовая форма окна с текстовым полем поиска для ввода пользователем данных и кнопки поиска для поиска в базе данных sql и возврата строки, которая соответствует. Конечный пользователь ищет ученика на основе введенного номера ученика. Я заполнил sql db двумя фиктивными учениками, чтобы иметь данные для тестирования. Когда я ввожу первый номер ученика и нажимаю поиск, он работает нормально. Когда я ввожу второе число, снова работает отлично. Когда я нажимаю поиск без данных в поле, отлично работает и бросает мне свое собственное сообщение об ошибке. Когда я ввожу недопустимый номер, который не находится в базе данных, ничего не происходит. Он по-прежнему показывает предыдущую запись, которую я только что получил, и очищает текстовое поле и помещает курсор обратно в поле и дает ему фокус (как следует), но не говорит мне, что он не может найти этот конкретный номер в db. Я не могу понять, как и где в моем коде исправить это.Поиск SQL через Windows Form

Справочная информация: Я преподаю на языках программирования (сегменты youtube, бесплатные онлайн-игры «how to's», google, многочисленные книги, прочитанные и т. Д.), И понять основные основы синтаксиса и т. Д., Но не там, где я хочу быть. Я ЛЮБЛЮ разработку программного обеспечения как хобби и любви, узнавая, как это сделать. Любая помощь чрезвычайно ценится. Просто будьте осторожны. :-)

Я удалил конфиденциальную информацию по назначению и заменил их на «?». Вот мой текущий код:

Private Sub SearchButton_Click(sender As System.Object, e As System.EventArgs) Handles SearchButton.Click 

    If stunumtxtbox.Text = "" Then 
     MsgBox("Please enter a student number.", MsgBoxStyle.Exclamation) 
     stunumtxtbox.Select() 
    Else 
     Try 
      con.ConnectionString = "Data Source=?\?;Initial Catalog=?;Persist Security Info=True;User ID=?;Password=?" 
      con.Open() 
     Catch se As SqlException 
      MsgBox(se.Message) 
     Finally 

      Try 
       Dim dt As New DataTable 
       Dim ds As New DataSet 
       Dim da As New SqlDataAdapter 
       ds.Tables.Add(dt) 
       da = New SqlDataAdapter("SELECT DISTINCT * FROM Student_Info WHERE studentId = '" & stunumtxtbox.Text & "'", con) 
       da.Fill(dt) 
       For Each DataRow In dt.Rows 
        If stunumtxtbox.Text = dt.Rows(0)("studentId").ToString Then 
         fnametxtbox.Text = dt.Rows(0)("firstName").ToString 
         mnametxtbox.Text = dt.Rows(0)("midleInitial").ToString 
         lnametxtbox.Text = dt.Rows(0)("lastName").ToString 
         addresstxtbox.Text = dt.Rows(0)("addressStreet").ToString 
         address2txtbox.Text = dt.Rows(0)("addressOption").ToString 
         citytxtbox.Text = dt.Rows(0)("addressCity").ToString 
         statetxtbox.Text = dt.Rows(0)("addressState").ToString 
         ziptxtbox.Text = dt.Rows(0)("addressZip").ToString 
         countrytxtbox.Text = dt.Rows(0)("addressCountry").ToString 
         celltxtbox.Text = dt.Rows(0)("contactcellphone").ToString 
         studentidtxtbox.Text = dt.Rows(0)("studentId").ToString 
        Else 
        End If 
       Next 
       con.Close() 
      Catch se As SqlException 
       MsgBox(se.Message) 
      Finally 
       stunumtxtbox.Clear() 
       stunumtxtbox.Select() 
       Try 
        StudentNameTextBox.Text = lnametxtbox.Text + "," + " " + fnametxtbox.Text + " " + mnametxtbox.Text 
       Catch ex As Exception 
        MsgBox(ex.Message) 
       Finally 
        fnamelabel.Visible = True 
        mnamelabel.Visible = True 
        lnamelabel.Visible = True 
        addressstreetlabel.Visible = True 
        address2label.Visible = True 
        addresscitylabel.Visible = True 
        addressstatelabel.Visible = True 
        addressziplabel.Visible = True 
        addresscountrylabel.Visible = True 
        celllabel.Visible = True 
        studentidlabel.Visible = True 
        editbutton.Enabled = True 
        editbutton.Visible = True 
       End Try 
      End Try 
     End Try 
    End If 
End Sub 

ответ

0

Благодарим вас @DonA и @Michael за помощь! Используя вашу информацию и еще несколько google, я разработал следующий код и очень счастлив сказать, что он работает. :-)

Private Sub SearchButton_Click(sender As System.Object, e As System.EventArgs) Handles SearchButton.Click 

    If stunumtxtbox.Text = "" Then 
     MsgBox("Please enter a student number.", MsgBoxStyle.Exclamation) 
     stunumtxtbox.Select() 
    Else 
     Try 
      Using connection As New SqlConnection("Data Source=?;Initial Catalog=?;Persist Security Info=True;User ID=?;Password=?") 
       connection.Open() 
       Dim dt As New DataTable 
       Dim ds As New DataSet 
       Dim da As New SqlDataAdapter 
       ds.Tables.Add(dt) 
       da = New SqlDataAdapter("SELECT DISTINCT * FROM Student_Info WHERE studentId = '" & stunumtxtbox.Text & "'", connection) 
       Dim count = da.Fill(dt) 

       If count = 0 Then 
        MsgBox("Student ID not found.", MsgBoxStyle.Critical) 
       Else 
        fnamelabel.Visible = True 
        mnamelabel.Visible = True 
        lnamelabel.Visible = True 
        addressstreetlabel.Visible = True 
        address2label.Visible = True 
        addresscitylabel.Visible = True 
        addressstatelabel.Visible = True 
        addressziplabel.Visible = True 
        addresscountrylabel.Visible = True 
        celllabel.Visible = True 
        studentidlabel.Visible = True 
        EditStudentToolStripMenuItem.Enabled = True 

        fnametxtbox.Enabled = False 
        fnametxtbox.Visible = True 
        fnametxtbox.BorderStyle = BorderStyle.FixedSingle 
        fnametxtbox.TabStop = True 
        fnametxtbox.TabIndex = 1 
        fnametxtbox.BackColor = Color.White 
        fnametxtbox.ForeColor = Color.Black 

        mnametxtbox.Enabled = False 
        mnametxtbox.Visible = True 
        mnametxtbox.BorderStyle = BorderStyle.FixedSingle 
        mnametxtbox.TabStop = True 
        mnametxtbox.TabIndex = 2 
        mnametxtbox.BackColor = Color.White 
        mnametxtbox.ForeColor = Color.Black 

        lnametxtbox.Enabled = False 
        lnamelabel.Visible = True 
        lnametxtbox.BorderStyle = BorderStyle.FixedSingle 
        lnametxtbox.TabStop = True 
        lnametxtbox.TabIndex = 3 
        lnametxtbox.BackColor = Color.White 
        lnametxtbox.ForeColor = Color.Black 

        addresstxtbox.Enabled = False 
        addresstxtbox.Visible = True 
        addresstxtbox.BorderStyle = BorderStyle.FixedSingle 
        addresstxtbox.TabStop = True 
        addresstxtbox.TabIndex = 4 
        addresstxtbox.BackColor = Color.White 
        addresstxtbox.ForeColor = Color.Black 

        address2txtbox.Enabled = False 
        address2txtbox.Visible = True 
        address2txtbox.BorderStyle = BorderStyle.FixedSingle 
        address2txtbox.TabStop = True 
        address2txtbox.TabIndex = 5 
        address2txtbox.BackColor = Color.White 
        address2txtbox.ForeColor = Color.Black 

        citytxtbox.Enabled = False 
        citytxtbox.Visible = True 
        citytxtbox.BorderStyle = BorderStyle.FixedSingle 
        citytxtbox.TabStop = True 
        citytxtbox.TabIndex = 6 
        citytxtbox.BackColor = Color.White 
        citytxtbox.ForeColor = Color.Black 

        statetxtbox.Enabled = False 
        statetxtbox.Visible = True 
        statetxtbox.BorderStyle = BorderStyle.FixedSingle 
        statetxtbox.TabStop = True 
        statetxtbox.TabIndex = 7 
        statetxtbox.BackColor = Color.White 
        statetxtbox.ForeColor = Color.Black 

        ziptxtbox.Enabled = False 
        ziptxtbox.Visible = True 
        ziptxtbox.BorderStyle = BorderStyle.FixedSingle 
        ziptxtbox.TabStop = True 
        ziptxtbox.TabIndex = 8 
        ziptxtbox.BackColor = Color.White 
        ziptxtbox.ForeColor = Color.Black 

        countrytxtbox.Enabled = False 
        countrytxtbox.Visible = True 
        countrytxtbox.BorderStyle = BorderStyle.FixedSingle 
        countrytxtbox.TabStop = True 
        countrytxtbox.TabIndex = 9 
        countrytxtbox.BackColor = Color.White 
        countrytxtbox.ForeColor = Color.Black 

        celltxtbox.Enabled = False 
        celltxtbox.Visible = True 
        celltxtbox.BorderStyle = BorderStyle.FixedSingle 
        celltxtbox.TabStop = True 
        celltxtbox.TabIndex = 10 
        celltxtbox.BackColor = Color.White 
        celltxtbox.ForeColor = Color.Black 

        studentidtxtbox.Enabled = False 
        studentidtxtbox.Visible = True 
        studentidtxtbox.BorderStyle = BorderStyle.FixedSingle 
        studentidtxtbox.TabStop = True 
        studentidtxtbox.TabIndex = 11 
        studentidtxtbox.BackColor = Color.White 
        studentidtxtbox.ForeColor = Color.Black 

        fnamelabel.Visible = True 
        mnamelabel.Visible = True 
        lnamelabel.Visible = True 
        addressstreetlabel.Visible = True 
        address2label.Visible = True 
        addresscitylabel.Visible = True 
        addressstatelabel.Visible = True 
        addressziplabel.Visible = True 
        addresscountrylabel.Visible = True 
        celllabel.Visible = True 
        studentidlabel.Visible = True 
       End If 

       For Each DataRow In dt.Rows 
        If stunumtxtbox.Text = dt.Rows(0)("studentId").ToString Then 
         fnametxtbox.Text = dt.Rows(0)("firstName").ToString 
         mnametxtbox.Text = dt.Rows(0)("midleInitial").ToString 
         lnametxtbox.Text = dt.Rows(0)("lastName").ToString 
         addresstxtbox.Text = dt.Rows(0)("addressStreet").ToString 
         address2txtbox.Text = dt.Rows(0)("addressOption").ToString 
         citytxtbox.Text = dt.Rows(0)("addressCity").ToString 
         statetxtbox.Text = dt.Rows(0)("addressState").ToString 
         ziptxtbox.Text = dt.Rows(0)("addressZip").ToString 
         countrytxtbox.Text = dt.Rows(0)("addressCountry").ToString 
         celltxtbox.Text = dt.Rows(0)("contactcellphone").ToString 
         studentidtxtbox.Text = dt.Rows(0)("studentId").ToString 
         StudentNameTextBox.Text = lnametxtbox.Text + "," + " " + fnametxtbox.Text + " " + mnametxtbox.Text 
        Else 
         fnamelabel.Visible = False 
         mnamelabel.Visible = False 
         lnamelabel.Visible = False 
         addressstreetlabel.Visible = False 
         address2label.Visible = False 
         addresscitylabel.Visible = False 
         addressstatelabel.Visible = False 
         addressziplabel.Visible = False 
         addresscountrylabel.Visible = False 
         celllabel.Visible = False 
         studentidlabel.Visible = False 
        End If 
       Next 
      End Using 
     Catch se As SqlException 
      MsgBox(se.Message) 
     Finally 
     End Try 
    End If 

    stunumtxtbox.Clear() 
    stunumtxtbox.Select() 

End Sub 
0

Некоторое упрощение вашей работы. Если у вашего datatable нет строк, у вас нет совпадений.

Dim count = da.Fill(dt) 
If count = 0 then 
    ' you have no matches 
    ' do you logic for no matches here 
Else 
    ' fill data 
fnametxtbox.Text = dt.Rows(0)("firstName").ToString 
mnametxtbox.Text = dt.Rows(0)("midleInitial").ToString 
lnametxtbox.Text = dt.Rows(0)("lastName").ToString 
addresstxtbox.Text = dt.Rows(0)("addressStreet").ToString 
address2txtbox.Text = dt.Rows(0)("addressOption").ToString 
citytxtbox.Text = dt.Rows(0)("addressCity").ToString 
statetxtbox.Text = dt.Rows(0)("addressState").ToString 
ziptxtbox.Text = dt.Rows(0)("addressZip").ToString 
countrytxtbox.Text = dt.Rows(0)("addressCountry").ToString 
celltxtbox.Text = dt.Rows(0)("contactcellphone").ToString 
studentidtxtbox.Text = dt.Rows(0)("studentId").ToString 
End If 

Try/Catches предназначены для вещей, которые могут взорваться, как это будет взорваться? Простой конкатенации не требуется Try/Catch. И мы используем & в VB для конкатенации. Внешняя часть не поймает все исключения, поскольку вы сузили ее способность уловить только до SqlException.

Try 
    StudentNameTextBox.Text = lnametxtbox.Text + "," + " " + fnametxtbox.Text + " " + mnametxtbox.Text 
Catch ex As Exception 
    MsgBox(ex.Message) 
+0

Я не уверен, что следую вашему первому предложению: «Если у вашего datatable нет строк, у вас нет совпадений». Моя база данных всегда будет иметь строки, так как в ней всегда будут ученики. Я ищу конкретную строку, которая имеет определенное значение, введенное конечным пользователем, и если эта строка не существует, сообщите мне, чтобы я мог выбросить ошибку «не найден» пользователю. Имеет ли это смысл? Я пытаюсь объяснить все, что могу. –

+0

Если ваш запрос db для ученика по id, почему у вас будет больше одной записи?Также смотрите «Параметризированные запросы», чтобы избежать «SQL injection». – OneFineDay

+0

Не будет больше одной записи на student_id. это было бы огромной проблемой lol Спасибо за ваши отзывы ... Я все еще сравниваю и перевариваю ваши рекомендации. –

0

Ваш код делает именно то, что вы говорите. Вы заполняете, и нулевые строки возвращаются, если это не идентификатор в базе данных. Это не исключение, поэтому оно продолжается до закрытия соединения, затем очищает и выбирает окно поиска. Вам нужно проверить нулевые строки, возвращенные, и выбросить исключение в catch или просто выбросить текстовое поле из if/else, где вы проверите нулевое значение. Существует не один способ сделать это ....

-m

P.S. до 'user3288293'

Вы все еще заинтересованы в этом, также ознакомьтесь с последним ответом здесь, он работает.

+0

Спасибо @ Майкл! - У вас было бы предпочтение, как это сделать? Или рекомендацию о том, как вы это сделаете? –

+0

@ user3288293 Я не смотрю на это, так как я опубликовал, вы поняли это или хотите, чтобы я снова посмотрел на него. – Michael

Смежные вопросы