Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] Error en base de datos Northwind

Estas en el tema de Error en base de datos Northwind en el foro de .NET en Foros del Web. Buenas primero que nada pido disculpas si este tema ya se trato, pero lo busqué y no aparece lo que necesito. El problema es el ...
  #1 (permalink)  
Antiguo 06/05/2017, 20:11
 
Fecha de Ingreso: octubre-2014
Ubicación: Mendoza
Mensajes: 10
Antigüedad: 9 años, 6 meses
Puntos: 0
Error en base de datos Northwind

Buenas primero que nada pido disculpas si este tema ya se trato, pero lo busqué y no aparece lo que necesito. El problema es el siguiente, estoy haciendo una página en asp.net que tiene que llevar un gridview que muestre los datos de la tabla Employee de la base de datos Northwind. Hasta ahí estoy bien, el problema es que necesito editar los datos que vienen desde la base y lo tengo que editar desde el mismo gridview (AutoGenerateEditButton=true), lo que pasa es que al actualizar un dato me da error con el campo Photo de la tabla ya que es de tipo image, y el error que me dice es : nvarchar no es compatible con el tipo de dato image. Busqué por todos lados pero no encuentro respuesta, si alguien me puede orientar un poco estaría más que agradecido (no quiero que me den la solución sólo un poco de orientación de como hacer para que no me de más ese error y se actualice la tabla).
PD: sí o sí lo tengo que hacer de la manera que explique porque es para la facu.
Desde ya muchas gracias a todos.
  #2 (permalink)  
Antiguo 07/05/2017, 03:12
Avatar de Drako_18  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 505
Antigüedad: 18 años, 11 meses
Puntos: 16
Respuesta: Error en base de datos Northwind

Buenas compañero,

El campo Image tienes que tratarlo como un array de Byte...
Por lo que supongo, que andas guardando la ruta de la imagen, cuando deberías guardar el contenido.
Seguramente en san google haya bastante info acerca de cómo guardar un campo Image en BD desde aspx.


Un saludo!
__________________
Rubén Espada
Desarrollador full stack .Net (Angular + JS + .Net Core)
  #3 (permalink)  
Antiguo 08/05/2017, 08:12
 
Fecha de Ingreso: octubre-2014
Ubicación: Mendoza
Mensajes: 10
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Error en base de datos Northwind

Gracias por responder Drako_18. Te comento el tema de mostrar la imagen logré resolverlo, pero tengo un problema, al momento de mostrar las imagenes siempre me muestra la misma ya que le paso el id por url y el gridview tiene que mostrar una imagen distinta por cada fila, ¿alguna idea?. Acá dejo el código que tengo hasta ahora:

Archivo Handler.ashx (manejador para el tratamiento de imágenes)
Código:
public class Handler : IHttpHandler {

    public void ProcessRequest(HttpContext context)
    {
        string id = context.Request.QueryString["id"];
        
        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection("Data Source=PROPIETARIO-HP\\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True");
        System.Data.SqlClient.SqlCommand com = new System.Data.SqlClient.SqlCommand("SELECT Photo FROM Employees where EmployeeID=" + id, con);
        

        con.Open();
        byte[] foto = (byte[])com.ExecuteScalar();
        con.Close();

        context.Response.ContentType = "image/jpeg";
        context.Response.OutputStream.Write(foto, 78, foto.Length - 78);



        //System.Data.DataSet ds = new System.Data.DataSet();
        //da.Fill(ds, "Employees");
        //con.Open();
        //byte[] foto = null;
        //int[] img = new int[9];
        //byte[][] img = new byte[9][];
        //if (ds.Tables["Employees"].Rows.Count != 0)
        //{
        //    for (int i = 0; i < ds.Tables["Employees"].Rows.Count; i++)
        //    {
        //        foto = (byte[])ds.Tables["Employees"].Rows[i]["Photo"];
        //    }
        //}
        


        //con.Close();

        //for (int j = 0; j < foto.Length; j++)
        //{
        //    context.Response.ContentType = "image/jpeg";
        //    context.Response.OutputStream.Write(foto, 78, foto.Length - 78); 
        //}
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }

}

