• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

JLDR

Aceder a uma BD do Access através de rede local via C#

11 mensagens neste tópico

Cumprimentos a todos.

O título da minha questão pode parecer complicado, mas passo a explicar:

1º Criei um pequeno aplicativo em C# que liga a uma base de dados MDB (Access) que está na mesma pasta do executável através de ADO.NET - OledbConnection.

Até aqui tudo bem, funciona normalmente.

2º Passei o ficheiro da base de dados para uma pasta em outro computador que tenho em rede e, apesar de descrever o caminho correcto da base de dados na ConnectionString da ligação, surge-me o seguinte erro:

See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.Security.SecurityException: Request for the permission of type 'System.Data.OleDb.OleDbPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
   at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
   at System.Security.PermissionSet.Demand()
   at System.Data.Common.DbConnectionOptions.DemandPermission()
   at System.Data.OleDb.OleDbConnection.PermissionDemand()
   at System.Data.OleDb.OleDbConnectionFactory.PermissionDemand(DbConnection outerConnection)
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.OleDb.OleDbConnection.Open()
   at appTeste.Form1.button1_Click(Object sender, EventArgs e)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
The action that failed was:
Demand
The type of the first permission that failed was:
System.Data.OleDb.OleDbPermission
The Zone of the assembly that failed was:
Internet

(continua...)

Estive a vasculhar a net à procura do problema e deparei-me com uma situação relacionada com nível de segurança.

Ora, imaginem que desejo criar um aplicativo para gerir uma base de dados, e que essa base de dados possa funcionar em rede. Como é que eu faço? Como é que se pode ultrapassar este problema?

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mostra lá a parte da ligação e da definição da connection string ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A connectionstring é a mais simples. Como se tratou de um teste, apenas criei a bd sem qualquer password. Por isso mesmo só defino o Provider e o Data Source:

No caso concreto, uma vez que estava a testar várias localizações da base de dados, deixei na form uma caixa de texto para escrever o caminho completo.

ligacao.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + textBox1.Text;

A rede é composta por dois PCs (um com XP e outro com Vista) ligados via router. A rede funciona perfeitamente. Não é por aí.

Os caminhos que fui definindo também eram os correctos caso contrário o erro é outro: a ausência de ficheiro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os caminhos que fui definindo também eram os correctos caso contrário o erro é outro: a ausência de ficheiro.

Não era ausência de ficherio mas sim ficheiro não encontrado, mas vai dar ao mesmo e sim tens razão.

Parece-me um problema de Code Assess Security (CAS). Lê este artigo que explica muito bem o teu problema e, à partida, ajuda-te a resolver: http://www.emmet-gray.com/Articles/CodeAccessSecurity.htm

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pela resposta, Jorge Paulino. Como deves calcular, eu entretanto fui desbravando a internet na procura de uma solução para acabar por descobrir que, realmente, não é lá muito interessante o sistema.

Digo isto porque sempre que faço um aplicativo qualquer, uma das minhas maiores preocupações é sempre a questão da implementação do aplicativo (e respectivos ficheiros conexos) no PC do cliente.

Pelo que tenho observado desde sempre, raramente é dada importância a este aspecto da distribuição da aplicação no sentido dela ficar a funcionar correctamente do lado do utilizador final e, principalmente, acautelando a possibilidade (quase sempre verificada) do utilizador final perceber muito pouco de informática. O que o utilizador final deseja é instalar um programa da forma mais simples possível e que, finda a instalação, estejam criadas as condições para que ele funcione.

Acreditem que me deixa irritado esta falta de cuidado generalizada por parte de quem produz tutoriais sobre linguagens de programação, porque eu coloco sempre a questão: Que importância tem criar uma solução informática se depois não é fácil toda a gente poder instalá-la nos seus computadores?


A propósito disto, e reparando que a solução "Jet OLEDB" traz estes problemas de permissões de segurança ao funcionar em rede, e porque teria que ser em última análise o utilizador final a configurar o seu sistema para que o programa funcionasse correctamente, coloca-se a hipótese de passar a gestão da base de dados para SQL Server Express. Só que aqui volto a colocar a questão da portabilidade da aplicação.

Se eu criar a aplicação recorrendo à gestão de uma base de dados SQL Server, do lado da minha máquina não haverá problema durante a fase de desenvolvimento. Mas quando eu quiser distribuir a minha aplicação, até que ponto não será complicado para um 'utilizador normal' instalá-la no seu computador?

Ele tem que instalar o SQL Server Express. E depois, como é que o configura? E como é que eu distribuo de forma simplificada a base de dados? Já ouvi falar do Xcopy, mas haverá alguma coisa que me está a escapar?

É que me parece um sistema bastante complexo de implementar do lado do utilizador. Será que há alguma forma de:

- Criar um programa que gere bases de dados SQL Server Express;

- Meter todo o pacote (SQL Server Express incluído) num setup;

- Do outro lado o cliente instala o setup e fica logo com a aplicação a funcionar?

Agradecia mais uma vez a vossa ajuda para esclarecer estas dúvidas que tenho.

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na realidade eu tenho diversas aplicações em SQL Server e nenhuma delas está a trabalhar com uma versão SQL Server Express, mas sim através da versão profissional ... e ainda são algumas.

O SQL Server só necessita de estar instalado numa máquina, que será o servidor, e todos os pc's que estão na rede podem aceder a informação do servidor sem a instalação de qualquer componente (adicionar, apagar, ler, etc). Julgo que na versão express o principio é o mesmo e posso confirma-te isso para a próxima semana, uma vez que vou testar em duas máquinas.

A unica vez que ouvi falar no xcopy para distribuição de uma aplicação foi para ASP.NET, visto que não podes apenas publicar uma página mas sim na totalidade, e há quem publique localmente e depois utilize o xcopy (ou um programa ftp) para copiar um ou outro ficheiro apenas (é util em aplicações grandes).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

jpaulino, clarifica-me uma coisa, sff.

Tu crias uma aplicação que gere BDs em SQl Server. Se a tua aplicação for implementada no cliente final, quem é que faz essa implementação? Terá que ser sempre alguém que tem conhecimentos informáticos suficientes para instalar toda a plataforma no cliente, certo?

Ou será que é possível criar um produto com BDs SQL Server, vender isso pela internet ou numa loja, por exemplo, e o cliente instala aquilo tudo no seu pc sem dificuldade?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epá, sinceramente não te sei responder. Trabalho em ambiente industrial, com diversos servidores e computadores e os servidores têm instalado o SQL Server 2000 e 2005 ... tudo versões profissionais.

As outras aplicações que tenho sou eu que instalo e nunca tentei fazer tudo automático (nunca tentei porque nunca precisei).

Mas se queres fazer testes, para ver como funciona, instalas o Microsoft Virtual PC 2007 e testas a instalação como se fosse o cliente, sem prejudicares a tua máquina. É uma maneira muito prática para testes, às vezes em ambientes diferentes.

2º Passei o ficheiro da base de dados para uma pasta em outro computador que tenho em rede e, apesar de descrever o caminho correcto da base de dados na ConnectionString da ligação, surge-me o seguinte erro:

Mas estive a ler melhor a tua questão e estou com uma dúvida ... tu tens a base de dados numa drive de rede, onde a pasta é partilhada e com acesso de escrita, e o executável no disco de outro computador, e mesmo assim dá erro ?

Tenho uma estrutura semelhante, com um base de dados em access, com cerca de 50 utilizadores em diversos locais e sem nenhum problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Relativamente à virtualização, já é uma opção que uso há algum tempo para testar software, e não apenas para testar o 'meu' software. Já usei o VMware, mas actualmente estou apenas com o VirtualPC onde tenho uma instalação do Vista e outra do XP. E tenho guardadas as virtual drives numa pasta à parte para 'refrescar' o sistema sempre que o encho de lixo :D

É uma excelente opção, sem dúvida, para quem se aventura nisto.

Entretanto em relação à tua dúvida. LOLOLOLOLOLOLOLOLOLOL... Que lame que eu sou...

Como deves calcular não tenho feito outra coisa nas últimas horas que não seja testar o sistema e o que acontecia era que eu estava a executar a aplicação toda via lan. Isto é, estava instalado no PC1, abria o PC2 via rede, executava o aplicativo que estava no PC2 e tentava abrir a base de dados que lá se encontrava com o seu caminho de rede.

Acabo por descobrir agora que o problema reside na execução do aplicativo em rede e não na gestão de uma base de dados que está noutro PC.

Conclusão: Problema aparentemente solucionado.

Cada PC tem que ter um aplicativo cliente e a a base de dados é que pode ficar onde bem entender-mos.

Como diria o Scolari: "E o burro sou eu?" Neste caso sou mesmo. ;)

Já agora, só mais uma pergunta:

Eu nunca fiz nenhum aplicativo para multiposto, mas já fiz muitos com gestão de bases de dados. No caso concreto, via OLEDB, há algum mecanismo a ter em conta por causa da gestão da base de dados em simultâneo por vários utilizadores (todos a usá-la ao mesmo tempo) ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu também li mal a tua questão e achei que querias executar o programa (*.exe) através da rede. Mas depois pensei: "será que está a fazer asneira ? ;) "

Melhor assim!

Já agora, só mais uma pergunta:

Eu nunca fiz nenhum aplicativo para multiposto, mas já fiz muitos com gestão de bases de dados. No caso concreto, via OLEDB, há algum mecanismo a ter em conta por causa da gestão da base de dados em simultâneo por vários utilizadores (todos a usá-la ao mesmo tempo) ?

Não, permite várias ligações em simultâneo (cerca de 255) e aplicações até 1gb, sem problemas. É claro que não deves ter ligações abertas por questões de segurança e performance. No entanto para aplicações multiposto o Access não é propriamente uma base de dados recomendável.

O único cuidade que se deve ter, mas isso acontesse com todas as bases de dados, é a edição em simultâneo dos mesmos dados,  e caso isso aconteça, deves guarda a data e hora da ultima edições ou o número da revisão, para comparares antes de actualizares.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelas respostas, jpaulino.

E afinal vieste dar um pouco de razão de ser à minha ideia sobre o SQL Server: Quem trabalha com ele raramente se dá ao trabalho de analisar a questão da portabilidade da plataforma, porque ela aplica-se maioritariamente em sistemas geridos por quem sabe o que está a fazer. Para o utilizador normal, SQL Server deve ser, no mínimo, complicado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora