2016-01-10 2 views
2

Я пытаюсь сравнить значение combobox с данными, хранящимися уже в базе данных, если данных не существует, тогда пользователю следует сообщить, что он должен выбрать запись из списка или запишите имя, которое уже существует в базе данных!Как сравнить значение поля со списком со значением таблицы, хранящимся в SQL Server

Ниже код, который я написал для него:

Private Sub btnsave_Click(sender As Object, e As EventArgs) Handles btnsave.Click 
    Try 
    'Declare new data adapter and new datatable for publisher id & Auhtor id and ISBN 
    ' to check record exist already or no 
    Dim pda As New SqlDataAdapter 
    Dim pdt As DataTable 
    Dim matchPub_name As String = cboPub_id.Text 
    pda = New SqlDataAdapter("SELECT pub_name FROM publisher WHERE pub_name [email protected]_name", cn) 
    pdt = New DataTable 
    pda.Fill(pdt) 


    Dim ada As New SqlDataAdapter 
    Dim adt As DataTable 
    Dim matchAuthor_name As String = cboAuthor_id.Text 
    ada = New SqlDataAdapter("SELECT author_name FROM author WHERE author_name =" & matchAuthor_name, cn) 
    adt = New DataTable 
    ada.Fill(adt) 


    Dim matchISBN As String = txtisbn.Text.ToString 
    da = New SqlDataAdapter("SELECT isbn from book WHERE isbn =" & "'" & matchISBN & "'", cn) 
    dt = New DataTable 
    da.Fill(dt) 

    If pdt.Rows.Count = -1 Then 
     lblAlert.BackColor = Color.HotPink 
     ErrorProvider1.SetError(cboPub_id, _ 
           "*Please Select or type available Publishers or register new in Publisher form") 
     lblAlert.Text = "Check Respected Error" 
     lblInfo.Text = "" 
    ElseIf adt.Rows.Count = -1 Then 
     lblAlert.BackColor = Color.HotPink 
     ErrorProvider1.SetError(cboAuthor_id, _ 
           "*Please Select or type available Authors or register new in Author form") 
     lblAlert.Text = "Check Respected Error" 
     lblInfo.Text = "" 
    ElseIf dt.Rows.Count > 0 Then 
     lblAlert.BackColor = Color.HotPink 
     ErrorProvider1.SetError(cboAuthor_id, _ 
           "*a record with provided ISBN already exist in Database. Insert Unique ISBN") 
     lblAlert.Text = "Check Respected Error" 
     lblInfo.Text = "" 
    Else 
     'Insert into Book Table 
     cmd = New SqlCommand("Insert into book(isbn, book_name, price, rack_no, no_of_books, staff_id, " _ 
          & " pub_id, sub_code, author_id) values(@isbn, @book_name, @price, @rack_no, " _ 
          & " @no_of_books, @staff_id, @pub_id, @sub_code, @author_id)", cn) 
     With cmd.Parameters 
      .AddWithValue("@isbn", txtisbn.Text).ToString() 
      .AddWithValue("@book_name", txtbook_name.Text) 
      .AddWithValue("@price", txtprice.Text) 
      .AddWithValue("@rack_no", txtrack_no.Text) 
      .AddWithValue("@no_of_books", TxtNo_of_Books.Text) 
      .AddWithValue("@staff_id", Convert.ToInt32(cboStaff_id.SelectedValue.ToString())) 
      .AddWithValue("@pub_id", Convert.ToInt32(cboPub_id.SelectedValue.ToString())) 
      .AddWithValue("@sub_code", cboSub_Code.Text) 
      .AddWithValue("@author_id", cboAuthor_id.SelectedValue) 
     End With 
     cmd.ExecuteNonQuery() 

     'Insert into Published_by Table 
     cmd = New SqlCommand("Insert into published_by(isbn, pub_id, pub_date, vol_no) " _ 
          & " values(@isbn, @pub_id, @pub_date, @vol_no)", cn) 
     cmd.Parameters.AddWithValue("@isbn", txtisbn.Text).ToString() 
     cmd.Parameters.AddWithValue("@pub_id", Convert.ToInt32(cboPub_id.SelectedValue.ToString())) 
     cmd.Parameters.AddWithValue("@pub_date", DateTimePicker1.Text) 
     cmd.Parameters.AddWithValue("@vol_no", txtvol_no.Text) 
     cmd.ExecuteNonQuery() 
     'Insert into Authored_by Table 
     cmd = New SqlCommand("Insert into authored_by(isbn, author_id, completion_date) " _ 
          & " values(@isbn, @author_id, @completion_date)", cn) 
     cmd.Parameters.AddWithValue("@isbn", txtisbn.Text).ToString() 
     cmd.Parameters.AddWithValue("@author_id", cboAuthor_id.SelectedValue) 
     cmd.Parameters.AddWithValue("@completion_date", dtpCompletion_Date.Text) 
     cmd.ExecuteNonQuery() 
     'MessageBox.Show("Record Saved Successfully", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information) 
     lblAlert.Text = "" 
     lblInfo.Text = "Saved" 
    End If 
    Catch ex As Exception 
    MessageBox.Show("Not Completed Because OF The Following Error " & "%" & ex.Message & "%", "Error", _ 
    '    MessageBoxButtons.OK, MessageBoxIcon.Error) 
    End Try 

, но когда я ввод данных в cboAuthor_Name, который не доступен в БД дает ошибку Invalid column name ' '

, как справиться с этим? любая помощь?

+0

a) dont concat SQL никогда - всегда используйте параметры SQL. b) cboAuthor_Name не упоминается там, не уверен, как этот код относится к проблеме. – Plutonix

