CONEXAO COM BDS...

SPYDREX 10/09/2010 13:40:51
#352624
Olá Pessoal.

Minha dúvida é a seguinte:

Quando fazemos a conexão com algum tipo de banco de dados nós definimos a conexão, acessamos as tabelas e os campos.

Eu gostaria de saber se eu tenho que em cada formulário definir a conexão com o BD ou tem como fazer uma rotina genérica que abra o banco de dados no início de um dado formulário e ela fique aberta e antes de sair do sistema seja fechada a conexão, digo isso porque os códigos de abertura/fechando do BD estão ficando espalhados por todo os formulários que eu crio.

Algueém tem algum exemplo de como fazer isso.


Grato.
ENGALEXANDRE 10/09/2010 15:56:40
#352643
Resposta escolhida
Olá SPYDREX

Você pode criar uma função que faz a conexão com o banco de dados e toda vez que for acessar o banco faça a chamada pelo nome dessa função.

Abaixo coloco o exemplo de uma função que faz a conexão com o PostgreSQL. A função a ser criada varia de banco para banco!
======================================================================
Private Function ObtemConexao() As ADODB.Connection

[ô]*******************************
[ô]* Dimensionamento de variáveis
[ô]*******************************
Dim conexao As ADODB.Connection
conexao = New ADODB.Connection

[ô]*******************************
[ô]* Define parâmetros de conexão
[ô]*******************************
conexao.CommandTimeout = 30
conexao.ConnectionTimeout = 60
conexao.CursorLocation = ADODB.CursorLocationEnum.adUseClient
conexao.ConnectionString = [Ô]Driver={PostgreSQL UNICODE};Server=localhost;Port=5432;Database=SEU_BD;Uid=postgres;Pwd=[ô]SENHA[ô];[Ô]

conexao.Open()

ObtemConexao = conexao

Exit Function
======================================================================

Esse outro exemplo foi tirado do site do Macoratti (www.macoratti.net). Nele não foi criada a função propriamente dita, a conexão com o banco foi feita após o clique de um botão que estava em um formulário, que acredito ser o mesmo que você está fazendo. De qualquer forma, essa conexão pode ser feita em um módulo separado como mostrado acima.

Dim ConexaoPG As String = [Ô]Server=localhost;Port=5432;UserId=postgres;Password=[ô]SENHA[ô];

Database=SEU_BD[Ô]

Dim conn As NpgsqlConnection = Nothing

Try
[ô]Instancia NpgsqlConnection na variavel conn

conn = New NpgsqlConnection(ConexaoPG)

[ô]Abre a conexão

conn.Open()

Nesse último exemplo foi utilizado para conexão com o PostgreSQL o Npgsql.

======================================================================

Abraço,

Alexandre
KILLER 10/09/2010 16:52:23
#352658
você usa conexão ODBC ou .NET?
SPYDREX 10/09/2010 16:58:40
#352660
Citação:

:
Olá SPYDREX

Você pode criar uma função que faz a conexão com o banco de dados e toda vez que for acessar o banco faça a chamada pelo nome dessa função.

Abaixo coloco o exemplo de uma função que faz a conexão com o PostgreSQL. A função a ser criada varia de banco para banco!
======================================================================
Private Function ObtemConexao() As ADODB.Connection

[ô]*******************************
[ô]* Dimensionamento de variáveis
[ô]*******************************
Dim conexao As ADODB.Connection
conexao = New ADODB.Connection

[ô]*******************************
[ô]* Define parâmetros de conexão
[ô]*******************************
conexao.CommandTimeout = 30
conexao.ConnectionTimeout = 60
conexao.CursorLocation = ADODB.CursorLocationEnum.adUseClient
conexao.ConnectionString = [Ô]Driver={PostgreSQL UNICODE};Server=localhost;Port=5432;Database=SEU_BD;Uid=postgres;Pwd=[ô]SENHA[ô];[Ô]

conexao.Open()

ObtemConexao = conexao

Exit Function
======================================================================

Esse outro exemplo foi tirado do site do Macoratti (www.macoratti.net). Nele não foi criada a função propriamente dita, a conexão com o banco foi feita após o clique de um botão que estava em um formulário, que acredito ser o mesmo que você está fazendo. De qualquer forma, essa conexão pode ser feita em um módulo separado como mostrado acima.

Dim ConexaoPG As String = [Ô]Server=localhost;Port=5432;UserId=postgres;Password=[ô]SENHA[ô];

Database=SEU_BD[Ô]

Dim conn As NpgsqlConnection = Nothing

Try
[ô]Instancia NpgsqlConnection na variavel conn

conn = New NpgsqlConnection(ConexaoPG)

[ô]Abre a conexão

conn.Open()

Nesse último exemplo foi utilizado para conexão com o PostgreSQL o Npgsql.

======================================================================

Abraço,

Alexandre



Eu poderia colocar essa função dentro de um módulo ?

como ficaria a chamada dela dentro de um form ?

Grato.
SPYDREX 10/09/2010 17:30:02
#352664
Citação:

:
você usa conexão ODBC ou .NET?



.NET
TECLA 10/09/2010 17:47:37
#352666
Veja se esse vídeo te ajuda.

Usando classe de persistência em VB.Net
http://www.youtube.com/watch?v=7M16jAoewUk
ENGALEXANDRE 10/09/2010 21:32:25
#352685
Olá SPYDREX

- No exemplo que eu fiz, criei um módulo para fazer a conexão com o BD (nesse caso específico utilizo o MySQL) - [txt-color=#0000f0]Módulo[/txt-color] conexao.
- Depois criei outro módulo para realizar a Consulta. [txt-color=#0000f0]Módulo[/txt-color] consulta.
- Depois no evento Load do Form eu chamo a conexão e a consulta. Com isso não preciso fazer a conexão em cada um dos meus formulários.

=========================================================
================= Módulo da conexão =======================
=========================================================

Imports MySql.Data.MySqlClient

Module conexao

Public conn As New MySqlConnection

Public Sub conexaoBD()

conn = New MySqlConnection
conn.ConnectionString = [Ô]server=localhost;database=mysql;Uid=root;password=XXXXXXX;[Ô]
conn.Open()

End Sub

End Module

=========================================================
================= Módulo da consulta =======================
=========================================================

Imports MySql.Data.MySqlClient

Module consulta
Public myCommand As New MySqlCommand
Public myAdapter As New MySqlDataAdapter
Public myData As New DataTable
Public sql As String

Public Sub consultaBD()

sql = [Ô]SELECT * FROM alunos[Ô]

myCommand.Connection = conn
myCommand.CommandText = sql
myAdapter.SelectCommand = myCommand
myAdapter.Fill(myData)
Form1.DataGridView1.DataSource = myData

conn.Close()
conn.Dispose()

End Sub

End Module

=========================================================
================= Evento Load do Form =======================
=========================================================

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

conexaoBD()
consultaBD()

End Sub

End Class

=========================================================

Espero que tenha entendido.

Abraço,

Alexandre





SPYDREX 14/09/2010 11:55:25
#352955
Citação:

:
Olá SPYDREX

- No exemplo que eu fiz, criei um módulo para fazer a conexão com o BD (nesse caso específico utilizo o MySQL) - [txt-color=#0000f0]Módulo[/txt-color] conexao.
- Depois criei outro módulo para realizar a Consulta. [txt-color=#0000f0]Módulo[/txt-color] consulta.
- Depois no evento Load do Form eu chamo a conexão e a consulta. Com isso não preciso fazer a conexão em cada um dos meus formulários.

=========================================================
================= Módulo da conexão =======================
=========================================================

Imports MySql.Data.MySqlClient

Module conexao

Public conn As New MySqlConnection

Public Sub conexaoBD()

conn = New MySqlConnection
conn.ConnectionString = [Ô]server=localhost;database=mysql;Uid=root;password=XXXXXXX;[Ô]
conn.Open()

End Sub

End Module

=========================================================
================= Módulo da consulta =======================
=========================================================

Imports MySql.Data.MySqlClient

Module consulta
Public myCommand As New MySqlCommand
Public myAdapter As New MySqlDataAdapter
Public myData As New DataTable
Public sql As String

Public Sub consultaBD()

sql = [Ô]SELECT * FROM alunos[Ô]

myCommand.Connection = conn
myCommand.CommandText = sql
myAdapter.SelectCommand = myCommand
myAdapter.Fill(myData)
Form1.DataGridView1.DataSource = myData

conn.Close()
conn.Dispose()

End Sub

End Module

=========================================================
================= Evento Load do Form =======================
=========================================================

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

conexaoBD()
consultaBD()

End Sub

End Class

=========================================================

Espero que tenha entendido.

Abraço,

Alexandre







Caro ENGALEXANDRE

Realmente achei muito interessante essa tua abordagem e acredito ser uma solução legal.

Tenho mais uma dúvida que acredito que gerará alguma discussão acalorada aqui, ela é a que segue:

Tenho visto em muitos exemplos que para fazer a conexão com os bancos de dados e colocado no código o Provider, ip, usr, passw, etc...
Não sei se é porque eu sou muito encanado com o assunto segurança, porque eu sou totalmente contra ter essas informações passados via linha de programa, pois qualquer descompilador pode recuperar o código e de posse dessas informações algum carinha mal intencionado pode fazer misérias na base de dados, tipo de sacanagem apagar todos os registros da tabela clientes por exemplo, já que tais login permitem execução de tais procedimentos no BD, eu entendo que ao invés de passar essas informações via linha de programação seja solicitada do usuário e depois enviada como complemento da string do Provider.

é claro que se o usuário tiver um daqueles keylogger no computador com certeza vai dar problema, mas você teria pelo menos como saber de onde partiu tal problema.

Mas o lado bom da coisa é que a segurança de login/senha será concentrada no BD, tirando essa responsabilidade das costas do programador.

O que você(s) acha(m) da idéia ?, Será que estou viajando ?, Existe alguma impementação assim ?, Existe algum exemplo para tirar algumas idéias.

Grato.
ENGALEXANDRE 14/09/2010 12:11:31
#352957
Olá SPYDREX

Essa sua questão é pertinente. Nos exemplos que eu coloquei, o fiz de forma [Ô]genérica[Ô], ou seja, passando a string de conexão direto no código fonte.
Uma das coisas que eu faço é utilizar um XML que guarda as informações dos parâmetros da conexão. Esse XML fica dentro de um diretório que eu quiser. Sendo assim, passo as informações da conexão com o BD via XML, não deixando nenhum dado como IP, Usuário e Senha de forma explícita no código fonte.

À noite mostro como faço isso em projetos que tenho. Onde estou não disponho do Visual Studio no momento.

Abraço,

Alexandre
Tópico encerrado , respostas não são mais permitidas