Pomoc potrzebna ODBC+GridView+PictureBox

0

Witam.
Jestem nowy na forum, z racji, że potrzebuję pomocy. Z C# najmocniejszy nie jestem ale jakieś tam podstawy mam.
Teraz do rzeczy. Tworzę aplikację do obsługi lokalnej bazy danych ODBC. Z bazą się łączę i wyświetlam ją sobie w dataGridView. Potrzebuję teraz zrobić tak, aby jak zaznaczę jakieś pole w dataGridView, pobiera grafikę jak jest zapisana w bazie (pole typu: image) i wyświetla mi je w PictureBox'ie.
Baza została stworzona w Sybase Central 16.0, dodana w "Administratorze źródła danych ODBC" Windows'a 7, w Visual Studio 2013 została dodana do dataGridView i wyświetliły się właściwe kolumny.
Mam taki kod, który nie działa, kompiluje się ale po kliknięciu na pole wyskakuje błąd:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.dll
Additional information: Nie istnieją dane dla wiersza/kolumny.

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            string connStr = "Dsn=szkola;uid=dba;pwd=sql";
            OdbcConnection polaczenie = new OdbcConnection(connStr);
            polaczenie.Open();
            int a = dataGridView1.CurrentCell.RowIndex+1;
            string querry = "Select Image as img FROM films WHERE ID="+a;
            OdbcCommand cmd = new OdbcCommand(querry, polaczenie);
            OdbcDataReader czytacz;
            czytacz = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            label1.Text = a.ToString();
            byte[] imgg=(byte[])(czytacz["img"]);
            if (imgg==null){
                pictureBox1=null;
            }else{
                MemoryStream mstream = new MemoryStream(imgg);
                pictureBox1.Image=System.Drawing.Image.FromStream(mstream);
            };
            
        } 
0

Jedno pytanie jesteś pewien że Twoje "ID = CurrentCell.RowIndex + 1" jakoś mało prawdopodobne mi sie to wydaje. Do tego nie widzę żebyś zamykał otwarte połączenie to też może być przyczyną tego błędu (tak coś mi się kojarzy).

0

Ustaw breakpoint'a i sprawdź w którym miejscu sie wywala.

0

@DibbyDum
dodałem po

else{...};
polaczenie.close();

ale nie pomogło.

...RowIndex+1

jest dlatego, że w bazie danych mam numerację ID od 1, a jak jest bez "+1" to tu label1.Text = a.ToString();

 wyświetla mi 0 dla pierwszego (zerowego) rekordu, gdzie nie ma takiego ID więc na bank by się wysypywało.

@_matej
problem zaczyna się w linii
```csharp
byte[] imgg=(byte[])(czytacz["img"]);...

, przynajmniej w tym momencie wyskakuje tamten błąd. Możliwe, że queery jest coś źle lub całkiem gdzie indziej.

0

dobra poradziłem sobie tym kodem

string connStr = "Dsn=szkola;uid=dba;pwd=sql";
                string qImage = "SELECT Image FROM films WHERE ID=" + a;
                OdbcConnection polaczenie = new OdbcConnection(connStr);
                OdbcCommand cmd = new OdbcCommand(qImage, polaczenie);
                OdbcDataReader czytacz = null;
                polaczenie.Open();
                czytacz = cmd.ExecuteReader();
                czytacz.Read();
                byte[] imgg = (byte[])(czytacz["Image"]);
                if (imgg == null)
                {
                    picB_image.ImageLocation = null;
                }
                else
                {
                    MemoryStream mstream = new MemoryStream(imgg);
                    picB_image.Image = System.Drawing.Image.FromStream(mstream);
                };
                polaczenie.Close();

Tylko teraz co zrobić jak w bazie nie ma obrazka czyli wchodzimy do imgg==null i w tym momencie mi takie oto okienko:
http://postimg.org/image/uiuhrvgp7/
najlepiej jak by zamiast =null była ścieżka do grafiki. Jak mam takie coś

picB_image.ImageLocation = @"Images\noimage.png";

to ten sam błąd wyskakuje

1

Kombinuj ze ścieżką bo masz zapewne źle ustawioną jak nie masz gdzieś głębiej folderu Images to ta ścieżka powinna zadziałać: @"....\Images\noimage.png";
Ale nie w tym tkwi problem twój if nigdy nie bedzie true ponieważ null != DBNull wiec nigdy Ci nie wchodzi w pierwszą sekcje. Więc nawet na dobrą sprawe nie wiesz czy Ci się ścieżka zgadza. :P Więc popraw if i wtedy sprawdź ściezkę do obrazka.

Np.

if(czytacz.IsDBNull(czytacz.GetOrdinal("Image"))

I jeszcze jedno

byte[] imgg = (byte[])(czytacz["Image"]);

przenieś do elsa i wtedy powinno śmigać.

to tyle błędów przyuważyłem na chwile obecną. :)

0

dzięki za pomoc działa tak jak chcę, a oto kod:

string connStr = "Dsn=szkola;uid=dba;pwd=sql";
                string qImage = "SELECT Image FROM films WHERE ID=" + a;
                OdbcConnection polaczenie = new OdbcConnection(connStr);
                OdbcCommand cmd = new OdbcCommand(qImage, polaczenie);
                OdbcDataReader czytacz = null;
                polaczenie.Open();
                czytacz = cmd.ExecuteReader();
                czytacz.Read();
                if (czytacz.IsDBNull(czytacz.GetOrdinal("Image")))
                {
                    picB_image.ImageLocation = @"Images\noimage.png";
                }
                else
                {
                    byte[] imgg = (byte[])(czytacz["Image"]);
                    MemoryStream mstream = new MemoryStream(imgg);
                    picB_image.Image = System.Drawing.Image.FromStream(mstream);
                };
                polaczenie.Close();

Oczywiście kliknięte "Odpowiedź satysfakcjonująca" i "Post wartościowy"

Pozdrawiam i dziękuję za pomoc
damian302

P.S. Temat do zamknięcia

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