El código que está comentado lo dejé para que vean que intenté hacer un for para recorrer las distintas imágenes y que las asigne pero también siempre me muestra la misma.
Archivo aspx

Código:
<asp:GridView runat="server" ID="gvLista" AllowSorting="True" 
            AutoGenerateEditButton="True" AutoGenerateDeleteButton="True" DataKeyNames="EmployeeID" AutoGenerateColumns="False" DataSourceID="sqldsDatos">
            <Columns>
                <asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID" InsertVisible="False" ReadOnly="True" SortExpression="EmployeeID" />
                <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
                <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
                <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
                <asp:BoundField DataField="TitleOfCourtesy" HeaderText="TitleOfCourtesy" SortExpression="TitleOfCourtesy" />
                <asp:BoundField DataField="BirthDate" HeaderText="BirthDate" SortExpression="BirthDate" />
                <asp:BoundField DataField="HireDate" HeaderText="HireDate" SortExpression="HireDate" />
                <asp:BoundField DataField="Address" HeaderText="Address" SortExpression="Address" />
                <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                <asp:BoundField DataField="Region" HeaderText="Region" SortExpression="Region" />
                <asp:BoundField DataField="PostalCode" HeaderText="PostalCode" SortExpression="PostalCode" />
                <asp:BoundField DataField="Country" HeaderText="Country" SortExpression="Country" />
                <asp:BoundField DataField="HomePhone" HeaderText="HomePhone" SortExpression="HomePhone" />
                <asp:BoundField DataField="Extension" HeaderText="Extension" SortExpression="Extension" />
                <asp:ImageField DataImageUrlField="Photo" DataImageUrlFormatString="~/Handler.ashx?id=1" HeaderText="Photo" SortExpression="Photo" />
                <asp:BoundField DataField="Notes" HeaderText="Notes" SortExpression="Notes" />
                <asp:BoundField DataField="ReportsTo" HeaderText="ReportsTo" SortExpression="ReportsTo" />
                <asp:BoundField DataField="PhotoPath" HeaderText="PhotoPath" SortExpression="PhotoPath" />
            </Columns>
        </asp:GridView>
        
        <asp:SqlDataSource runat="server" ID="sqldsDatos" SelectCommand="SELECT * FROM [Employees]"
            UpdateCommand="UPDATE [Employees] SET [LastName] = @LastName, [FirstName] = @FirstName, [Title] = @Title, [TitleOfCourtesy] = @TitleOfCourtesy, [BirthDate] = @BirthDate,
            [HireDate] = @HireDate, [Address] = @Address, [City] = @City, [Region] = @Region, [PostalCode] = @PostalCode, [Country] = @Country, [HomePhone] = @HomePhone,
            [Extension] = @Extension, [Notes] = @Notes, [ReportsTo] = @ReportsTo WHERE [EmployeeID] = @EmployeeID"
            DeleteCommand="DELETE FROM [Employees] WHERE [EmployeeID] = @EmployeeID" ConnectionString="<%$ ConnectionStrings:Northwind %>">
Como ven en el campo ImageField en la propiedad DataImageUrlFormatString le paso la página del manejador con un id, pero lo que yo necesito es que me muestre las distintas imágenes que hay en la base y de la forma en que lo tengo siempre me muestra la misma.
  #4 (permalink)  
Antiguo 08/05/2017, 12:39
Avatar de Drako_18  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 505
Antigüedad: 18 años, 11 meses
Puntos: 16
Respuesta: Error en base de datos Northwind

De nada, todos hemos tenido que aprender preguntando...

Lo primero, es que la línea que te pongo a continuación, tiene el ID puesto a "pincho", hay que ponerlo con un eval o bind (no recuerdo la diferencia).
<asp:ImageField DataImageUrlField="Photo" DataImageUrlFormatString="~/Handler.ashx?id=1" HeaderText="Photo" SortExpression="Photo" />

