2010-10-27 10 views
14

Así que tengo un sitio web ASP.NET (no aplicación web) que estoy creando en VS2010 con C#. Funciona bien en mi equipo, pero cuando lo cargo en el sitio en el que está alojado, no se compila, dando: "CS0246: No se pudo encontrar el tipo o el nombre del espacio de nombres 'DataAccess' (¿falta una directiva using o ¿una referencia de ensamblado?) "El sitio web ASP.NET no puede ver el archivo .cs en la carpeta App_Code

He estado utilizando la característica del sitio web de copia en VS y no tuve ningún problema hasta que quise poner mi propia clase en la carpeta App_Code y usarla. Leí en otras respuestas sobre cómo cambiar las propiedades .cs a "Compilar" en lugar de "Contenido", pero no hay ninguna opción para mí en las propiedades del archivo ... solo Nombre de archivo, Ruta completa y Herramienta personalizada. Aquí está el código del archivo .cs:

using System; 
using System.Data; 
using System.Data.SqlClient; 
using System.Web.Configuration; 

/// <summary> 
/// Provides access to SQL Server database. 
/// </summary> 
/// 
public class DataAccess 
{ 
    //Variables & public properties *********************************** 
    private string connectionString = ""; 
    private int recordCount = -1; 

    /// <summary> 
    /// Property: gets count of records retrieved or changed 
    /// </summary> 
    public int Count 
    { 
     get 
     { 
      return recordCount; 
     } 
    } 

    //Class constructor is executed when object is initialized *********** 
    /// <summary> 
    /// Connection string name in web.config file is required to initialize DataAccess 
    /// </summary> 
    /// <param name="ConnectionName">Name of web.config connection string</param> 
    public DataAccess(string ConnectionName) 
    { 
     if (WebConfigurationManager.ConnectionStrings[ConnectionName] == null) { 
      throw new Exception("Cannot find connection string named '" + 
       ConnectionName + "' in web.config"); 
     } 
     //Get connection string from web.config. 
     connectionString = WebConfigurationManager.ConnectionStrings[ConnectionName].ConnectionString; 
    } 
    /// <summary> 
    /// Executes SELECT statement and returns results in dataTable 
    /// </summary> 
    /// <param name="SQL">Select SQL statement</param> 
    /// <returns></returns> 
    public DataTable FillDataTable(string SQL) 
    { 
     SqlConnection _objConn = new SqlConnection(connectionString); 
     SqlDataAdapter objAdapter = new SqlDataAdapter(SQL, _objConn); 
     DataTable dt = new DataTable(); 
     try { 
      objAdapter.Fill(dt); 
     } 
     catch (SqlException ex) { 
      throw new Exception("Error in SQL:" + SQL, ex); 
     } 
     catch (Exception ex) { 
      throw ex; //Bubbling exception up to parent class 
     } 
     finally { 
      _objConn.Close(); 
     } 

     recordCount = dt.Rows.Count; 
     return dt; 
    } 

    /// <summary> 
    /// Executes "non-query" SQL statements (insert, update, delete) 
    /// </summary> 
    /// <param name="SQL">insert, update or delete</param> 
    /// <returns>Number of records affected</returns> 
    public int ExecuteNonQuery(string SQL) 
    { 
     SqlConnection _objConn = new SqlConnection(connectionString); 
     try { 
      _objConn.Open(); 
      SqlCommand objCmd = new SqlCommand(SQL, _objConn); 
      recordCount = objCmd.ExecuteNonQuery(); 
     } 
     catch (SqlException ex) { 
      throw new Exception("Error in SQL:" + SQL, ex); 
     } 
     catch (Exception ex) { 
      throw new Exception(ex.Message); //Rethrowing exception up to parent class 
     } 
     finally { _objConn.Close(); } 

     return recordCount; 
    } 

    public int ExecuteScalar(String SQL) 
    { 
     SqlConnection _objConn = new SqlConnection(connectionString); 
     int intID; 
     try { 
      _objConn.Open(); 
      SqlCommand objCmd = new SqlCommand(SQL, _objConn); 
      intID = Convert.ToInt32(objCmd.ExecuteScalar()); 
     } 
     catch (SqlException ex) { 
      throw new Exception("Error in SQL:" + SQL, ex); 
     } 
     catch (Exception ex) { 
      throw new Exception(ex.Message); //Rethrowing exception up to parent class 
     } 
     finally { _objConn.Close(); } 
     return intID; 
    } 

}//end class 

y desde mi página:

<%@ Page Language="C#" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<script runat="server"> 

