Como usar Mysql do Projeto Harbour

Avatar do usuário
jairpinho
Mensagens: 116
Registrado em: 05 Nov 2008, 22:55
Localização: Rio Grande do Sul - Brasil
Contato:

Como usar Mysql do Projeto Harbour

Mensagem por jairpinho » 04 Abr 2014, 14:45

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 voce for usar a classe tmysql, coloque como static as variaveis oServer e oTable, antes da funcao main Existe duas formas de se fazer isso conforme a tabela abaixo:
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
//Codigo se não se conectar
endif
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 estabelecia a conecção, voce deve abrir o bd que esta a sua tabela. Existe duas formas de se fazer isso conforme a tabela abaixo
IF sqlSelectD( nSocket , cDataBase ) != 0
? 'Tabela nÆo existe'
ENDIF
oServer:SelectDB(cDataBase)
IF oServer:NetErr()
? 'Tabela nÆo existe'
ENDIF





1.2 - Verificar se uma tabela Existe
Voce 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
if Ascan(oServer:ListTables(), cTable) >0 existe a tabela
1.3 - Criando uma tabela nova
Voce pode Criar uma tabela dentro de um Banco de dados Aberto, se ela nao existe. Existe duas formas de se fazer isso conforme a tabela abaixo
a Estrutura teste esta 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 atualizacao
• g01_stru1[5]:={'hat','C',8,0} && hora da ultima atualizacao
• g01_stru1[5]:={'id','I',6,0} && hora da ultima atualizacao
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 table se nÆo existe, agora vamos abrir uma.O codigo 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
cQuery:= "DROP INDEX "+ cIndex + " FROM "+ Ctable +" ;"
if sqlQuery(nSocket, cQuery) == 0
return .T.
else
return .F.
endif
if !oServer:Dropindex(cIndex,cTable)
/* Codigo para fazer se indice não foi criado */
1.7 - Apagando indices
Algumas vezes , pode ser necessario a que voce apage uma Tabela do banco .Existe duas formas de se fazer isso conforme a tabela abaixo
cQuery:= "DROP TABLE "+ Ctable +" ;"
if sqlQuery(nSocket, cQuery) == 0
return .T.
else
return .F.
endif
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
cQuery:= "INSERT INTO "+ Ctable +" VALUES ("
for i:=1 to len(AfDatas)
cQuery += ClipValue2SQL(AfDatas) + ","
next
cQuery := Left(cQuery, Len(cQuery) -1) + ")"
if sqlQuery(nSocket, cQuery) == 0
return .T.
else
return .F.
endif
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

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
Jair Pinho
HMG ALTA REVOLUÇÃO xBASE
HMG xBASE REVOLUTION HIGH
http://www.hmgforum.com.br

Responder

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante