locked
Banco de dados RRS feed

  • Pergunta

  • Olá amigos do MSDN, continuo tentando dar agora um segundo passo no entendimento de banco de dados. Consegui copiando, montar uma ultra simples tabela.

    Tenho essa configuração:

    Imports System.Data.OleDb
    Public Class Class1
        Private dbcon As New OleDbConnection("Provider = microsoft.ace.OLEDB.12.0 ; DATA SOURCE = D:\WindowsApplication1\WindowsApplication1\nomes.accdb")
        Private DBCmd As OleDbCommand
        Private DBDA As OleDbDataAdapter
        Public dbdt As DataTable
        Public Sub executquery(ByVal query As String)
            Try
                dbcon.Open()
                DBCmd = New OleDbCommand(query, dbcon)
                dbdt = New DataTable
                DBDA = New OleDbDataAdapter(DBCmd)
                DBDA.Fill(dbdt)
            Catch ex As Exception
                MessageBox.Show("deu bo")
            End Try

        End Sub
    End Class

    Public Class Form1
        Private dados As New Class1
        Private Sub form1_shown(sender As Object, e As EventArgs) Handles Me.Shown
            dados.executquery("select * from tabela1")
            grid.DataSource = dados.dbdt
        End Sub

    A minha intenção é montar a seguinte rotina, usando 1 TextBox no Form, e através desse TextBox quero ir populando o meu banco de dados. Seria algo do tipo, ao colocar um nome no TextBox, automaticamente o programa pesquisaria na tabela do banco de dados se aquele nome já existe, então se o nome já existe,  o TextBox fica com o nome escrito, se o nome ainda não consta na tabela, então o programa automaticamente cadastraria este novo nome que passaria afazer parte do banco de dados.

    Tenho uma rotina que faz isso, só que não trabalha com banco de dados, os nomes fazem parte da rotina e portanto não existe um cadastro para gravar os novos nomes. A rotina é essa:

     'função que auto-completa os nomes
        Dim lst As New List(Of String)
        Dim MySource As New AutoCompleteStringCollection()
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim nomesMatriz = New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4, TextBox5, TextBox6, TextBox7, TextBox8, TextBox9, TextBox10, TextBox11, TextBox12, TextBox13, TextBox14, TextBox15, TextBox16, TextBox17, TextBox18, TextBox19, TextBox20, TextBox21, TextBox22, TextBox23, TextBox24, TextBox25, TextBox26, TextBox27, TextBox28}
            
            lst.Add("Abrãao")
            lst.Add("Alceu")
            lst.Add("Alencar")
            lst.Add("Bernardo")
            lst.Add("Carlos")
            lst.Add("Gustavo")
            lst.Add("Renato")
            lst.Add("Sueli")
            
            MySource.AddRange(lst.ToArray)
            For u = 0 To 27
               nomesMatriz(u).AutoCompleteCustomSource = MySource
            Next
            For u = 0 To 27
               nomesMatriz(u).AutoCompleteMode = AutoCompleteMode.SuggestAppend
            Next
            For u = 0 To 27
                nomesMatriz(u).AutoCompleteSource = AutoCompleteSource.CustomSource
            Next
        End Sub

    End Class

    Quero que o meu banco de dados funcione como nessa rotina, quando entro com a primeira letra do nome, surge uma coluna com todos os nomes que começam com aquela letra. 

    Acredito que para quem conhece sobre banco de dados isso seja muito simples, mas ainda não tenho a menor ideia como fazer essa pequena rotina, alguém pode me dar essa força?

    Grato / Durval

     
    sexta-feira, 6 de abril de 2018 22:02

Respostas

  • Durval Teixeira,

       OKay, consegui simular seu código aqui e funcionou.

       - Vamos organizar as ideias:

       1 - Ler o banco de dados e preencher TODOS os TextBox com o recurso "AutoCompleteCustomSource";
       2 - Criar um botão "Inserir" que irá fazer o "INSERT";
       3 - Disparar uma rotina de "checagem". Essa rotina verificará se o conteúdo do "AutoCompleteCustomSource" JÁ POSSUI o nome na lista;
       3.1 - Caso NÃO exista o nome na lista, então disparará o código abaixo "InsertRow";
       3.2 - Caso exista o nome na lista, então NÃO disparará o código abaixo "InsertRow";

    Public Sub InsertRow(ByVal connectionString As String, ByVal insertSQL As String) Using connection As New OleDbConnection(connectionString) ' The insertSQL string contains a SQL statement that ' inserts a new row in the source table. Dim command As New OleDbCommand(insertSQL) ' Set the Connection to the new OleDbConnection. command.Connection = connection ' Open the connection and execute the insert command. Try connection.Open() command.ExecuteNonQuery() Catch ex As Exception MessageBox.Show("deu erro") End Try ' The connection is automatically closed when the ' code exits the Using block. End Using

    End Sub


      Para o botão...

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\WindowsApplication1\WindowsApplication1\nomes.accdb;Persist Security Info=False;" Dim strSQL = "INSERT INTO Tabela1 ( Codigo, Nome )" 'Modifique de acordo com a sua tabela no Access

            If Not TextBox1.AutoCompleteCustomSource.Contains(TextBox1.Text) Then
                dados.InsertRow(strSQL, strCon)
            End If

    End Sub

       Coloquei a rotina "InsertRow" dentro da sua classe "dados";

       É isso?

    []'s,
    Fabio I.
    • Editado Fabio I segunda-feira, 9 de abril de 2018 12:20
    • Marcado como Resposta Durval Teixeira quarta-feira, 11 de abril de 2018 01:00
    segunda-feira, 9 de abril de 2018 12:13