protected void Page_Load(object sender, EventArgs e) 
{ 
    //Initialize dataAccess class 
    DataAccess myDA = new DataAccess("A05Customers"); 

    //Populate dataTable and bind to GridView Control 
    string strSQL = "Select * from tblCustomers"; 

    gvCustomers.DataSource = myDA.FillDataTable(strSQL); 
    gvCustomers.DataBind(); 
} 
</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>GridView</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div align="center" style="font-family: Verdana"> 
    <h2>GridView</h2> 
    <hr style="color: #0000FF" width="800" /> 
    <br /> 
    <asp:GridView ID="gvCustomers" runat="server" BackColor="#FFFFCC" BorderColor="#336699" BorderStyle="Inset" BorderWidth="5px" CellPadding="2" CellSpacing="4" /> 
    <br /> 
</div> 
    </form> 
</body> 
</html> 

Gracias por su ayuda!

+0

Consulte esta pregunta previamente hecha. Esta es una pregunta frecuente. http://stackoverflow.com/questions/89570/app-code-folder-issues – David

Respuesta

0

Probablemente necesite compilar su aplicación antes de implementarla. Por el momento, ASP.NET no tiene forma de saber acerca de los archivos .cs que no están adjuntos a los archivos .aspx/.ascx. Recomiendo mirar Proyectos de implementación web o usar la opción "Publicar" de Visual Studio 2010. Scott Guthrie ofrece un resumen mejor que el que pude here.

+0

alternativamente podría intentar volver a guardar su web.config – jcolebrand

+0

Eso reiniciará la aplicación, pero el archivo .cs en su "App_Code" carpeta aún nunca será compilada. – nizmow

5

Tiene la carpeta app_code en la carpeta raíz de la aplicación web (no solo la carpeta o la carpeta virtual). Parece que Asp.NET no puede ver la carpeta app_code.

Las opciones de compilación y concordancia solo están disponibles en el proyecto de aplicación Web.

20

Por defecto, los sitios web no compilan archivos .cs. Tendrá que hacer algunas cosas diferentes.

  1. Establezca cada archivo de clase para "compilar" en las propiedades para ese archivo de clase. Puede ver esta opción haciendo clic en el archivo de clase, viendo las propiedades en la ventana del explorador de propiedades y cambiando la lista desplegable de Acción de compilación a "Compilar".

  2. Si lo anterior no ayuda, elimine la clase del app_code y suéltelo en la carpeta raíz.

+0

¿Alguien sabe por qué algunos archivos CS deben tener esto hecho para entonces y otros no? Tuve el mismo problema que el OP con un archivo que agregué a través de VS2012 a un proyecto de WebMatrix. Las clases en ese archivo simplemente no se encontraron hasta que establecí la "acción de compilación" del archivo en Compilar (era Contenido) como sugerencia (gracias por eso). Sin embargo, los otros 3 archivos en el directorio App_Code se establecieron en "Contenido" y sus clases fueron accesibles. Debe haber un archivo de configuración en algún lugar que hace la diferencia o algo? –

+2

Descubrí que debe cambiar todo en la carpeta App_Code para Crear acción> Compilar, luego haga una Solución limpia seguida de la eliminación de todos los archivos de la carpeta obj, y luego Acción de compilación> Ninguno (esto es opcional). Descubrí que las viejas referencias de Cache se quedan en "obj" si tienes archivos * .cs en la carpeta App_Data, y la compilación no fue exitosa. – MacGyver

+0

DesignTimeResolveAssemblyReferencesInput.cache es el archivo que se cuelga en la carpeta "obj". Eliminar eso – MacGyver

1

Hice esta pregunta antes de comenzar una cuenta, de lo contrario, la editaría.

Tengo el mismo error después:

  1. Comprobación de que tengo un sitio Web, no aplicación web, por lo tanto, no hay contenido/propiedades de compilación para el archivo .cs.

  2. Comprobando la posición de la carpeta App_Code. Traté de poner GridView.aspx en la raíz, así como en su propia carpeta, el mismo error. \ \ App_Code DataAccess.cs \ App_Data \ GridView GridView.aspx Web.config

  3. Mover la clase de App_Code de raíz. Mismo error.

  4. Esto último pensé que funcionaría, pero no lo hizo.Se utilizó la función Publicar sitio web para cargar código precompilado. Pude ver que ahora era DataAccess.dll en la carpeta bin, y había un archivo PrecompiledApp.config en la raíz. Mismo error.

ACTUALIZACIÓN: lo resolvió: la estructura de carpetas en el servidor era como la local, pero que tenía todo en una subcarpeta ... App_Code y App_Data deben estar en la raíz del servidor.

+0

Me salvaste el día. Tuve que hacer algunos cambios en este antiguo sitio web heredado. Tenía App_code no exactamente debajo de la raíz directamente, pero un nivel abajo. Así que lo cerré y abrí la carpeta de modo que App_code estuviera justo debajo de la raíz ... y no hubo ningún error. Gracias por poner la ACTUALIZACIÓN al final. Me ayudó. – shazia

Cuestiones relacionadas