|
Buenas, tiempos de problemas.
Primero, veamos el entorno
- VS2005
- SQL2005
- XP Professional
- muchas ganas de aprender cosas nuevas
Pero dentro de una nueva aplicación Asp.net 2.0, al intentar ejecutarla (creada a partir de uno de los buenísimos Themes q brinda Microsoft), me encuentro con el siguiente error:
|
System.Web.HttpException was unhandled by user code
ErrorCode=-2147467259
Message="Unable to connect to SQL Server database."
Source="System.Web"
StackTrace:
at System.Web.DataAccess.SqlConnectionHelper.CreateMdfFile(String fullFileName, String dataDir, String connectionString)
at System.Web.DataAccess.SqlConnectionHelper.EnsureSqlExpressDBFile(String connectionString)
at System.Web.DataAccess.SqlConnectionHelper.GetConnection(String connectionString, Boolean revertImpersonation)
at System.Web.Profile.SqlProfileProvider.GetPropertyValuesFromDatabase(String userName, SettingsPropertyValueCollection svc)
at System.Web.Profile.SqlProfileProvider.GetPropertyValues(SettingsContext sc, SettingsPropertyCollection properties)
at System.Configuration.SettingsBase.GetPropertiesFromProvider(SettingsProvider provider)
at System.Configuration.SettingsBase.SetPropertyValueByName(String propertyName, Object propertyValue)
at System.Configuration.SettingsBase.set_Item(String propertyName, Object value)
at System.Web.Profile.ProfileBase.SetInternal(String propertyName, Object value)
at System.Web.Profile.ProfileBase.set_Item(String propertyName, Object value)
at System.Web.Profile.ProfileBase.SetPropertyValue(String propertyName, Object propertyValue)
at ProfileCommon.set_StylesheetTheme(String Value) in C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\XYZ\da8f1339\4a0fa103\App_Code.ziuysgcm.1.vb:line 27
at AppMaster.Themepicker_Command(Object sender, CommandEventArgs e) in D:\Projects\WebSites\XYZ\AppMaster.master.vb:line 8
at System.Web.UI.WebControls.ImageButton.OnCommand(CommandEventArgs e)
at System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument)
at System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
|
Después de un rato largo de buscar y ver un poco las nuevas herramientas de administración de SQL2005, veo que la descripción del error no era lo suficientemente concreta para mí, ya que no se estaba refiriendo a “mi” cadena de conexión dentro del Web.config, sino a la cadena de conexión para el nuevo namespace System.Web.Managemenr.SqlServices para la administración de datos en Asp.Net 2.0 relacionados a la seguridad, almacenamiento en sesión, etc.
Para solucionar este problema, hay q “crear” la base de datos que permite gestionar desde Asp.Net 2.0 esta información. Para esto debemos correr desde la línea de comandos la siguiente sentencia: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe. Gracias a esto conocí la Asp.Net SqlServer Registration Tool (Aspnet_regsql.exe). Después de un pequeño asistente, tenemos configurada nuestro SQL2005 con una nueva base de datos para Asp.Net 2.0 (aspnetdb).
Sin embargo aquí no termina todo, ya que el error sigue presente (es de esos que no se dan por vencidos). Solución, seguir navegando MSDN. Dentro de la documentación de la herramienta, encuentro un dato más que interesante.
|
When you install ASP.NET, the Machine.config file for your server includes configuration elements that specify SQL Server providers for each of the ASP.NET features that rely on a provider. These providers are configured, by default, to connect to a local user instance of SQL Server Express 2005. If you change the default connection string used by the providers, then before you can use any of the ASP.NET features configured in the machine configuration, you must install the SQL Server database and the database elements for your chosen feature using Aspnet_regsql.exe. If the database that you specify with the SQL registration tool does not already exist (aspnetdb will be the default database if one is not specified on the command line), then the current user must have rights to create databases in SQL Server as well as to create schema elements within a database.
Each SQL Server provider can use the same SQL Server database to store the data for that particular feature. Each feature can be used individually, or in conjunction with other features. For example, you could use Role Management by itself or in conjunction with the user information managed by Membership.
|
En pocas palabras, .Net viene configurado para utilizar una instancia de SQLExpress para acceder a esta información. En mi caso, que no poseo SQL Express, la siguiente línea del archivo Machine.Config no es válida.
|
<connectionStrings>
<add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" />
</connectionStrings>
|
Por lo que modifico el mismo C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\Machine.config (cuidado con este paso), con la cadena de conexión correspondiente y luego pruebo la aplicación. ¡¡¡Perfecto!!! Funciona de perlas.
Pero hay algo que no me termina de convencer, ¿debo modificar el Machine.Config para poder ejecutar mi aplicación? La verdad es que no debería. Seguimos en el MSDN, y veo que puedo agregar esta configuración dentro del Web.Config de mi aplicación. Creo una nueva entrada en la sección de cadenas de conexión y luego creo las secciones para el manejo de perfiles y membership.
|
<connectionStrings>
<add name="AspNetdb"
connectionString="Data Source=.;Integrated Security=False;Initial Catalog=aspnetdb;User ID=xxx;Password=xyz"
providerName="System.Data.SqlClient" />
<add name="pubsConnectionString" connectionString="Data Source=.;Integrated Security=False;Initial Catalog=pubs; User ID=xxx;Password=xyz "
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<compilation debug="true"/>
<authentication mode="Windows"/>
<membership defaultProvider="SqlProvider"
userIsOnlineTimeWindow="15">
<providers>
<clear/>
<add name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="AspNetdb"/>
</providers>
</membership>
<profile enabled="true" defaultProvider="SqlProvider">
<providers>
<clear />
<add name="SqlProvider"
type="System.Web.Profile.SqlProfileProvider"
connectionStringName="AspNetdb"/>
</providers>
<properties>
<!– Available values for the StyleSheetTheme attribute: "Green", "Brown", "Red".–>
<add name="StylesheetTheme" defaultValue="Green" allowAnonymous="true" />
</properties>
</profile>
|
Cada sección dentro del Web.Config contiene un atributo DefaultProvider y dentro de las mismas he creado el provider correspondiente para la base de datos.
La aplicación ahora funciona correctamente y gracias a .Net 2.0 puedo aprovechar muchas de las funcionalidades que antes desarrollabamos para cada aplicación, directamente desde el VS2005.
Saludos
|
Leave a comment