zapisanie obrazka do bazy sql za pomocą inserta

0

witam

mam pytanie odnośnie zapisywania obrazków do bazy sql za pomocą inserta poprzez program napisany w c#. Zadaniem programu jest dołożenie do bazy danych innego programu, obrazów umiejscowionych na serwerze ftp. dokładniej mówiąc użytkownik wybiera konkretny plik z listą obrazków, który następnie jest przetwarzany oczywiście i na podstawie do bazy docelowej dodawana są docelowe obrazki. Generalnie wszystko udało mi się osiągnąć oprócz wrzucenia zawartości obrazka do bazy. mianowicie odpowiada za nią kolumna typu "image" - ( tak po prostu jest zbudowana baza docelowego programu) w obecnej chwili udało mi się dodawać zdjęcia tak, że zawartość tego pola ( typu image ) po wykonaniu samego inserta gdzie problematyczne pole zostawiam puste, update'uje przy pomocy select'a z wcześniej dodanego zdjęcia - problem w tym, że oczywiście nie chce aby kolejne 5tysięcy zdjęć wyglądało tak samo.

Jak powinienem to wykonać, aby było dobrze ? starałem się konwertować obrazek do byte array i następnie to insertować jednak nic z tego - w momencie odpalenia programu i wyświetlenia danego obrazka - program wywala się. na podstawie zdobytych informacji - w typie image obrazek powinienem zapisywać jako Hexadecimal ( czyli np. 0xFFD8FFE000104A46494600010101006000600000FFE1002245786966).

I teraz mam dwa pytania:
a) jak skonwertować typ jpg / png na hex
b) jak umieścić typ hex do bazy - starałem się "na siłę" wrzucić kod zdobyty poprzez np. http://www.motobit.com/util/binary-file-to-sql-hexstring.asp ale z tego co rozumiem w takim momencie taka zmienna uznawana jest za string poprzez wrzuca się to jako błędny plik.

1

i oczywiście szukałeś i oczywiście nigdzie nie było... https://www.google.pl/search?q=c%23+ms+sql+insert+image

0

Nie wiem czy jest to dobre rozwiązanie czy nie, może da się prościej. W każdym razie ja korzystam z takiej mniej więcej konstrukcji:

            var i = new Image();
            var ms = new MemoryStream();
            file.InputStream.CopyTo(ms);
            i.Imagee = ms.ToArray();
            i.Path = "asd";
            i.ImageType = Path.GetExtension(file.FileName).Replace(".", "");

"Image" z pierwszej linijki to moja klasa z polami i z niej generuje tabelę w SQL w której pole Imagee to tablica bajtów.

0

poniżej część mojego kodu nad ktorym teraz pracuje . szukałem w google i próbowałem już paru rozwiązań, ale niestety z takim samym skutkiem. mianowicie do bazy laduje jakąś wartość tego obrazka jednakze, w momencie kiedy chcę uruchomić zakładkę z tym obrazkiem to program się wysypuje.

do obecnego rozwiązania wykorzystałem przykład :
http://www.redmondpie.com/inserting-in-and-retrieving-image-from-sql-server-database-using-c/

 // tutaj wybieram obrazek, ktory chce dodac
 private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();

     // Fiter,used to Filter the image in the required filetype(s)  

            open.Filter = "Images (*.BMP;*.JPG;*.GIF;*.PNG)|*.BMP;*.JPG;*.GIF;*.PNG";

    if (open.ShowDialog() == DialogResult.OK)

    {

       pictureBox1.Image = new Bitmap(open.FileName);

       txtPathdirectory.Text = open.FileName;

     }
// tutaj wykonuje dodawanie 
 private void button2_Click(object sender, EventArgs e)
        {
            SqlQueriesConfigReader sqcr = new SqlQueriesConfigReader();
            sqcr.SqlQueriesConfigReaderFunction(databaseConfigFile);
            jodb baza = new jodb(sqcr.loginDB, sqcr.passwordDB, sqcr.DB, sqcr.dbDB);

            string imagename;
            imagename = txtPathdirectory.Text; // txt.PathDirectory wybiera 
            FileStream fs;
            fs = new FileStream(@imagename, FileMode.Open, FileAccess.Read);
            byte[] picbyte = new byte[fs.Length];
            fs.Read(picbyte, 0, System.Convert.ToInt32(fs.Length));
            fs.Close();

            string query = "update im__Image SET im_Preview  = '@img' where  im_Id = '4610'";
            baza.dodajObrazek(query, picbyte);
            MessageBox.Show("Image Added");
        }
//tutaj jest sama funkcja dodawania 
public void dodajObrazek(string q, byte[] pic) 
        {
            polaczenie.Open();
            SqlParameter picparameter = new SqlParameter();
            picparameter.SqlDbType = SqlDbType.Image;
            picparameter.ParameterName = "pic";
            picparameter.Value = pic;
            SqlCommand cmd = new SqlCommand(q, this.polaczenie);
            cmd.Parameters.Add(picparameter);
            cmd.ExecuteNonQuery();
            polaczenie.Close();
        } 

