VB .NET - Trabalhando com banco de dados local - (TableAdapter não atualiza os dados)


Estou dando um esclarecimento procurando sanar um problema que alguns usuários me relataram sobre o artigo : VB.NET  2005 - Criando uma aplicação completa : Locadora de Filmes.

Alguns usuários relataram que após realizarem a inclusão/alteração exclusão de dados quando fechavam a aplicação e abriam novamente tudo era perdido não havendo dado algum nas tabelas de dados da aplicação.

Após pesquisar sobre o fato acabei encontrando uma possível explicação para o fato em uma lista de discussão. Vamos a ela:

Um pouco de teoria

Um arquivo de banco de dados local pode ser incluído como um arquivo em um projeto do Visual Studio.

A primeira vez que você conectar seu aplicativo para um arquivo de banco de dados local, você pode escolher entre criar uma cópia do banco de dados em seu projeto se conectar com o arquivo de banco de dados existente em seu local atual.

Se você optar por se conectar ao arquivo existente, em seguida, uma conexão é criada como se você estivesse se conectando a qualquer banco de dados remoto, e o arquivo de banco de dados é deixado em seu local original.

Se você optar por copiar o banco de dados em seu projeto, o Visual Studio cria uma cópia do arquivo de banco de dados, adicionando-o em seu projeto, e modifica a conexão de modo que agora aponta para o banco de dados em seu projeto, em oposição ao local original do arquivo de banco de dados.

Quando você cria um projeto, o arquivo de banco de dados pode ser copiado da pasta do projeto raiz para a pasta de saída (\bin). (Selecione Mostrar todos os arquivos no Solution Explorer para exibir a pasta bin.)

Este comportamento é baseado na configuração da propriedade Copy to Output Directory do arquivo. A configuração padrão da propriedade depende do tipo de arquivo de banco de dados você está usando.

A tabela a seguir descreve as configurações da propriedade Copy to Output Directory:
 
Copy if newer O arquivo de banco de dados é copiado do diretório do projeto para o diretório bin na primeira vez que o projeto é criado. Toda vez que você criar o projeto, a propriedade Date Modified dos arquivos é comparada. Se o arquivo na pasta do projeto é mais recente, ele é copiado para a pasta Bin, substituindo o arquivo que está lá. Se o arquivo na pasta bin é mais recente, nenhum arquivo é copiado. Esta configuração persiste quaisquer alterações feitas nos dados durante o tempo de execução, o que significa que cada vez que você executar o aplicativo e salvar alterações dos dados, essas alterações são visíveis na próxima vez que você executar o aplicativo.
Copy Always (padrão) O arquivo de banco de dados é copiado do diretório do projeto para o diretório /bin cada vez que você construir a sua aplicação. Portanto, se você criar seu aplicativo e salvar as alterações no arquivo do diretório /bin, essas alterações serão substituídas na próxima vez que o arquivo original for copiado para o diretório /bin.
Do not Copy O arquivo nunca é copiado ou substituído pelo sistema do projeto. Você deve copiar manualmente o arquivo a partir do diretório do projeto no diretório de saída, se você usar essa configuração.

Durante o desenvolvimento de aplicativos, todas as alterações feitas nos dados (durante o tempo de execução dentro de sua aplicação) são feitas ao banco de dados da pasta bin. Por exemplo, quando você pressiona F5 para depurar seu aplicativo, você está conectado ao banco de dados na pasta bin.

O arquivo de banco de dados na sua pasta raiz do projeto é alterado somente quando você editar o esquema de banco de dados ou dados usando Server Explorer, Database Explorer ou outros Visual Database Tools.

Quando você realiza uma conexão com um banco de dados SQL Server usando o Visual Basic .NET através do Server Explorer e então cria seu Data Source usando aquela conexão, o VB .NET irá exibir uma janela de diálogo com a seguinte mensagem:

"The connection you selected uses a local data file that is not in the current project. Would you like to add the file to your project and modify the connection ?"

Para responder à essa pergunta na caixa de diálogo de arquivo do banco de dados local esteja atento e saiba o que você esta fazendo:

1- Clique em Sim(Yes), se você quiser que o Visual Studio copie o arquivo de banco de dados em seu projeto e modifique a conexão para apontar para a cópia no seu projeto.

2- Clique em Não(No), se você não quiser que o Visual Studio copie o arquivo de banco de dados em seu projeto. Em vez disso, a conexão aponta para o arquivo no local original e o arquivo de banco de dados não é adicionado como um arquivo para o projeto.

Se você confirmar e clicar no botão Yes, ao compilar(Build), sua aplicação o VB .NET irá copiar o arquivo .mdf para o diretório de saída da aplicação onde fica o arquivo .EXE da mesma. (a pasta \bin)

Só que tem um pequeno detalhe : a conexão em tempo de projeto, no Server Explorer, ainda estará apontando para o arquivo .mdf  original e não para a cópia que esta na pasta de saída da aplicação.

Este comportamento simplifica o processo de compilação da aplicação mas tem um efeito colateral desagradável que abaixo você descobrirá...

Agora você pode rodar a sua aplicação e incluir, alterar e excluir registros para alterar o conteúdo do arquivo .mdf que reside na pasta de saída da sua aplicação.

Contudo , após fazer isto, se você verificar o conteúdo do arquivo .mdf, via Server Explorer, você não verá as alterações feitas, pois, você estará olhando para o arquivo .mdf original e não para o arquivo que foi copiado para a pasta de saída da sua aplicação.

Desta forma você pensa que o seu código não esta efetuando as alterações, pois esta olhando para o arquivo original e não para o arquivo que a aplicação esta usando como arquivo de trabalho.

Tem outro problema: a próxima vez que você compilar (Build) a sua aplicação o VB .NET irá copiar o arquivo original .mdf para a pasta de saída de sua aplicação novamente, e, adivinha ????

Vai matar o seu arquivo atualizado .mdf.

Pronto ! você voltou a estaca zero, e, se repetir o processo vai ficar perdido como um 'cachorro correndo atrás do próprio rabo' sem saber onde esta o problema.

Se você olhar para o arquivo .mdf na janela Server Explorer irá verificar que a propriedade :
Copy to Output Directory tem o valor padrão definido como : Copy Always

Desta forma o arquivo original sempre será copiado, após a compilação, para a pasta de saída da sua aplicação, e, o seu arquivo de trabalho será sobrescrito, e, você perderá todas as alterações feitas.

 

Com isto solucionamos o mistério dos dados perdidos ou não atualizados. Francamente...

Depois dessa, até breve...

Tito 3:10 Ao homem faccioso, depois da primeira e segunda admoestação, evita-o,

Tito 3:11 sabendo que esse tal está pervertido, e vive pecando, e já por si mesmo está condenado.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti