VB e MySQL - Preenchendo um MSFlexGrid e um ListView
Você já deve saber que podemos acessar o MySQL usando o VB. É muito simples e eu já tratei deste assunto nos artigos:
Neste artigo vou mostrar como podemos acessar o MySQL e preencher dois controles básicos : MSFlexGrid e ListView.
Você vai precisar ter instalado o MySQL e o MyOBDC 3.5x em seu computador. Você pode pegar estes programas gratuitamente no site www.mysql.com . Seria bom você também instalar uma ferramenta com interface gráfica para administrar o MySQL : criar banco de dados , tabelas , inserir registros. Existem algumas opções que são free (Free Mascon); no link http://dev.mysql.com/downloads/administrator/index.html você pode pegar o MySQL Administrator que é muito útil.
Se você estiver instalando o MySQL pela primeira vez vai notar que ele vem com dois banco de dados : mysql e test. Neste exemplo eu criei um banco de dados Clientes e uma tabela Agenda com a estrutura mostrada abaixo:
Você pode criar este banco de dados diretamente da ferramenta gráfica ou usar os comandos da linha de prompt do MySQL. Uma forma simples de fazer isto é a seguinte :
O argumento OPTION é usado para informar o Conector ODBC 3.51 que o cliente não é 100% compatível com ODBC. A lista dos principais valores para o argumento OPTION é a seguinte :
Bit | Descrição |
1 | O cliente não pode tratar que o Connector/ODBC retorne a largura real da coluna. |
2 | O cliente não pode tratar que o MySQL retone o valor de linhas afetadas. |
8 | Não define qualque pacote limite para results e parametros. |
32 | Habilita ou desabilita o suporte ao cursor dinamico. |
64 | Ignora o uso do nome do banco de dados em : 'database.table.column'. |
128 | Força o uso do gerenciador de cursor ODBC. |
512 | Faz os campos CHAR preencher o comprimento da coluna. |
1024 | SQLDescribeCol() irá retornar o nome completo das colunas. |
2048 | Usa o protocolo compactado do server/client. |
4096 | Informa o servidor para ignorar espaco depois do nome da função e antes de '(' . |
8192 | Conecta com o Connect
with named pipes to a mysqld server running
on NT. |
16384 | Altera colunas LONGLONG columns para colunas INT. |
65536 | Lê parametros do cliente e grupos odbc do `my.cnf' |
262144 | Desabilita transações. |
1048576 | Não guarda em chace os resultados locais no driver, ao invés , lê do servidor. |
Você pode combinar mais de uma opção no argumento OPTION concantenando os valores com (+). Ex: ( 4+8).
Bem , vamos ao nosso projeto. Inicie o VB e crie um novo projeto do tipo STANDARD EXE.
Inclua no projeto a referência a biblioteca ADO - Microsoft ActiveX Data Objects 2.x - e os componentes : Microsoft MSFlexGrid Control e Microsoft Tabbed Dialog Control e Microsoft Wndows Common Controls 6.0 ( ListView)..
Inclua no formulário o SSTab . Na primeira Tab insira o MSFlexGrid e na segunda o ListView. Abaixo insira um botão de comando. O layout do formulário deve ser parecido com :
Na seção - General Declarations - do formulário insira o código :
Dim conn As
ADODB.Connection
Dim rs As ADODB.Recordset
No evento Click do botão de comando vamos incluir o
código que vai fazer a conexão com o MySQL e chamar as rotinas
: encheGrid() e encheList().
Private
Sub Command1_Click() Dim conn As ADODB.Connection Set conn = New ADODB.Connection Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset conn.CursorLocation = adUseClient conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _ & "SERVER=127.0.0.1;" _ & "DATABASE=Clientes;" _ & "UID=macoratti;" _ & "PWD=jcm;" _ & "OPTION=" & 1 + 2 + 8 + 32 + 2048 + 16384 conn.Open rs.Open "SELECT * FROM Agenda", conn, adOpenDynamic, adLockOptimistic Call encheGrid(rs, MSFlexGrid1) rs.MoveFirst Call encheList(ListView1, rs) rs.MoveFirst rs.Close Set rs = Nothing conn.Close Set conn = Nothing End Sub |
A string de conexão
realiza a conexçao com o banco de dados Clientes. O servidor é local - 127.0.0.1 O usuário usado é macoratti e a senha jcm A rotina encheGrid() passa dois
parâmetros : A rotina encheList()
passa dois parâmetros:
|
A rotina para preencher o MsflexGrid esta no próprio formulário é a seguinte :
Public
Sub encheGrid(rs As ADODB.Recordset, msfGrid As
MSFlexGrid) Dim coluna As Integer Dim linha As Integer Dim largura_coluna() As Single Dim largura_campo As Single ' define linhas fixas igual a uma e não usa colunas fixas msfGrid.Rows = 2 msfGrid.FixedRows = 1 msfGrid.FixedCols = 0 ' define o numero de linhas e colunas e cria uma matrix com o total de registros a exibir msfGrid.Rows = 1 msfGrid.Cols = rs.Fields.Count ReDim largura_coluna(0 To rs.Fields.Count - 1) ' exibe os cabeçalhos das colunas For coluna = 0 To rs.Fields.Count - 1 msfGrid.TextMatrix(0, coluna) = rs.Fields(coluna).Name largura_coluna(coluna) = TextWidth(rs.Fields(coluna).Name) Next coluna ' exibe o valor de cada linha linha = 1 Do While Not rs.EOF msfGrid.Rows = msfGrid.Rows + 1 For coluna = 0 To rs.Fields.Count - 1 msfGrid.TextMatrix(linha, coluna) = rs.Fields(coluna).Value ' verifica o tamanho dos campos largura_campo = TextWidth(rs.Fields(coluna).Value) If largura_coluna(coluna) < largura_campo Then largura_coluna(coluna) = largura_campo Next coluna rs.MoveNext linha = linha + 1 Loop ' fecha o recordset e a conexao 'rs.Close 'conn.Close ' define a largura das colunas do grid For coluna = 0 To msfGrid.Cols - 1 msfGrid.ColWidth(coluna) = largura_coluna(coluna) + 300 Next coluna End Sub |
Vamos colocar a rotina que preenche o ListView em um módulo. Para isto , no menu selecione Project | Add Module e de o nome a ao modulo de vbmysql. Agora insira o seguinte código no módulo :
Declare
Function SendMessage Lib "user32" Alias
"SendMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long Private Const LVM_SETITEMCOUNT As Long = 4096 + 47 Public Sub
encheList(lvwData As Control, rs As ADODB.Recordset) |
Pronto para rodar o projeto ? Pressione F5 e você deverá obter como resultado o seguinte:
Neste artigo você reviu como fazer a conexão ADO com o MySQL usando o conector MyODBC e ganhou duas rotinas genéricas para preencher Grids.
Eu sei , é apenas Visual Basic , mas eu gosto !
José Carlos Macoratti