Raficcha 1 Denunciar post Postado Maio 8, 2009 Gente.. cheguei a conclusão que é impossivel instalar o ZEOS no Delphi 7 (pelo menos no meu)... não consegui encontrar o "segredo" da instalação.. então resolvi fazer sem ele mesmo.. consegui.. e fuciono bem, usando o componente SQLconnection e SQLQuery da paleta dbExpress (apenas esses dois) e tratei os resultados vindos do banco no braço... bom.. ai resolvi então criar uma dll e colocar isso tudo dentro.. bom, primeira vez que eu fiz, funcionou que chego dá gosto de ver.. ai fiz algumas alterações, ai começou a surgir uma mensagem de "invalid operation pointer".. É uma mensagem muito estranha, por que se eu chamo a função sem nenhum "messagebox" dentro a função nem entra, ja se eu colocar uns "messagebox" ela vai ate o final e então da o erro.. alguem sabe me dizer como resolver isso o codigo da biblioteca vai abaixo library Project2; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } uses Variants, Classes, SqlExpr; {$R *.res} type Matriz_Resultado= array of array of variant; var conexao : TSQLConnection; query: TSQLQuery; cn_database: string; //funções function conectar(PUsuario, PSenha, PDatabase: string; PHost: string = 'localhost'; PLibraryName: string = 'dbxopenmysql50.dll'; PVendorLib: string = 'libmysql.dll'): boolean; export; begin try conexao := TSQLConnection.Create(nil); conexao.ConnectionName := 'teste'; conexao.DriverName := 'MySQL50'; conexao.GetDriverFunc := 'getSQLDriverMYSQL50'; conexao.LibraryName := PLibraryName; conexao.Params.add('DriverName=MySQL50'); conexao.Params.add('HostName='+PHost); conexao.Params.add('Database='+PDatabase); conexao.Params.add('User_Name='+PUsuario); conexao.Params.add('Password='+PSenha); conexao.Params.add('BlobSize=-1'); conexao.Params.add('ErrorResourceFile='); conexao.Params.add('LocaleCode=0000'); conexao.VendorLib := PVendorLib; conexao.LoginPrompt := false; //conexao.SQLConnection.connect(pchar(PHost), pchar(PUsuario), pchar(PSenha)); //conexao.Connected := true; conexao.Open; query := TSQLQuery.Create(query); query.MaxBlobSize := -1; query.SQLConnection := conexao; query.SQL.Clear; Result := true; except Result := false; end; end; function Select(Tabela: string; Condicao: string; Colunas: string = '*'):Matriz_resultado; export; var cont, cont2 : integer; Nome_Colunas : TStringList; begin query.SQL.Clear; query.SQL.Add('SELECT '+Colunas+' FROM '+Tabela+' '+Condicao); //query.SQL.Add('SELECT * FROM produtos'); query.ExecSQL(true); query.Active := true; Nome_Colunas := TStringList.Create; Nome_Colunas.Clear; query.GetFieldNames(Nome_Colunas); setLength(Result, Nome_Colunas.Count+1); //pegar o cabeçalho for cont := 0 to Nome_Colunas.Count-1 do begin setLength(Result[cont+1], 2); Result[cont+1, 1] := Nome_Colunas[cont]; end; //pegar os registros for cont := 1 to Nome_Colunas.Count do begin setLength(Result[cont], query.RowsAffected+2); query.First; for cont2 := 1 to query.RowsAffected-1 do begin Result[cont, cont2+1] := query.Fields[0].DataSet.FieldValues[Nome_Colunas[cont-1]]; query.Next; end; end; end; exports Conectar, Select; //Implementação begin end. O probelma é na funcção "Select". a função "conectar" funciona bem eu fiz um programa que funciou (em parte, executava so uma vez a "Select"), mas depois, tentei fazer outro igual e não adintou mais.. so da erro Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Maio 8, 2009 Não será porque está usando o query.ExecSQL(true); ao invés do Query.Open?? Ao que me consta, o ExecSql é para rotinas de insert, update e delete que se usa. Outra coisa... query.open e query.active fazem com que a select seja executada e exibida... então só se usa um (no caso, o open mesmo). []'s Compartilhar este post Link para o post Compartilhar em outros sites
Raficcha 1 Denunciar post Postado Maio 8, 2009 Não funcionou.. mas ja arumei o codigo pra deixar so o query.open. valeus.. ainda to procurando a resposta Compartilhar este post Link para o post Compartilhar em outros sites
Raficcha 1 Denunciar post Postado Maio 8, 2009 Bom, ainda procuro pela resposta. Esqueci de falar uma coisa.. se eu colocar estas funções no form do projeto mesmo, elas funcionam superbem e sem nem sinal de erro Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Maio 8, 2009 Já verificou se sua query está realmente conectada ao BD quando chama o código via dll? Talvez seja necessário conectar ela antes do BD via dll antes do open. []'s Compartilhar este post Link para o post Compartilhar em outros sites