 |
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 |
|
|
|