Dicas

Referência MySql for Minigui/Harbour

Agradecimento a Luiz Rafael Kulik (autor)

 

1 - Conectando-se a um Banco de Dados Mysql

1.1 - Abrindo um Banco de Dados MySql
1.2 - Verificar se uma tabela Existe
1.3 - Criando uma tabela nova
1.4 - Selecionando Dados de uma Tabela

1.5 - Criando indíces

1.6 - Apagando indíces

1.7 - Apagando Tabelas

1.8 - Insere Dados

2 - Manual da Classe TMySqlServer e suas Derivadas

2.1 - TMySqlServer:New(cServer, cUser, cPassword)
2.2 - TMySqlServer:Destroy()

2.3 - TMySqlServer:SelectDB(cDBName)

2.4 - TMySqlServer:CreateTable(cTable, aStruct,cPrimaryKey,cUniqueKey,cAuto)

2.5 - TMySqlServer:DeleteTable(cTable)

2.6 - TMySqlServer:TableStruct(cTable)

2.7 - TMySqlServer:CreateIndex(cName, cTable, aFNames, lUnique)

2.8 - TMySqlServer:DeleteIndex(cName, cTable)

2.9 - TMySqlServer:ListDBs()

2.10 - TMySqlServer:ListTables()

2.11 - TMySqlServer:Query(cQuery)

2.12 - TMySqlServer:NetErr() INLINE ::lError

2.13 - TMySqlServer:Error()

2.14 - Complemento da Classe TMysqlServer
2.15 - ClasseTbrowseSql e TBColumnsql

3 - Browse com Tbrowse e Mysql

1 - Conectando-se a um Banco de Dados Mysql

A Primeira coisa é abrir um Banco de Dados Mysql no Servidor. Mas antes de abrir as tabelas, se você for usar a classe tmysql, coloque como static as variáveis oServer e oTable, antes da função main Existe duas formas de se fazer isso conforme a tabela abaixo

Via Função

Local cServer := 'Localhost'
Local cUser := "root"
Local cPassword := ""
local cDataBase:='test', cTable:='Cli',cIndex:='Cli' nSocket := sqlConnect( cServer,Trim( cUser ),Trim( cPassword ) )
if nSocket == 0 // O Acesso Foi Falho
      //Código se não se conectar
endif

Via Classe TMySql

Local cServer := "localhost"
Local cUser := "root"
Local cPassWord := ""
Local cDataBase:='test', cTable:='Cli',cIndex:='Cli' oServer := TMySQLServer():New(cServer, cUser, cPassWord)
if oServer:NetErr()
       //Codigo se não se conectar
Endif


1.1 - Abrindo um Banco de Dados MySql

Uma vez estabelecida a conexão, você deve abrir o bd que está a sua tabela. Existe duas formas de se fazer isso conforme a tabela abaixo

Via Função

IF sqlSelectD( nSocket , cDataBase ) != 0
    ? 'Tabela não existe'
ENDIF

Via Classe TMySql

oServer:SelectDB(cDataBase)
IF oServer:NetErr()
    ? 'Tabela não existe'
ENDIF


1.2 - Verificar se uma tabela Existe

Você pode verificar se uma tabela existe dentro de um Banco de dados Aberto. Existe duas formas de se fazer isso conforme a tabela abaixo

Via Função

aList:=sqlListTbl(nSocket)
if ascan(alist,cTable) > 0 // existe a tabela

Via Classe TMySql

if Ascan(oServer:ListTables(), cTable) >0 existe a tabela


1.3 - Criando uma tabela nova

Você pode Criar uma tabela dentro de um Banco de dados Aberto, se ela não existe. Existe duas formas de se fazer isso conforme a tabela abaixo
a Estrutura teste está abaixo

·         g01_stru1 := array(6)

·         g01_stru1[1]:={'nome','C',40,0}

·         g01_stru1[2]:={'endereco','C',40,0}

·         g01_stru1[3]:={'cep','C',9,0} && operador que fez a ultima

·         g01_stru1[4]:={'dat','D',8,0} && data da ultima atualização

·         g01_stru1[5]:={'hat','C',8,0} && hora da ultima atualização

·         g01_stru1[5]:={'id','I',6,0} && hora da ultima atualização

Via Função

cQuery:= "Create TABLE "+ Ctable +"( nome char(11),endereco char(11),cep char(11), dat date, hat char(11), id int(6));"
if sqlQuery(nSocket, cQuery) == 0
     return .T.
else
     return := .F.
endif

Via Classe TMySql

oServer:CreateTable(cTable, aDbfStruct)
if oServer:NetErr() //Testa se a Tabela foi criada
     ? oServer:Error()
endif


1.4 - Selecionando Dados de uma Tabela

Como antes eu demostrei como Criar uma tabela se não existe, agora vamos abrir uma. O código abaixo mostra como abrir duas tabelas. Suponhamos que no banco de dados aberto exista duas tabelas de nome Cli e func. Vou mostrar como selecionar dados da Cli, da Func e de ambas juntas. Suponha tambem , que a tabela func tem a mesma estrutura da cli mais os campos Cidade C(40), telefone C(10) Existe duas formas de se fazer isso conforme a tabela abaixo

Via Função

local nI, aField, rc ::nSocket := nSocket ::cQuery := cQuery ::lError := .F. ::aFieldStruct := {} ::nCurRow := 1 ::nResultHandle := nil ::nNumFields := 0 ::nNumRows := 0 if (rc := sqlQuery(nSocket, cQuery)) == 0 // save result set if (::nResultHandle := sqlStoreR(nSocket)) > 0 ::nNumRows := sqlNRows(::nResultHandle) ::nNumFields := sqlNumFi(::nResultHandle) for nI := 1 to ::nNumFields aField := sqlFetchF(::nResultHandle) AAdd(::aFieldStruct, aField) next else // Should query have returned rows? (Was it a SELECT like query?) if (::nNumFields := sqlNumFi(nSocket)) == 0 // Was not a SELECT so reset ResultHandle changed by previous sqlStoreR() ::nResultHandle := nil else ::lError := .T. endif endif else ::lError := .T. endif return Self

Via Classe TMySql

// Para a Tabela Cli
oTable := Oserver:Query("SELECT * From Cli")
if oTable:NetError() /* Codigo se nÆo consegui selecionar a tabela */

// Para a Tabela Func

oTable := oServer:Query("SELECT * From func")
if oTable:NetError() /* Codigo se nÆo consegui selecionar a tabela */

// Para ambas as Tabela , selecionando somente os campos nome,id,telefone

oTable := Oserver:Query("SELECT cli.nome,cli.id,func.telefone From Cli,func")
if oTable:NetError() /* Codigo se nÆo consegui selecionar a tabela */

// Para ambas as Tabela , selecionando somente os campos nome,id,telefone e restringindo a pesquisa para cli.id = func.id

oCliFunc := Oserver:Query("SELECT cli.nome,cli.id,func.telefone From Cli,func where cli.id == func.id")
if oClifunc:NetError() /* Codigo se nÆo consegui selecionar a tabela */


1.5 - Criado indices

Algumas vezes , pode ser necessario a criação de arquivos de indices .Existe duas formas de se fazer isso conforme a tabela abaixo

Via Função

cQuery:= "Create INDEX "+ cIndex + " ON "+ Ctable +" nome,endereco);"
if sqlQuery(nSocket, cQuery) == 0
     return .T.
else
     return .F.
endif

Via Classe TMySql

if !oServer:Createindex(cIndex,cTable,{"nome","endereco"},) // Ultimo parametro informa de o indice ‚ unico
/* Codigo para fazer se tabela não foi criada */


1.6 - Apagando indices

Algumas vezes , pode ser necessario a que voce apage um arquivo de indices .Existe duas formas de se fazer isso conforme a tabela abaixo

Via Função

cQuery:= "DROP INDEX "+ cIndex + " FROM "+ Ctable +" ;"
if sqlQuery(nSocket, cQuery) == 0
     return .T.
else
     return .F.
endif

Via Classe TMySql

if !oServer:Dropindex(cIndex,cTable)
/* Codigo para fazer se indice não foi criado */


1.7 - Apagando Tabelas

Algumas vezes , pode ser necessario a que voce apage uma Tabela do banco .Existe duas formas de se fazer isso conforme a tabela abaixo

Via Função

cQuery:= "DROP TABLE "+ Ctable +" ;"
if sqlQuery(nSocket, cQuery) == 0
     return .T.
else
     return .F.
endif

Via Classe TMySql

if !oServer:DropTable(cTable)
/* Codigo para fazer se aTabela nÆo foi apaada */


1.8 - Insere Dados

Uma coisa certa e ter que inserir dados numa tabela,Abaixo um exemplo de codigo para a entrada de dados(baseado na estrutura do cli)

function entradados( oServer)

   local aFDatas := Array(6)
   local cScreen := SaveScreen()
   local n

   cls
   setcolor('w/b,w/b+,w/r,b/w')
   dispbox(0,0,maxrow(),maxcol())
   aFDatas[1] := aFDatas[2] := Space(40)
   aFDatas[3] := Space(9)
   aFDatas[4] := " / / "
   aFDatas[5] := Space(8)
   aFDatas[6] := 0

   @ 2,2 Say 'Nome' get afdatas[1]
   @ 3,2 say 'endereco' get afdatas[2]
   @ 4,2 say 'cep' get afdatas[3]
   @ 3,2 say 'Dat' get afdatas[4]
   @ 4,2 say 'Hat' get afdatas[5]
   @ 6,2 say 'ID' get afdatas[6]
   Read

Existe duas formas de se fazer isso conforme a tabela abaixo

Via Função

cQuery:= "INSERT INTO "+ Ctable +" VALUES ("
for i:=1 to len(AfDatas)
    cQuery += ClipValue2SQL(AfDatas[i]) + ","
next
cQuery := Left(cQuery, Len(cQuery) -1) + ")"
if sqlQuery(nSocket, cQuery) == 0
     return .T.
else
     return .F.
endif

Via Classe TMySql

oRecord := oB:oQuery:GetBlankRow()
for n:=1 to 6
    oRecord:FieldPut(n, afdatas[n])
next
oTable:Append(oRecord) // Vem da ultima query(pesquisa que voce executou(a Otable ‚ declarada static)
if oTable:NetErr()
    Alert(oTable:Error())
    quit
endif


Manual da Classe TMySqlServer e suas Derivadas1 - Conectando-se a um Banco de Dados Mysql

Prezados amigos: aqui esta a referencia completa da Classe TMysqlServer e suas derivadas. A classe TMySqlServer ‚ a mais importante delas, ja que ‚ ela que controla todas as demais classes.


2.1 - TMySqlServer:New(cServer, cUser, cPassword)

Esse ‚ um dos metodos mais importante da Classe TMySqlServer. E esse metodo que ‚ chamado para a conecção com o servidor mysql e retorna o objeto TMysqlServer se a conecção foi bem sucedida

Syntaxe

oServer := TMySqlServer():New( cServer , cUser , cPass )

Parametros

cServer E o endereço do Servidor mysql

cUser E o nome do Usuario

cPass E a senha de conecção

Exemplo

oServer := TMySqlServer( 127.0.0.1, 'root' ,"" )

if oServer:NetError()

? oServer:Error()

Endif


2.2 - TMySqlServer:Destroy()

Esse ‚ um dos metodos mais importante da Classe TMySqlServer. E ele que fecha a conec‡Æo do banco de dados MySql . Ele deve ser sempre chamado quando sair do programa

Syntaxe

oServer:Destroy()

Parametros

NÆo recebe parametros

Exemplo

oServer := TMySqlServer( 127.0.0.1, 'root' ,"" )

Seu codigo que fa‡a alguma coisa

oServer:Destroy()


2.3 - TMySqlServer:SelectDB(cDBName)

Esse metodos abre o banco que dados que contem as duas tabelas

Syntaxe

oServer:SelectDB(cDBName)

Parametros

cDBName Nome do banco de dados a abrir

Exemplo

oServer := TMySqlServer( 127.0.0.1, 'root' ,"" )

oServer:Selectdb('Test') // Abre o banco de dados test

if oServer:NetError()

    oServer:Destroy()

endif


2.4 - TMySqlServer:CreateTable(cTable, aStruct,cPrimaryKey,cUniqueKey,cAuto)

Esse metodo cria novas tabelas em um banco de dados.

Syntaxe

TMySqlServer:CreateTable(cTable, aStruct,cPrimaryKey,cUniqueKey,cAuto)

Parametros

cTable E o nome da tabela a criar

cPrimaryKey E o campo que sera a chave primaria de indice

cUniqueKey E o campo que sera a unico

cAuto E o campo que sera autoincrementado (numerico e sem casas decimais

AStruct E um array com a estrutura a ser criado veja a tabela abaixo

 

Tipo

Descrição

 

C

E um campo Caracter

M

E um campo Memo

N

E um campo Numerico

D

E um campo Data

L

E um campo Logigo

B

E um campo Blob

I

E um campo integer

Exemplo

Local aStru

aStru := array(8)

aStru[1]:={'nome','C',40,0}

aStru[2]:={'endereco','C',40,0}

aStru[3]:={'cep','C',9,0} && operador que fez a ultima

aStru[4]:={'dat','D',8,0} && data da ultima atualizacao

aStru[5]:={'hat','C',8,0} && hora da ultima atualizacao

aStru[6]:={'id','I',6,0} && hora da ultima atualizacao

aStru[7]:={'Dia','L',1,0} && hora da ultima atualizacao

aStru[8]:={'Arquivo','B',6,0} && hora da ultima atualizacao

oServer := TMySqlServer( 127.0.0.1, 'root' ,"" )

oServer:Selectdb('Test') // Abre o banco de dados test

if oServer:NetError()

    oServer:Destroy()

endif

if !oServer:Createdb('test', aStru,"","",id)

    ? "arquivo Nao Criado"

endif



2.5 - TMySqlServer:DeleteTable(cTable)

Esse metodo apaga uma tabela do banco de dados

Syntaxe

oServer:DeleteTable(cTable)

Parametros

cTable Nome da tabela para apagar

Exemplo

oServer := TMySqlServer( 127.0.0.1, 'root' ,"" )

oServer:Selectdb('Test') // Abre o banco de dados test

if oServer:NetError()

    oServer:Destroy()

endif

oServer:DeleteTable('cli') // Apaga a tabela cli


2.6 - TMySqlServer:TableStruct(cTable)

Essa funcao retorna num array a estrutura da tabela

Syntaxe

oServer:TableStruct(cTable)

Parametros

CTable Nome da tabela que queremos saber a sua estrutura

Exemplo

aStru := oServer:TableStruct('Cli')


2.7 - TMySqlServer:CreateIndex(cName, cTable, aFNames, lUnique)

Esse metodos Cria indices para uma tabela no banco de dados

Syntaxe

oServer:CreateIndex(cName, cTable, aFNames, lUnique)

Parametros

cName Nome do Arquivo de indice

cTable Nome da Tabela que esse indice pertence

aFName Um array com os campos que que fazem parte do indice

lUnique Toggle para unico

Exemplo

oServer:CreateIndex("myindex","cli",{"id","hat"},.f.})


2.8 - TMySqlServer:DeleteIndex(cName, cTable)

Esse metodo apaga um arquivo de indice relacionado com uma tabela

Syntaxe

oServer:DeleteIndex(cName, cTable)

Parametros

cName Nome do arquivo de indice a apagar

cTable Nome da tabela onde esse indice esta relacionado

Exemplo

oServer := TMySqlServer( 127.0.0.1, 'root' ,"" )

oServer:Selectdb('Test') // Abre o banco de dados test

if oServer:NetError()

    oServer:Destroy()

endif

oServer:DeleteTable('cli') // Apaga a tabela cli


2.9 - TMySqlServer:ListDBs()

Esse metodo retorna um array com todos os bancos de dados que estão instalado no servidor mysql

Syntaxe

aDbs := oServer:ListDbs()

Parametros

Nenhum

Exemplo

oServer := TMySqlServer( 127.0.0.1, 'root' ,"" )

aDb := oServer:Listdbs()

for n := 1 to len(adb)

    ? adb[n]

Next


2.10 - TMySqlServer:ListTables()

Esse metodo retorna um array com todos as tabelas existentes num determinado bancos de dados

Syntaxe

aDbs := oServer:ListTables()

Parametros

Nenhum

Exemplo

oServer := TMySqlServer( 127.0.0.1, 'root' ,"" )

oServer:Selectdb('Test') // Abre o banco de dados test

if oServer:NetError()

    oServer:Destroy()

endif

aDb := oServer:ListTables()

for n := 1 to len(adb)

    ? adb[n]

Next


2.11 - TMySqlServer:Query(cQuery)

Esse metodo ‚ um dos corações da Classe TMySqlServer. E esse metodo que envia a sua query para o a tabela e retorna um objeto TMySQLQuery or TMySQLTable .

Syntaxe

oTable := oServer:query( "Select * from cli")

Parametros

cQuery  a query que se quer executar

Exemplo

oServer := TMySqlServer( 127.0.0.1, 'root' ,"" )

oServer:Selectdb('Test') // Abre o banco de dados test

if oServer:NetError()

    oServer:Destroy()

endif

oTable := oServer:query("Select * from cli");


2.12 - TMySqlServer:NetErr()

Esse metodo retorna se a operação foi realizada com/sem sucesso

Syntaxe

oServer:Neterr()

Parametros

Nenhum

Exemplo

oServer := TMySqlServer( 127.0.0.1, 'root' ,"" )

oServer:Selectdb('Test') // Abre o banco de dados test

if oServer:NetError()

    oServer:Destroy()

endif

oTable := oServer:query("Select * from cli");


2.13 - TMySqlServer:Error()

Esse metodo retorna o ultimo error como um string

Syntaxe

oServer:Error()

Parametros

Nenhum

Exemplo

oServer := TMySqlServer( 127.0.0.1, 'root' ,"" )

oServer:Selectdb('Test') // Abre o banco de dados test

if oServer:NetError()

    oServer:Error()

    oServer:Destroy()

endif

oTable := oServer:query("Select * from cli");

2.14 - Complemento Da Classe Mysql

Complemento da Classe TMysqlServer

FieldGet(cnField)

Pega o Valor do campo referenciado for cnField
FieldPut(cnField, Value)

Insere um valor Value no campo referenciado por cnField
FieldName(nNum)

Nome do campo na posição nNum
FieldPos(cFieldName)

Posição do campo referenciado pit cFieldName
FieldLen(nNum)

Tamanho do Campo nNum
FieldDec(nNum)

Tamanho do decimal do Campo nNum
FieldType(nNum)

Tipo do Campo nNum

MakePrimaryKeyWhere()

Retorna a clausula WHERE x=y que usa a chave primaria(se disponivel)

Refresh()

Reexecuta a query para que as mudanças se tornem visiveis
GetRow(nRow)

Retorna a linha n da Resposta
Skip(nRows)

Pula o numero especificado de registro
Bof()

Tabela no inicio do arquivo
Eof()

Tabela no Fim do arquivo
RecNo()

Registro Atual
LastRec()

Ultimo registro
FCount()

Numeros de campos nessa tabela

GetRow(nRow)

Pega a coluna nRow e retorna um objeto TMySQLTable
Update(oRow)

Pega o oRow e atualiza os Cmapos alterados
Delete(oRow)

Apaga a linha passada da tabela
Append(oRow)

Insere a linha passada na tabela
GetBlankRow()

Retorna uma Linha vazia com todos os campos disponiveis vazios

2.15 - Classe tBrowsesql e TBColumnsql

Classe Tbrowsesql e TBColumnsql

Classe TBColumnSQL

New(cHeading, bBlock, oBrw)

Block()

Fornece um Code Block usado para recuperação de dados para uma coluna (Igual ao Clipper)

Classe TBrowseSQL

New(nTop, nLeft, nBottom, nRight, oServer, oQuery, cTable)

oCurRow

Retorna o Objeto TmysqlRow da coluna Selecionada

oQuery

A Query passada para o servidor

EditField()

Permite a Edição do campo selecionado

BrowseTable(lCanEdit, aExitKeys)

Informa se a tabela e editável e um arrays de teclas para saída

KeyboardHook(nKey)

3 - Browse com Tbrowse e Mysql

Prezados Amigos.Pelo que notei isso e algo que muitas pessoas perguntam. como integer um browse com mysql? Veja o programa abaixo Salve esse teste com o nome de testmysql.prg e coloque no mesmo diretorio do testmysql.bc :


#include 'inkey.ch'
STATIC oserver
STATIC otable

FUNC main

    LOCAL ob
    LOCAL cHostName := "127.0.0.1"
    LOCAL cUser := "root"
    LOCAL cPassWord := ""
    LOCAL cDataBase := 'test'
    LOCAL cTable := 'luizx'
    LOCAL cFile
    Local ADbs
    CLS
    oServer := TMySQLServer():New( cHostName, cUser, cPassWord )
    IF oServer:NetErr()
       ? oServer:Error()
       QUIT
    ENDIF
    oServer:SelectDB( cDataBase )
    IF oServer:NetErr()
       ? oServer:Error()
       QUIT
    ENDIF
    if Ascan(oServer:ListTables(), cTable) == 0
       OsERVER:cREATEtABLE( ctable, { { "fname", "C", 30, 0 }, ;
       { "lname", "C", 30, 0 }, ;
       { "phone", "C", 30, 0 }, ;
       { "fax", "C", 30, 0 }, ;
       { "address", "C", 30, 0 }, ;
       { "city", "C", 30, 0 }, ;
       { "zip", "C", 30, 0 }, ;
       { "notes", "C", 50, 0 } }, 'lname', 'lname' )
    endif

    oTable := oServer:Query( "SELECT * FROM " + cTable )
    IF oTable:NetErr()
       Alert( oTable:Error() )
       QUIT
    ENDIF

    oServer:Createindex( "luiz", "luizx", { "fname", "zip" }, )

    ob := TBrowseSQL():new( 1, 1, 20, 79, oserver, otable, 'luizx' )
    ob:SetKey( 22, { | ob, nkey | Defproc( ob, nKey, ctable ) } )

    WHILE .t.
       oB:ForceStable()
       IF ( oB:applykey( Inkey( 0 ) ) == - 1 )
          EXIT
       ENDIF
    ENDDO

    oTable:Destroy()

    oServer:Destroy()

RETURN nil

FUNCTION DefProc( ob, k, ctable )

    LOCAL op := ' '
    LOCAL orecord
    LOCAL aFDatas := Array( 8 )
    LOCAL cScreen := Savescreen()
    LOCAL n
    CLS
    Setcolor( 'w/b,w/b+,w/r,b/w' )
    Dispbox( 0, 0, Maxrow(), Maxcol() )
    Afill( afDatas, Space( 30 ) )
    afdatas[ 8 ] := Space( 50 )
    @ 2, 2 SAY 'Primeiro nome' GET afdatas[ 1 ]
    @ 3, 2 SAY 'Ultimo Nome' GET afdatas[ 2 ]
    @ 4, 2 SAY 'Telefone' GET afdatas[ 3 ]
    @ 5, 2 SAY 'fax' GET afdatas[ 4 ]
    @ 6, 2 SAY 'endereco' GET afdatas[ 5 ]
    @ 7, 2 SAY 'cidade ' GET afdatas[ 6 ]
    @ 8, 2 SAY 'cep' GET afdatas[ 7 ]
    @ 9, 2 SAY 'notas' GET afdatas[ 8 ]
    READ
    @ 23, 2 SAY 'Salva (S/N)?' GET op PICT "!"
    READ
    IF op == "S"
       oRecord := oB:oQuery:GetBlankRow()
       FOR n := 1 TO 8
          oRecord:FieldPut( n, afdatas[ n ] )
       NEXT
       oTable:Append( oRecord )
       IF oTable:NetErr()
          Alert( oTable:Error() )
          QUIT
       ENDIF

    ENDIF
    Restscreen(,,,, cScreen )
    oTable:Refresh()
    ob:refreshall()
RETURN nil