esto podrías ponerlo así:
<asp:ImageField DataImageUrlField="Photo" DataImageUrlFormatString='~/Handler.ashx?id=<%# Eval("CorporateAddressCountry") %>' HeaderText="Photo" SortExpression="Photo" />

Posiblemente tengas que poner la parte del principio del url format dentro del <%# como si fuese una cadena de .Net...
Seguramente hay otras formas de hacerlo, pero esta es la que conozco :D


Un saludo compañero!
__________________
Rubén Espada
Desarrollador full stack .Net (Angular + JS + .Net Core)
  #5 (permalink)  
Antiguo 08/05/2017, 17:36
 
Fecha de Ingreso: octubre-2014
Ubicación: Mendoza
Mensajes: 10
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Error en base de datos Northwind

Gracias Drako_18 nuevamente por tu respuesta, lo pude hacer, era una pavada sólo tenía que cambiar la propiedad DataImageUrlField. Ahora paso a dejar el código de como quedó resuelto por si a alguien más le sirve y marco el tema como cerrado. Muchas gracias.

Página aspx

Código:
<asp:GridView runat="server" ID="gvLista" AllowSorting="True" 
            AutoGenerateEditButton="True" AutoGenerateDeleteButton="True" DataKeyNames="EmployeeID" AutoGenerateColumns="False" DataSourceID="sqldsDatos">
            <Columns>
                <asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID" InsertVisible="False" ReadOnly="True" SortExpression="EmployeeID" />
                <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
                <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
                <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
                <asp:BoundField DataField="TitleOfCourtesy" HeaderText="TitleOfCourtesy" SortExpression="TitleOfCourtesy" />
                <asp:BoundField DataField="BirthDate" HeaderText="BirthDate" SortExpression="BirthDate" />
                <asp:BoundField DataField="HireDate" HeaderText="HireDate" SortExpression="HireDate" />
                <asp:BoundField DataField="Address" HeaderText="Address" SortExpression="Address" />
                <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                <asp:BoundField DataField="Region" HeaderText="Region" SortExpression="Region" />
                <asp:BoundField DataField="PostalCode" HeaderText="PostalCode" SortExpression="PostalCode" />
                <asp:BoundField DataField="Country" HeaderText="Country" SortExpression="Country" />
                <asp:BoundField DataField="HomePhone" HeaderText="HomePhone" SortExpression="HomePhone" />
                <asp:BoundField DataField="Extension" HeaderText="Extension" SortExpression="Extension" />
                <asp:ImageField DataImageUrlField="EmployeeID" DataImageUrlFormatString="~/Handler.ashx?id={0}" HeaderText="Photo" SortExpression="Photo" ReadOnly="true" />
                <asp:BoundField DataField="Notes" HeaderText="Notes" SortExpression="Notes" />
                <asp:BoundField DataField="ReportsTo" HeaderText="ReportsTo" SortExpression="ReportsTo" />
                <asp:BoundField DataField="PhotoPath" HeaderText="PhotoPath" SortExpression="PhotoPath" />
            </Columns>
        </asp:GridView>
        
        <asp:SqlDataSource runat="server" ID="sqldsDatos" SelectCommand="SELECT * FROM [Employees]"
Página ashx (para el tratamiento de las imágenes)

Código:
public class Handler : IHttpHandler {

    public void ProcessRequest(HttpContext context)
    {
        string id = context.Request.QueryString["id"];
        
        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection("Data Source=PROPIETARIO-HP\\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True");
        System.Data.SqlClient.SqlCommand com = new System.Data.SqlClient.SqlCommand("SELECT Photo FROM Employees where EmployeeID=" + id, con);
        

        con.Open();
        byte[] foto = (byte[])com.ExecuteScalar();
        con.Close();

        context.Response.ContentType = "image/jpeg";
        context.Response.OutputStream.Write(foto, 78, foto.Length - 78);
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }

}

Etiquetas: asp
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:21.