quinta-feira, 2 de outubro de 2008

Problemas na implementação de aplicação ASP.NET 2.0 SQL EXPRESS e SQL 2005

O WebPartManager utiliza uma base de dados para gravar as configurações de cada utilizador. Ele tenta aceder a instância padrão do SQL Server 2005 / SQL Server 2005 Express no localhost, procurando por .\SQLEXPRESS.

O grande problema é que no SQL Server 2005 este não é o nome da instância, o que resulta no seguinte erro.

"An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)"

Na utilização do Membership Provider criado no VS2008 a gestão da conection String fica a cargo do machine.config com o código abaixo.

c:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config


< connectionStrings
>

<add
name="LocalSqlServer"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient"/>

</ connectionStrings
>


Há então que reescrever a connection String no nosso web.config

</configSections>

<connectionStrings>

<remove
name="LocalSqlServer" />

<add
name="LocalSqlServer"
connectionString="Data Source=NOMEDOSERVIDOR;Initial Catalog=ASPNETDB;Integrated Security=True;"

providerName="System.Data.SqlClient" />

</connectionStrings>

<system.web>

Este código, primeiro remove as configurações default (aquelas que não permitiam funcionar) e depois adiciona a nova connection string.

Termos agora que gerar as tabelas e as queries padrões do WebPartManager. Para resolver este problema, temos um assistente do próprio ASP.NET que faz isso, criando todas as tabelas/triggers/queries etc na nossa base de dados.

Execute C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe e siga o wizard selecionando o servidor e o base de dados.


Feito isto pode surgir um novo erro quando tentamos aceder. Não é mais do que falta de permissões do user ASPNET para aceder à nossa BD.

Cannot open database "ASPNETDB" requested by the login. The login failed.
Login failed for user 'DGU\ASPNET'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: Cannot open database "ASPNETDB" requested by the login. The login failed.
Login failed for user 'DGU\ASPNET'.

O SQL Server possui dois tipos de autenticação : Windows e Standard.

A autenticação recomendada é, em 99% dos casos, a autenticação Windows. Mas esta autenticação frequentemente requer configurações envolvendo o servidor web.

Na fase de desenvolvimento podemos usar a autenticação standard.

Mas na fase de implementação da aplicação no ambiente empresarial mudar isso para autenticação windows.

Então, faça o seguinte :

1) Aceda ao SQL Server Management Studio

2) Clique com o botão direito no servidor e entre em propriedades

3) Vá ao separador security

4) ligue o modo de autenticação Windows.

5) feche esta janela.

6) Abra a pasta security

7) Abra a pasta logins

8) Peça para editar o login aspnet

9) Clique em User Mapping

10) Seleccione a opção Map do ASPNETDB e dê permissões de BasicAccess ao user ASPNET

11) Feche esta janela

13) Pronto, pode testar.