Konwersja byte[] z bazy MS SQL na zdjecie

0

Witam wszystkich,
za poprzednią wersje posta przepraszam, szczególnie tych, którzy go mimo wszystko przeczytali;)
Problem:
wysyłam fotke jako byte[] do bazy danych ms sql. Kod

...
pictureBox1.Image.Save(msFoto, System.Drawing.Imaging.ImageFormat.Gif);
        byte[] zdj = msFoto.ToArray();
....
        sqlhelp.CommandText = "Update Tabela SET Foto = '" + zdj + "' WHERE ID= " + id;
        sqlhelp.Connection = conn;
        conn.Open();
        sqlhelp.ExecuteNonQuery();

wydaje sie poprawnie zapisane, ale nie potrafie odczytac tych danych ponownie. Probuję tak:

......
 sqlhelp.CommandText = "SELECT Foto FROM Tabela WHERE ID = " + id;
        sqlhelp.Connection = conn;
        conn.Open();

        bufor = (byte[])sqlhelp.ExecuteScalar();
.....
        System.IO.MemoryStream ms = new System.IO.MemoryStream(bufor);
        pictureBox2.Image = Image.FromStream(ms);

jak pisałem, nie znam za dobrze c#, a wiedza z delphi nie pomogła:)) wujek google pisze i to w wielu miejscach, że to na górze powinno działać, ale...
Błąd jest w zapisie, czy w odczycie? Nie mam pojęcia. A może i tu i tu, hihi.

Pytanie jest proste: potrzebuję zdjęcie z bazy danych MSSQL znowu wyświetlić. Jak to sie robi w c#? :)
Proszę o pomoc.

0

Sprawdziłem, że niezaleznie ile wysyłam bajtów do bazy, po odczycie tablica ma tylko 13 bajtów. Typ przechowywanych danych na serwerze mssql to image.
Ma ktoś jakiegos pomysła?:)

1

Błąd jest w zapisie. Konkatenacja stringów działa w taki sposób, że jeżeli spróbujesz dodać coś, co nie jest napisem, zostanie wywołana metoda ToString(). Założyłeś, że dla typu byte[] zwróci ci ona ciąg zgodny w zapisie z SQL Server (czyli 0xCiągBajtówSzesnastkowo). W rzeczywistości byte[] nie ma przeciążonego ToString(), więc domyślnie zwróci ci nazwę typu, czyli System.Byte[], czyli twoje owe 13 bajtów.

Do wrzucenia zdjęcia do bazy danych użyj OPENROWSET i ścieżki do pliku bądź bezpośrednio poprzez ciąg bajtów:

using(SqlCommand command = new SqlCommand(
    "INSERT INTO Images (Image) VALUES (@imageData)",
    connection))
{
    command.Parameters.Add("@imageData", SqlDbType.Image).Value = fileContent;
    command.ExecuteNonQuery();
}

Jeszcze jedna uwaga, z MSDN: ntext, text, and image data types will be removed in a future version of Microsoft SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.

Jeszcze lepiej, w bazie danych przechowuj tylko nazwę pliku albo ścieżkę, a pliki przechowuj na dysku. Statyczny content zawsze będzie lepiej wysłać bezpośrednio zamiast pobierać go jeszcze z bazy danych.

0

Serdeczne dzieki za odpowiedź.
W sumie właśnie do tego doszedłem dalej zrezygnowany odpytując wujka googla, a wcześniej zczytując kwerende sql która mi generował. Ten "System.Byte[]" zamiast danych właśnie mnie naprowadził
Takie coś skleciłem

 SqlCommand sqlhelp = new SqlCommand();
        sqlhelp.CommandText = "Update Tabela SET Foto = (@zdj_data) WHERE ID = " + id;
        sqlhelp.Connection = conn;
        conn.Open();
        SqlParameter param1 = new SqlParameter("@zdj_data", SqlDbType.Image);
        param1.Value = zdj;
        sqlhelp.Parameters.Add(param1);
        sqlhelp.ExecuteNonQuery();

i chciałem napisac dla inych:)
Ale się spóźniłem:)

0

Polecam ubrać SqlCommand w using. SqlConnection również, jeżeli korzystasz z niego tylko tutaj.

A tak w ogóle to dlaczego nie zdecydowałeś się na jakiś silnie wiązany model?

0

Jest w using(), tylko tak teraz wklepałem.
A co do silnie związanego modelu, to jak wspomniałem c# nie bardzo znam, ale mamy na niego przejść z Dephi, więc trzeba poznać.
Do wstępnych prób skleiłem szybko bazę testową w ms sql i podpiąłem do dataset w projekcie. Fajnie się pracowało, bo i szybciej (VS dopisuje wtedy nazwy tabel, itd. sam zresztą wiesz pewnie lepiej), ale... zauważyłem, że w managment studio nie mogę z ta bazą pracować, tak jakby podczas kopiowania plików mdf i ldf do folderów projektu VS wywalił albo zablokował edycje bazy w oryginalnym miejsu. Znaczy te pliki bazatestowa.ldf i mf były na serwerze, ale baza nie działała.
Nie miałem czasu tego zbadac ani doczytać, czy ja coś dałem d.. czy tak jest.
Jeśli tak jest, to jak jest potem kiedy docelowa aplikacja będzi chodzić w sieci klienta? Nie znam jeszcz tego zagadnienia, więc przerzucłiem się na słabe wiązanie.
Jeśli możesz mnie oświeicć jak to funkcjonuje to chętnie sie dowiem. Jeśli temat zbyt rozległy, no cóż. Trzeba będzie szukać:))
Pzdro

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