2014-09-18 2 views
-1

У меня есть программное обеспечение базы данных, которое я пытаюсь сделать. Проблема в том, что я не могу найти, как это сделать, я новичок в этом и очень много разобрался, но я не могу сделать эту простую задачу?VB.net - Если 1, то «Да», если 0, то «нет»

У меня есть listView, который отображает данные из SQl. Все работает отлично. EXCEPT. Мне нужно окно dropdown. Скажем да или нет, но импортируйте в базу данных SQL 1 или 0, а также в моем списке, мне нужно, чтобы он отображался a Да или Нет вместо 1 или 0? Заранее спасибо

Код:

Imports System.Data.SqlClient 
Imports System.Data 

Public Class cmListAll 
Dim cn As New SqlConnection 
Dim cmd As SqlCommand 
Dim dr As SqlDataReader 

Private Sub frmReg_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    With Me.cboActive 
     .Items.Add("Yes") 
     .Items.Add("No") 
     .SelectedIndex = 0 
    End With 
    Call connectMeToSQLServer("Data Source=Database;Initial Catalog=db_XXX;Integrated Security=False;Uid=sa; Pwd=PASS;") 
    Call showList() 
End Sub 

Private Sub cboActive_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) 
    e.Handled = True 
End Sub 

Private Sub cboACTIVE_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Me.txtCredentials.Focus() 
End Sub 

Sub connectMeToSQLServer(ByVal cnString As String) 
    Try 
     With cn 
      If .State = ConnectionState.Open Then .Close() 
      .ConnectionString = cnString 
      .Open() 
     End With 
    Catch ex As Exception 
     MsgBox(ex.Message.ToString) 
    End Try 
End Sub 

Function INC() As Boolean 
    For Each t In Me.GroupBox2.Controls 
     If TypeOf t Is TextBox Or TypeOf t Is ComboBox Then 

     End If 
     If t.Text = "" Then 
      INC = True 
     End If 
    Next 
End Function 

Sub showList() 
    cmd = New SqlCommand 
    cmd.Connection = cn 
    cmd.CommandText = "Select * from [Case Managers]" 
    dr = cmd.ExecuteReader 

    Me.ListView1.Items.Clear() 
    While dr.Read 
     With Me.ListView1 
      .Items.Add(dr(0)) 
      With .Items(.Items.Count - 1).SubItems 
       .Add(dr(1)) 
       .Add(dr(2)) 
       .Add(dr(3)) 
       .Add(dr(4)) 
      End With 
     End With 
    End While 
    dr.Close() 
End Sub 

Sub clearMe() 
    For Each t In Me.GroupBox2.Controls 
     If TypeOf t Is TextBox Then 
      If t.Text <> "" Then 
       t.text = "" 
      End If 
      Me.cmdNew.Enabled = True 
      Me.cmdSave.Text = "&Save" 
      Me.cmdSave.Enabled = False 
      Me.cmdDelete.Enabled = False 
      Me.cboActive.SelectedIndex = 0 
     End If 
    Next 
End Sub 

Private Sub cmdNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdNew.Click 
    For Each t In Me.GroupBox2.Controls 
     If TypeOf t Is TextBox Then 
      If t.Text <> "" Then 
       t.text = "" 
      End If 
     End If 
    Next 
    Me.cmdNew.Enabled = False 
    Me.cmdSave.Tag = "SAVE" 
    Me.cmdSave.Text = "&Save" 
    Me.cmdSave.Enabled = True 
    Me.GroupBox2.Enabled = True 
    Me.txtfirstname.Focus() 
End Sub 

Private Sub cmdSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSave.Click 
    Select Case Me.cmdSave.Tag 
     Case "SAVE" 
      If INC() = True Then 
       MsgBox("Please Complete All Fields!", MsgBoxStyle.Exclamation, "") 
       Exit Sub 
      Else 
       cmd = New SqlCommand 
       cmd.CommandText = "Insert Into [Case Managers](Firstname,Lastname,Credentials,Active) Values('" & Me.txtfirstname.Text & "', '" & Me.txtlastname.Text & "', '" & Me.txtCredentials.Text & "', '" & Me.cboActive.Text & "')" 
       cmd.Connection = cn 
       cmd.ExecuteNonQuery() 
       MsgBox("Successfully Save!", MsgBoxStyle.Information, "") 
      End If 
     Case Else 
      cmd = New SqlCommand 
      cmd.Connection = cn 
      cmd.CommandText = "Update [Case Managers] Set firstname='" & Me.txtfirstname.Text & "', lastname='" & Me.txtlastname.Text & "', credentials='" & Me.txtCredentials.Text & "', active='" & Me.cboActive.Text & "' Where CaseMangerID = " & Me.ListView1.SelectedItems(0).Text & "" 
      cmd.ExecuteNonQuery() 
      MsgBox("Successfully Updated!", MsgBoxStyle.Information, "") 
    End Select 
    clearMe() 
    showList() 