+0

Несколько разъяснений: pub_name - это столбец текста типа? и вы объявляете переменную dt, но заполняете pdt. Это опечатка? – Steve

+0

@Steve да, это была опечатка, только что отредактированная, и да pub_name - это текст – Hazmat

ответ

0

В коде есть пара проблем. Хуже всего - конкатенация строк для создания SQL-запроса. Тогда есть меньший в использовании SqlDataAdapter, заполняющий DataTable, только чтобы обнаружить, существует ли запись или нет.

Вы можете изменить свой код

Private Sub btnsave_Click(sender As Object, e As EventArgs) Handles btnsave.Click 

    Dim matchPub_name As String = cboPub_name.Text 
    Dim matchAuthor_name As String = cboAuthor_id.Text 
    Dim matchISBN As String = txtisbn.Text.ToString 

    Using conn = new SqlConnection(....constring here ....) 
    Using cmd = new SqlCommand("SELECT pub_name FROM publisher WHERE pub_name = @name", conn) 
     conn.Open 
     cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = matchPub_name 
     Dim publisherName = cmd.ExecuteScalar() 
     if publisherName is Nothing Then 
       lblAlert.BackColor = Color.HotPink 
       ErrorProvider1.SetError(cboPub_name, _ 
           "*Please Select .....") 
       lblAlert.Text = "Check Respected Error" 
       lblInfo.Text = "" 
       Return 
     End If 

     cmd.CommandText = "SELECT author_name FROM author WHERE author_name = @name" 
     cmd.Parameters("@name").Value = matchAuthor_name 
     Dim authorName = cmd.ExecuteScalar() 
     if authorName is Nothing Then 
      lblAlert.BackColor = Color.HotPink 
      ErrorProvider1.SetError(cboAuthor_name, _ 
           "*Please Select .....") 
      lblAlert.Text = "Check Respected Error" 
      lblInfo.Text = "" 
      Return 
     End If 
     cmd.CommandText = "SELECT isbn from book WHERE isbn = @name" 
     cmd.Parameters("@name").Value = matchISBN 
     Dim isbnCode = cmd.ExecuteScalar() 
     if isbnCode IsNot Nothing Then 
      lblAlert.BackColor = Color.HotPink 
      ErrorProvider1.SetError(txtISBN, _ 
           "*ISBN Exists .....") 
      lblAlert.Text = "Check Respected Error" 
      lblInfo.Text = "" 
      Return 
     End If 
     ' Now insert into Book Table ' 
    End Using 
    End Using 
End Sub 

Использование параметров является правильным способом для передачи значений в базе данных вместо того, чтобы строить текст, который является предметом разбора проблем (исходный код не попадает в одиночную кавычку по всему имя) и Sql Injection. Использование непосредственно команды с ExecuteScalar не требует создания данных. ExecuteScalar возвращает первый столбец первой строки, если таковой имеется, в противном случае возврат ничего.
Обратите также внимание на то, что я не использую глобальный объект подключения, а создаю его на месте и уничтожаю его с помощью блока «Использование». Существует механизм, называемый Connection Pooling, который позволяет легко и быстро восстанавливать объекты, такие как соединение.

+0

Стив может ли я добавить больше 'if conditions'? здесь я только что опубликовал привязку моего кода, на самом деле у меня есть один авторский combobox, чтобы проверить его так же, как имя издателя, а также мне нужно сравнить таблицу pk (ISBN), чтобы она не была дублирующимся значением, и если все это удалось, то я хочу, чтобы моя запись была сохранена! – Hazmat

+0

Если вам нужно проверить две разные таблицы, вам понадобятся две разные команды sql. Поэтому, если у вас также есть таблица авторов (и вам нужно проверить, существует ли автор), и если у вас есть таблица книг, чтобы проверить, существует ли ISBN, вам нужно искать каждую таблицу. Или, возможно, вы должны предоставить свой пользовательский интерфейс с фиксированным выбором. Не позволяйте выбрать из вашего списка выпадающих списков что-то, что не существует (IE.ComboBoxStyle. DropDownList вместо DropDown) – Steve

+0

, но если я выберу DropDownList и в списке будет больше данных, как пользователь будет искать все эти данные? Вот почему я изменил стиль на Dropdown, чтобы либо пользователь должен выбрать элемент из списка, либо ввести его! – Hazmat

0
 con.Open(); 
     SqlCommand cmd = new SqlCommand("sp_Addbookdetails", con); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@class", ddlclass.SelectedValue.ToString()); 
     cmd.Parameters.AddWithValue("@Booktype", txtbktype.Text); 
     cmd.Parameters.AddWithValue("@Quantity", Convert.ToInt32(txtqty.Text)); 
     cmd.Parameters.AddWithValue("@price", Convert.ToInt32(txtPrice.Text)); 
Смежные вопросы