Guardar Imagen en base de datos. (c#)

Iniciado por Hartigan, 13 Junio 2010, 20:25 PM

0 Miembros y 1 Visitante están viendo este tema.

[D4N93R]

Más facil, crea el sqlCommand, y el INSERT en vez de poner todo ahí, en los valores pones @elnombre, es decir, parámetros, de esta forma creas los parameters y se los pones. El código de ejemplo está en el link que te pasé en este mismo post..

Hazlo así, que no te falla.

Hartigan

Cita de: D4N93R en 16 Junio 2010, 01:11 AM
Más facil, crea el sqlCommand, y el INSERT en vez de poner todo ahí, en los valores pones @elnombre, es decir, parámetros, de esta forma creas los parameters y se los pones. El código de ejemplo está en el link que te pasé en este mismo post..

Hazlo así, que no te falla.

NO entiendo!!!. xDD

Raul, no me funciona lo que me has dicho me sale esto:
Sintaxis incorrecta cerca de '?'.
'.      ??. ..        ........      \a\b   
??.? .           .. }   .    !1A  Qa\a' no es un nombre válido, porque contiene un carácter NULL o un carácter Unicode no válido.
El identificador que comienza por '[<?8TA?k??G?|w?K???ea?2H\aa?.? ???|G(?1?7^?  R?a p?w$`W??O????.?r?I?<?9??F1?d?U????Kuu=?[?????88 ????[l?;)+D?s? ????wL?xQ????????' es demasiado largo. La longitud máxima es 128.
El identificador que comienza por '=[??Q??nc??V?5 y ?P={Q????? '?????@.'M????(?? ?#?q????J??6i-?0????-??n???H???k?????UH??>g_???_3?U??B? W?? ?d?3??4 1??&? Ms3???w?' es demasiado largo. La longitud máxima es 128.
El identificador que comienza por 'YN?'x  .?b? ????o?W?y? ??h??????? ??? ??T??w #?Mq???V?H&) ?????}??H?Gr ? ;??? A? ??? K?  ?
sJ???j? ?\a? ???#??:b?`r7????? ?i? ??l' es demasiado largo. La longitud máxima es 128.
El identificador que comienza por '?6'??O??x ??k? ?2?%???H???.?#? ?? ?'? ??? ? ??~ ?^2?E`'? ???????D{ ?\U&??F?RuK_????  ????  ?? ?yt;?;3??n 8<?_RXw ???:4Z???o?$0??' es demasiado largo. La longitud máxima es 128.
El identificador que comienza por '?e?|? ?
?O?????  Mp".-? ?? ??H? b3?????|4??r?[?1??\a? :??q??UE%?.NR?>??@???Gyv _2x??? ?S  ?? ?)u/ ? ???u  ???+=.?3???<? ??\aVc??==' es demasiado largo. La longitud máxima es 128.
El identificador que comienza por '??5??
? ????   _?@=?=?!?????~6 ???'?? ?r??z? * ?
??S??6 { ?^}??8t;?2<y1???? ?(? ???b?=???=o??X???rX???%?r  z?
LIm!??????_?Y }???!' es demasiado largo. La longitud máxima es 128.
Falta la comilla de cierre después de la cadena de caracteres 'i???q^k?/Y?$???????<?????f?????9-+3 I$?{?e8?lpT??????);'.


: :¬¬

raul338

#52
Cita de: D4N93R en 16 Junio 2010, 01:11 AM
Más facil, crea el sqlCommand, y el INSERT en vez de poner todo ahí, en los valores pones @elnombre, es decir, parámetros, de esta forma creas los parameters y se los pones. El código de ejemplo está en el link que te pasé en este mismo post..

Hazlo así, que no te falla.
Eso no resuelve el problema!! :xD :xD
:xD si con eso se resuelve, mira este codigo
Inserting and Retrieving images from SQL Server Database using C#

Citar
Hartigan, eso es porque yo no se usar el tipo Image de sql

mirando aca, http://msdn.microsoft.com/en-us/library/ms187993.aspx dicen que proximamente sacaran al tipo image :P y que en su lugar hay que usar varbinary. Aunque sigo sin encontrar como se debe usar

[D4N93R]

hehe viste raul xD es que yo lo probé y le mandé el código a Hartigan, creo que está en la página 2 xD

Hartigan

Vale voy a probar con ese código. Si con eso ya no funciona. entonces que le den. loool.

[D4N93R]


43H4FH44H45H4CH49H56H45H

#56
@Hartigan

Hice el ejemplo similar al tuyo a la rapida solo para ver el error, al quitar las comillas simples de img indica el error y referencia el modo de hacerlo (no prestes atencion al button1):

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       private void button1_Click(object sender, EventArgs e)
       {
           System.IO.Stream derecho = new System.IO.MemoryStream();
           this.pictureBox1.Image.Save(derecho, System.Drawing.Imaging.ImageFormat.Jpeg);
           byte[] imgDerecha = new byte[derecho.Length];
           derecho.Position = 0;
           derecho.Read(imgDerecha, 0, System.Convert.ToInt32(derecho.Length));
           derecho.Close();
           string cadena_conexion = @"Server= (local)\SQLEXPRESS; DataBase = agenda; Integrated Security = yes;";
           SqlConnection conexion = null;
           conexion = new SqlConnection(cadena_conexion);
           String sentenciaSQL = "insert into contactos (apodo) values('" + imgDerecha + "')";
           SqlDataAdapter data_adapter = new SqlDataAdapter(sentenciaSQL, conexion);
           conexion = new SqlConnection(cadena_conexion);
           conexion.Open();
           SqlCommand cmd = new SqlCommand(sentenciaSQL, conexion);
           if ((1 != cmd.ExecuteNonQuery()))
           {
               MessageBox.Show("Se ha producido un error al acceder a la fuente de datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
           }
       }

       private void button2_Click(object sender, EventArgs e)
       {
           System.IO.Stream derecho = new System.IO.MemoryStream();
           this.pictureBox1.Image.Save(derecho, System.Drawing.Imaging.ImageFormat.Jpeg);
           byte[] imgDerecha = new byte[derecho.Length];
           derecho.Position = 0;
           derecho.Read(imgDerecha, 0, System.Convert.ToInt32(derecho.Length));
           derecho.Close();
           string cadena_conexion = @"Server= (local)\SQLEXPRESS; DataBase = agenda; Integrated Security = yes;";
           SqlConnection conexion = null;
           conexion = new SqlConnection(cadena_conexion);
           String sentenciaSQL = "insert into contactos (apodo, imagen) values('"+ textBox1.Text + "',@img)";
           SqlDataAdapter data_adapter = new SqlDataAdapter(sentenciaSQL, conexion);
           conexion = new SqlConnection(cadena_conexion);
           conexion.Open();
           SqlCommand cmd = new SqlCommand(sentenciaSQL, conexion);
           cmd.Parameters.AddWithValue("@img", imgDerecha);
           if ((1 != cmd.ExecuteNonQuery()))
           {
               MessageBox.Show("Se ha producido un error al acceder a la fuente de datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
           }
       }

       private void button3_Click(object sender, EventArgs e)
       {
           string cadena_conexion = @"Server= (local)\SQLEXPRESS; DataBase = agenda; Integrated Security = yes;";
           byte[] img = new byte[0];
           string[] datos = new string[33];
           String sentenciaSQL = "SELECT * FROM contactos WHERE apodo = 'pru1'";
           SqlConnection conexion = null;
           conexion = new SqlConnection(cadena_conexion);
           SqlDataAdapter data_adapter = new SqlDataAdapter(sentenciaSQL, conexion);
           DataTable data_table = new DataTable();
           conexion.Open();
           data_adapter.Fill(data_table);
           textBox1.Text = data_table.Rows[0][0].ToString();
           img = (byte[]) data_table.Rows[0][1];
           int ArraySize = new int();
           ArraySize = img.GetUpperBound(0);
           System.IO.Stream derec = new System.IO.MemoryStream();
           derec.Write(img, 0, img.Length);
           pictureBox2.Image = Image.FromStream(derec);
       }
   }
}


Solo presta atencion al button 2 y 3 el 1 es para @raul338

Cita de: raul338 en 16 Junio 2010, 00:45 AM
Cita de: 43H4FH44H45H4CH49H56H45H en 15 Junio 2010, 19:34 PM
Me parece que estas guardando img como si fuera un string entre ' ', debes suprimirlas, osea solo guardas:

Código (sql) [Seleccionar]
INSERT INTO contactos (nombre,imagen)
values
('Juan',img);


Esta mal porque no puedes transformar un array a texto asi de simple

Código (sql) [Seleccionar]
INSERT INTO contactos (nombre,imagen)
values
('Juan',img);

Desde C# se convierte a
Código (sql) [Seleccionar]
INSERT INTO contactos (nombre,imagen)
values
('Juan',System.Array);


En realidad seria asi:
Código (sql) [Seleccionar]
INSERT INTO contactos (nombre,imagen)
values
('Juan','System.Byte[]');



Y no se que entiendes por texto, pero mira el code del primer boton almaceno en una columna varchar(50) (apodo) el resultado del uso de las comillas simples, si no es texto entonces que es?????  :-\  

Y te dejo una imagen, si no quieres comprobarlos por ti mismo  :laugh:


-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W

raul338

Cita de: 43H4FH44H45H4CH49H56H45H en 16 Junio 2010, 04:10 AM
Código (csharp) [Seleccionar]

//..........
private void button1_Click(object sender, EventArgs e)
{
        //.........
        String sentenciaSQL = "insert into contactos (apodo) values('" + imgDerecha + "')";
        //.........
}


Solo presta atencion al button 2 y 3 el 1 es para @raul338
En realidad seria asi:
Código (sql) [Seleccionar]
INSERT INTO contactos (nombre,imagen)
values
('Juan','System.Byte[]');



Y no se que entiendes por texto, pero mira el code del primer boton almaceno en una columna varchar(50) (apodo) el resultado del uso de las comillas simples, si no es texto entonces que es?????  :-\ 

Y te dejo una imagen, si no quieres comprobarlos por ti mismo  :laugh:

Es un reto? :xD

1º System.Byte[], bueno tengo la documentacion del .net framework en mi cabeza :xD era lo que recordaba, vos te pensas que abro el visual studio a probar?? no! lo saco de lo que se!

2º Cambiaste el codigo, si guarda el string, pero lo que el intentaba hacer era guardar la imagen como si fuera texto (para colmo sin comillas) cosa que no es lo que estas proponiendo (boton2). Estas proponiendo la misma solucion que pusimos yo y danger, usar command con parametros

Asi que cerra la .... (con cariño jajaja :xD)

43H4FH44H45H4CH49H56H45H

Cita de: raul338 en 16 Junio 2010, 05:59 AM
Es un reto? :xD
Si  :xD

Cita de: raul338 en 16 Junio 2010, 05:59 AM
2º Cambiaste el codigo, si guarda el string, pero lo que el intentaba hacer era guardar la imagen como si fuera texto (para colmo sin comillas) cosa que no es lo que estas proponiendo (boton2). Estas proponiendo la misma solucion que pusimos yo y danger, usar command con parametros

Estas completamente mal, no podria guardar como si fuera texto sin el uso de comillas :rolleyes: y me doy cuenta lo que tratas de decir, pero lo estas diciendo mal, supongo por una falta de conceptos basicos.

En realidad el visual studio te da la solucion al quitar las comillas simples ;D lo que ahorra mucho tiempo en lugar de estar haciendo teorias y buscando enlaces que a la final no sabes si solucionan el problema, y peor confundiendo un system.array con otro diferente que a la final causan mas confusión    :P

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W

raul338

#59
1º que nada System.Byte[] es un array!!! :xD no me crucifiques simplemente por ejemplificar.

2º Me faltan Concepto basicos? Cuales?! :xD

Yo dije que no se como se usa el image de sql porque sinceramente nunca lo use y nunca lo usare. Asi que supuse que se guardaba como archivo binario puro, transformado en texto. Por eso use el GetString y sin las comillas. Luego tu saltaste a decir una gran ovbiedad: que no se puede guardar texto sin comillas :¬¬ cuando en realidad intento guardar datos binarios. Ademas... el primero que tiro esa idea de guardar sin las comillas fuiste vos

La solucion es definitiva. Usar command con parametros (que no recuerdo quien sugirio a principios del hilo y lo pasamos de largo) cosa que es lo que los 3 terminamos proponiendo igual