End Sub 

Private Sub ListView1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.DoubleClick 
    cmd = New SqlCommand 
    cmd.Connection = cn 
    cmd.CommandText = "Select * from [Case Managers] Where CaseMangerID = " & Me.ListView1.SelectedItems(0).Text & " " 
    dr = cmd.ExecuteReader 
    dr.Read() 
    Me.txtfirstname.Text = dr(1) 
    Me.txtlastname.Text = dr(2) 
    Me.txtCredentials.Text = dr(3) 
    Me.cboActive.Text = dr(4) 
    dr.Close() 
    Me.GroupBox2.Enabled = True 
    Me.cmdSave.Enabled = True 
    Me.cmdSave.Tag = "UPDATE" 
    Me.cmdSave.Text = "&Update" 
    Me.cmdDelete.Enabled = True 
End Sub 

Private Sub cmdDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDelete.Click 
    If MsgBox("Delete This Record?", MsgBoxStyle.Question + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then 
     cmd = New SqlCommand 
     cmd.Connection = cn 
     cmd.CommandText = "Delete from [Case Managers] Where CaseMangerID =" & Me.ListView1.SelectedItems(0).Text & " " 
     cmd.ExecuteNonQuery() 
     MsgBox("Successfully Deleted!", MsgBoxStyle.Information, "") 
     Me.cmdDelete.Enabled = False 
     Me.cmdSave.Enabled = False 
     Call clearMe() 
     Call showList() 
    Else 
     Exit Sub 
    End If 
End Sub 
+0

Не используйте ключевое слово Call в vb.net. Кроме того, не используйте пользователя sa. Наконец, несколько операторов sql уязвимы для SQL-инъекций. Они практически просят взломать. –

+0

Ваш код уязвим для SQL-инъекции. Вы действительно должны использовать параметры для отправки информации, предоставленной пользователем в базу данных. – SchmitzIT

+4

Удалите ненужный код, просто покажите, где проблема. – OneFineDay

ответ

1

Я предполагаю, что вы смотрите на этой линии:

Me.cboActive.Text = dr(4) 

? Это единственное, что казалось мне похожим на отображение поля да/нет. Вы можете просто поставить простой Если/Else блок, но так как есть несколько других существенных недостатков в том, как структурирована этот код, я подумал, что было бы полезно заново написать, что весь метод для вас:

Private Sub ListView1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.DoubleClick 
    'Would be better to specify column names here 
    Dim sql As String = "Select * from [Case Managers] Where CaseMangerID = @CaseManager" 

    'Best practices in most cases call for creating a new connection object for each query 
    Using cn As New SqlConnection("connection string here"), _ 
      cmd As New SqlCommand(sql, cn) 

     'This is how to do string substitution in sql to protect against sql injection 
     cmd.Parameters.Add("@CaseManager", SqlDbType.Int).Value = CInt(Me.ListView1.SelectedItems(0).Text) 

     Using dr As SqlDataReader = cmd.ExecuteReader() 
      dr.Read() 
      Me.txtfirstname.Text = dr(1) 
      Me.txtlastname.Text = dr(2) 
      Me.txtCredentials.Text = dr(3) 
      Me.cboActive.Text = If(dr(4)=0,"No","Yes") 
      dr.Close() 
     End Using 
    End Using 'No need to close the connection. The Using block takes care of it 
    'The old code would have the left the connection open if an exception was thrown,' 
    ' which could eventually lock you out of the database 

    Me.GroupBox2.Enabled = True 
    Me.cmdSave.Enabled = True 
    Me.cmdSave.Tag = "UPDATE" 
    Me.cmdSave.Text = "&Update" 
    Me.cmdDelete.Enabled = True 
End Sub 

Вам нужно будет сделать что-то подобное позже, чтобы инвертировать это для обновлений/вставок.

+0

Большое спасибо! – InFeKtId

0

Вы можете использовать DisplayMember/ValueMember пары:

Dim dict As New Dictionary(Of Integer, String) 
dict.Add(0, "No") 
dict.Add(1, "Yes") 

With Me.cboActive 
    .DisplayMember = "Value" 
    .ValueMember = "Key" 
    .DataSource = dict.ToList() 
    .SelectedIndex = 0 
End With 

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

Затем просто используйте cboActive.SelectedValue и передайте это запрос SQL.

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