Fórum delphi + sql Server 2000 em rede #421111

06/08/2012

0

Olá pessoal
Preciso da ajuda de vocês,
Sempre fiz pequenos sistemas Alguns pessoais e alguns para onde trabalho, mas sempre com banco de dados access
Porem agora preciso de um sistema um pouco maior onde adotarei o sql server 2000.

Minha dúvida é a seguinte

Tenho o executável do Delphi em uma pasta compartilhada no servidor,
Tenho sql server 2000 rodando na maquina perfeitamente

no meu sistema, tenho um datamodule e nele tenho um ADOConnection,

No meu laptop , onde escrevo os códigos, tenho:

Delphi 2010
Sql server 2000

tambem rodando perfeitamente

quando eu compilo o código ele funciona perfeitamente, porem se eu copio o executável e colo na pasta do servidor, ele nao roda porque o nome da maquina é diferente e dá erro que nao pode se conectar no banco de dados.

coloquei no evento oncreate do datamodule este codigo para pegar o nome da maquina

var
pcName : pchar; // Recebe o nome do Host
dwSize : dword; // Buffer que aloca o nome do Host
conecta : string; // Recebe a connectionstring para o ADOConnection

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin

try
dwSize:= MAX_COMPUTERNAME_LENGTH + 1;
pcName:= strAlloc( dwSize );
finally
end;

conecta := Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=TESTE;;
conecta := conecta + Initial Catalog=BANCO;Data Source= + pcName + ;Use Procedure ;
conecta := conecta + for Prepare=1;Auto Translate=True;Packet Size=4096;;
conecta := conecta + Workstation ID= + pcName + ;Use Encryption for Data=False;;
conecta := conecta + Tag with column collation when possible=False;
conexao.ConnectionString := conecta;
Q1.Open;
end;

Beleza ele pega o nome da maquina e armazena normalmente,

Só que eu coloco esse executavel no servidor e quando de qualquer estação eu clico nele, ao invés de ele executar no servidor, parece que ele executa na maquina do cliente e então pega o nome da maquina do cliente e se for uma estação ele dá erro porque nao tem o sql server na estação e se for no meu laptop entao ele acessa , mas com os dados do banco que esta no meu laptop e nao no servidor

Qual a melhor solução para isso deixar um executavel em cada estação ?

Obrigado.
Fernando Michelli

Fernando Michelli

Responder

Posts

06/08/2012

Gustavo Bretas

Fernando, vc pode usar arquivo INI (TIniFile, unit IniFiles), que permite vc adicionar o servidor correto no seu cliente, ele te da uma flexibilidade maior caso precise implantar o sistema em outros clientes, ou então usar parametro de inicialização.

No meu trabalho eu uso Parametro de Inicialização, e conforme o parâmetro o informo o Banco pro componente Database.

Para usar o parâmetro de inicialização, vá no menu: Run Parameters...
Coloque o parametro que vc vai comparar no campo Parameters (eu uso -d)

Para verificar, use o comando:

1
2
3
4
if ParamStr(1) = -d then
    dwSize  = ServidorDesenvolvimento
else
    dwSize  = ServidorCliente;


O número é a posição do parâmetro, 0 sempre vai ser o caminho do arquivo, se vc for usar mais de um parâmetro futuramente, vai incrementando! rsrs

Espero ter ajudado!

Abraço!
Responder

Gostei + 0

06/08/2012

Fernando Michelli

Boa noite Bretas

Obrigado por responder...

Endenti a lógica, mas não entendi muito bem como fazer, quando estou desenvolvendo, no meu laptop ele funciona legal, quando vou subir para o servidor eu tenho que ir na string e alterar, porem com esse codigo que postei acima para pegar o nome na maquina, nao preciso mais fazer isso, ele funciona legal.

O problema é que preciso rodar em rede, vi muitos tópicos que o pessoal roda o executável nas estações e tem até um macete para verificar a versão e fazer o download automático da nova versao do servidor, mas não sei fazer isso também,

Mas resumindo,

Tenho duas formas de resolver meu problema

1 - Fazer com que o executável rode no windows do servidor e não da estação;
- Pois dessa maneira, quando executo o programa com o código acima, ele me retorna o nome da minha máquina (meu laptop) e não do servidor e sendo assim ele pega o banco do meu sql server e não do servidor.

- Procedimento.
Desenvolvo o código,
Compilo,
Copio o executável da minha maquina e colo na pasta compartilhada no servidor,
Do servidor eu rodo o executável e funciona perfeitamente,
Da minha máquina eu rodo o executável que está no servidor, ele executa mas pega o banco da minha maquina e nao do servidor,
De outras estações, dá erro que o banco nao existe ou nao consegue se conectar com o banco.


2 - Fazer o executável em cada estação, buscando somente os dados no servidor via rede.

O problema é que pra variar na faculdade só aprendemos a desenvolver em maquina local, e nunca precisei usar em rede até hoje, nesse caso o que preciso instalar no servidor e nas estações caso queira usar o sql server 2000 ou 2008express ??


Um grande abraço e muito obrigado pela ajuda!!!
Responder

Gostei + 0

07/08/2012

Gustavo Bretas

Fernando,