wydaje mi się, że coś jest nie tak gdyż bez względu na to jaki obrazek umieszczam to wartośc pola im_Preview wynosi : "0x40696D67"

1
  1. jak wygląda tabela im__Image?
  2. stawiasz breakpointa tu byte[] picbyte = new byte[fs.Length]; i patrzysz ile wynosi fs.Length i czy ma coś wspólnego z wielkością pliku z obrazkiem, potem tu fs.Close(); patrzysz co jest w tablicy picbyte i czy ma to coś wspólnego z zawartością pliku
0
abrakadaber napisał(a):
  1. jak wygląda tabela im__Image?
  2. stawiasz breakpointa tu byte[] picbyte = new byte[fs.Length]; i patrzysz ile wynosi fs.Length i czy ma coś wspólnego z wielkością pliku z obrazkiem, potem tu fs.Close(); patrzysz co jest w tablicy picbyte i czy ma to coś wspólnego z zawartością pliku
  1. zarówno picbyte jak i fs.Length wskazują prawidłową wartość zgodną z wielkością pliku
  2. w tabeli im_Image znajdują się rekordy tak jak id obrazka, jego nazwa, checksuma , szerokość, wysokość i rozmiar - sprawdzałem jednak czy przy podaniu pozostałych wartości jako nieprawidłowych czy też pustych program będzie działał prawidłowo i tak też jest ( oczywiście docelowo zajmę się tym jednak teraz chce osiągnąć zainsertowanie obrazka w prawidłowy sposób )
0

to jedyne co mi przychodzi do głowy to to, że nie ma rekordu o im_Id = '4610'. BTW czemu id i img podajesz jako string?

0

hmmm- im_Id = 4610 jest bo wyswietlam go sobie potem w sql server managment i tam właśnie jest taka a nie inna wartość.

generalnie robiłem zgodnie z wyżej wymienioną stroną i tam img był jako string - rozumiem, że po prostu funkcja Filestream używa adresu url danego obrazka i stamta go wrzuca i stąd ten img.

zastanawiam się teraz.. sam program uruchamiam z komputera A który łączy się do servera SQL na komputerze B i może sęk w tym właśnie, że ja próbuje umieścić obrazek z dysku lokalnego i B go nie widzi?

0

tu masz jako stringi

update im__Image SET im_Preview  = '@img' where  im_Id = '4610'

widzisz teraz

0

problem leżał faktycznie w tym stringu - powinno być bez nawiasów jak i w samej funkcji dodającej obrazek. dzięki za poświęcony:-) czas prawidłowy kod:

// tutaj wybieram obrazek, ktory chce dodac
 private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();
 
     // Fiter,used to Filter the image in the required filetype(s)  
 
            open.Filter = "Images (*.BMP;*.JPG;*.GIF;*.PNG)|*.BMP;*.JPG;*.GIF;*.PNG";
 
    if (open.ShowDialog() == DialogResult.OK)
 
    {
 
       pictureBox1.Image = new Bitmap(open.FileName);
 
       txtPathdirectory.Text = open.FileName;
 
     }
// tutaj wykonuje dodawanie 
 private void button2_Click(object sender, EventArgs e)
        {
            SqlQueriesConfigReader sqcr = new SqlQueriesConfigReader();
            sqcr.SqlQueriesConfigReaderFunction(databaseConfigFile);
            jodb baza = new jodb(sqcr.loginDB, sqcr.passwordDB, sqcr.DB, sqcr.dbDB);
 
            string imagename;
            imagename = txtPathdirectory.Text; // txt.PathDirectory wybiera 
            FileStream fs;
            fs = new FileStream(@imagename, FileMode.Open, FileAccess.Read);
            byte[] picbyte = new byte[fs.Length];
            fs.Read(picbyte, 0, System.Convert.ToInt32(fs.Length));
            fs.Close();
 
            string query = "update im__Image SET im_Preview  = @img where  im_Id = 4600";
            baza.dodajObrazek(query, picbyte);
            MessageBox.Show("Image Added");
        }
//tutaj jest sama funkcja dodawania 
public void dodajObrazek(string q, byte[] pic) 
        {
            polaczenie.Open();
            SqlParameter picparameter = new SqlParameter();
            picparameter.SqlDbType = SqlDbType.Image;
            picparameter.ParameterName = "img";
            picparameter.Value = pic;
            SqlCommand cmd = new SqlCommand(q, this.polaczenie);
            cmd.Parameters.Add(picparameter);
            cmd.ExecuteNonQuery();
            polaczenie.Close();
        }  

1 użytkowników online, w tym zalogowanych: 0, gości: 1