Todas as Respostas

  • Durval Teixeira,

       Acho que é isso que você procura:

       Existe dentro das propriedades do Textbox em VB.Net uma propriedade chamada "AutoComplete". Veja um exemplo:

    Private Sub Form1_Load(ByVal sender As System.Object, _
                           ByVal e As System.EventArgs) Handles MyBase.Load
    
        ' Create the list to use as the custom source.
        Dim MySource As New AutoCompleteStringCollection()
        MySource.AddRange(New String() _
                            { _
                                "January", _
                                "February", _
                                "March", _
                                "April", _
                                "May", _
                                "June", _
                                "July", _
                                "August", _
                                "September", _
                                "October", _
                                "November", _
                                "December" _
                            })
    
        ' Create and initialize the text box.
        Dim MyTextBox As New TextBox()
        With MyTextBox
            .AutoCompleteCustomSource = MySource
            .AutoCompleteMode = AutoCompleteMode.SuggestAppend
            .AutoCompleteSource = AutoCompleteSource.CustomSource
            .Location = New Point(20, 20)
            .Width = Me.ClientRectangle.Width - 40
            .Visible = True
        End With
    
        ' Add the text box to the form.
        Me.Controls.Add(MyTextBox)
    End Sub

    ========================================================
    Propriedade TextBox.AutoCompleteSource

    https://msdn.microsoft.com/pt-br/library/system.windows.forms.textbox.autocompletesource(v=vs.110).aspx
    ========================================================

        Veja também:

    ========================================================
    VB.NET - Usando o recurso AutoCompletar

    http://www.macoratti.net/09/02/vbn_aad.htm
    ========================================================

    ========================================================
    TEXBOX AUTOCOMPLETE
    http://vbmania.com.br/index.php?modulo=forum&metodo=abrir&id=449687&pagina=1
    ========================================================

    []'s,
    Fabio I.

    sábado, 7 de abril de 2018 23:51
  • Fabio, obrigado por me responder.

    Veja, essa mesma rotina que você me cedeu, ela esta logo acima, nesta mesma pergunta. A minha pergunta diz respeito a como montar uma rotina parecida mas dai num banco de dados, saberia me dar essa força?

    Grato/Durval 

    domingo, 8 de abril de 2018 02:39
  • Durval Teixeira,

       OKay, consegui simular seu código aqui e funcionou.

       - Vamos organizar as ideias:

       1 - Ler o banco de dados e preencher TODOS os TextBox com o recurso "AutoCompleteCustomSource";
       2 - Criar um botão "Inserir" que irá fazer o "INSERT";
       3 - Disparar uma rotina de "checagem". Essa rotina verificará se o conteúdo do "AutoCompleteCustomSource" JÁ POSSUI o nome na lista;
       3.1 - Caso NÃO exista o nome na lista, então disparará o código abaixo "InsertRow";
       3.2 - Caso exista o nome na lista, então NÃO disparará o código abaixo "InsertRow";

    Public Sub InsertRow(ByVal connectionString As String, ByVal insertSQL As String) Using connection As New OleDbConnection(connectionString) ' The insertSQL string contains a SQL statement that ' inserts a new row in the source table. Dim command As New OleDbCommand(insertSQL) ' Set the Connection to the new OleDbConnection. command.Connection = connection ' Open the connection and execute the insert command. Try connection.Open() command.ExecuteNonQuery() Catch ex As Exception MessageBox.Show("deu erro") End Try ' The connection is automatically closed when the ' code exits the Using block. End Using

    End Sub


      Para o botão...

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\WindowsApplication1\WindowsApplication1\nomes.accdb;Persist Security Info=False;" Dim strSQL = "INSERT INTO Tabela1 ( Codigo, Nome )" 'Modifique de acordo com a sua tabela no Access

            If Not TextBox1.AutoCompleteCustomSource.Contains(TextBox1.Text) Then
                dados.InsertRow(strSQL, strCon)
            End If

    End Sub

       Coloquei a rotina "InsertRow" dentro da sua classe "dados";

       É isso?

    []'s,
    Fabio I.
    • Editado Fabio I segunda-feira, 9 de abril de 2018 12:20
    • Marcado como Resposta Durval Teixeira quarta-feira, 11 de abril de 2018 01:00
    segunda-feira, 9 de abril de 2018 12:13