Entendo que vc gostou de forma que pega o nome do máquina, mas o que adianta o nome da máquina se no seu cliente ela não é o servidor de banco de dados?
Vc ja testou, viu que não funciona, então vamos tentar outra coisa, concorda?

Quando vc diz: (quando vou subir para o servidor eu tenho que ir na string e alterar), na verdade é ao contrário, é mais fácil vc deixar o parâmetro configurado no delphi, vc vai enviar seu executável para o cliente, e ele não tem que alterar nada, só executar, quanto menos coisa vc deixar para o usuário fazer cagada é melhor! rsrs

Como vc quer pegar o nome da máquina, vamos fazer o seguinte.

Antes vamos melhorar essa questão de pegar o nome da máquina, encapsulando o método, só lembrando vou focar na resolução no seu problema, e não nas melhores práticas de desenvolvimento ok?

1
2
3
4
5
6
7
8
9
10
11
function TDataModule1.mtdNomeComputador: String;
var
  vlsBuffer: array[0..255] of char;
  vliSize: dword;
begin
  vliSize := 256;
  if GetComputerName(vlsBuffer, vliSize) then
    Result := vlsBuffer
  else
    Result :=
end;


E no seu evento:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
 
if ParamStr(1) = -d then // Lembrando que Parâmetro é String, e vc deve colocar aspas, o fórum excluí as aspas!
pcName := mtdNomeComputador;
else
pcName := ServidorDoCliente;
 
conecta := Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=TESTE;;
conecta := conecta + Initial Catalog=BANCO;Data Source= + pcName + ;Use Procedure ;
conecta := conecta + for Prepare=1;Auto Translate=True;Packet Size=4096;;
conecta := conecta + Workstation ID= + pcName + ;Use Encryption for Data=False;;
conecta := conecta + Tag with column collation when possible=False;
conexao.ConnectionString := conecta;
Q1.Open;
end;


Configure o parâmetro no menu do jeito que disse no post anterior, e faça o teste!

Espero ter ajudado!
Responder

Gostei + 0

09/08/2012

Fernando Michelli

Bretas, mais uma vez obrigado pela atenção

Pesquisei muito sobre sql estes dias, inclusive montei 2 servidores, um com sql server 2000 e outro com o 2008, para testes

Vou expor o meu cenário.

Meu sistema, (pequeno) mas indispensável para o controle dos técnicos de rua e controle de equipamentos da rede, roda hoje com Access.

Então tenho um Datamodule com um ADOConnection para me conectar ao banco e vários

Query + DataSource para as tabelas.

Tudo funcionando perfeitamente, porém em apenas 1 máquina

Por questões de segurança, crescimento, etc... vamos migrar para sql server ( acredito que o 2008 )

Pois bem

No servidor eu instalei o SQL SERVER 2008,
já habilitei o modo rede em:
Iniciar Todos os programas Microsoft Sql Server 2008 R2 Ferramentas de configuração SQL Server Configuration Manager

--- Configuração de rede do SQL Server Protocolos para MSSQLSERVER

Estão habilitados
Memória compartilhada
Pipes Nomeados
TCP/IP

Está desabilitado
VIA
--- Configuração de rede do SQL Server Serviços do SQL Server

SQL Server (MSSQLSERVER) --- Em execução
Navegador do SQL Server --- Em execução
SQL Server Agent (MSSQLSERVER) --- PARADO

para testes em bancada, estou usando 3 maquinas, sendo:

1 servidor - onde esta o sql server 2008

1 laptop - onde estão os fontes + o SQL Server 2008

1 laptop - que é a estação.


Na estação eu instalei o sqlncli.msi ( instalou normalmente, sem erros, porém ao término, não aparece nenhum programa ou executável onde eu possa configurar algo)

Em painel de controle Ferramentas administrativas Fontes de dados ODBC Adicionar

Ao adicionar ele me dá as duas ultimas opções como:

SQL Server
SQL Server Native Client 10.0

Se eu escolher a ultima que é do client do sql server que eu acabei de instalar
Ele me mostra uma janela com o logo do SQL Server 2008 com o nome de Configuração DSN do Microsoft SQL Server, me perguntando a qual servidor eu quero me conectar ?

Nesta opção ele me mostra o nome da maquina dos dois servidores que montei para testes, entao eu escolho um, insiro o usuario e senha que eu criei para o referido banco, por exemplo, teste, 123, avançar, avançar, até que pede para testar fonte de dados
quando clico nesse botão ele executa o teste e retorna Testes concluidos com exito.

Até aqui acredito que a parte do servidor está ok.

Não estou sabendo o que fazer nas estações a partir de agora?

O que eu preciso instalar na estação, o que e onde preciso configurar algo na estação e como montar o arquivo .ini,

ou trabalhar com os parametros, como já me disse anteriormente.

O fato é que terei dois servidores SQL Server na jogada, um na minha maquina onde desenvolvo, testo e assim que estiver ok, eu subo pro servidor

e o outro que é o proprio servidor na rede, ou seja quando estiver desenvolvendo, preciso me conectar no banco local, quando estiver em produção preciso que as estações se conectem no servidor.


Desde já agradeço a atenção.



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar