Błąd w składni zapytania sql datareader

0

Cześć wszystkim!
Mam problem z zdefiniowaniem błędu. Program nie chce się uruchomić. Byłbym wdzięczny za pomoc.
Pragnę wyciągnąć z bd 2 wartości (Imie_wnioskodawcy i Nazwisko_wnioskodawcy) na podstawie zapytania, którego zawężeniem jest zawartość textboxa TBPESELDoWyswietlenia aby później wczytać te 2 wartości do textboxow (TBImie i TBNazwisko). Podczas kliknięcia buttonu uruchamiającego procedurę wyświetla się komunikat „Nie istnieją dane dla wiersza/kolumny." wskazując na linijkę:

TBImie.Text = myreader["Imie_wnioskodawcy"].ToString();

Komunikat sugeruje mi, że tabela nie zawiera podanych informacji... a jednak zawiera.

string strConnString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Projekty\Baza_danych_projektow.accdb";

            string strQuery = "select Imie_wnioskodawcy, Nazwisko_wnioskodawcy from tabela_wnioskodawcy where" + " PESEL = @PESEL";

            OleDbConnection con = new OleDbConnection(strConnString);
            OleDbCommand cmd = new OleDbCommand();

            cmd.Parameters.AddWithValue("@PESEL", TBPESELDoWyswietlenia.Text);
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = strQuery;
            cmd.Connection = con;
            OleDbDataReader myreader;


                try
                {
                    con.Open();
                    myreader = cmd.ExecuteReader();
                    myreader.Read();

                    TBImie.Text = myreader["Imie_wnioskodawcy"].ToString();
                    TBNazwisko.Text = myreader["Nazwisko_wnioskodawcy"].ToString();

                    myreader.Close();
                }
                finally
                {
                    con.Close();
                }

W czym jest problem?

2

W czym jest problem?

Problem jest 50 cm przed monitorem.
Nadal heliologia motykowa?

Na marginesie, skąd skopiowałeś takie dziwne sklejanie kwerendy?

Komunikat jest jasny - nie ma takich danych. Kwerenda znajduje zero wierszy.
Nie jest to komunikat o błędach składniowych.

0

Tak jak napisał @ZrobieDobrze, nie masz żadnych wierszy, które spełniają warunek. Kod jest w opłakanym stanie i widać, że to kopiuj/wklej z różnych źródeł i uważam, że w tej kwestii też @ZrobieDobrze ma racje.

Jaki to ma sens?

string strQuery = "select Imie_wnioskodawcy, Nazwisko_wnioskodawcy from tabela_wnioskodawcy where" + " PESEL = @PESEL";

Zmień na

string strQuery = "select Imie_wnioskodawcy, Nazwisko_wnioskodawcy from tabela_wnioskodawcy where PESEL = @PESEL";

Możesz sprawdzić czy masz jakieś wyniki

if(myreader.Read())
{
  TBImie.Text = myreader["Imie_wnioskodawcy"].ToString();
  TBNazwisko.Text = myreader["Nazwisko_wnioskodawcy"].ToString();
}

Dodatkowo upewniłbym się czy TBPESELDoWyswietlenia.Text ma w ogóle jakąś wartość.

0

...to dlaczego "tu" mi działa? :D

String strConnString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Projekty\projekty.accdb";
                string strQuery = "select * from projects where Identyfikator = @Identyfikator";
                OleDbConnection con = new OleDbConnection(strConnString);
                OleDbCommand cmd = new OleDbCommand();
                cmd.Parameters.AddWithValue("@Identyfikator", DropDownList4.SelectedItem.Value);
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = strQuery;
                cmd.Connection = con;
                OleDbDataReader myreader;
                try
                {
                    con.Open();
                    myreader = cmd.ExecuteReader();
                    myreader.Read();

                    TextBox12.Text = myreader["Nazwa_projektu"].ToString();
                    TextBox2.Text = myreader["Wlasciciel"].ToString();
                    TextBox4.Text = myreader["Cel_projektu"].ToString();
                    TextBox3.Text = myreader["Data_rozpoczecia"].ToString();
                    TextBox6.Text = myreader["Data_zakonczenia"].ToString();
                    DropDownList1.Text = myreader["Project_manager"].ToString();
                    DropDownList2.Text = myreader["Team_manager"].ToString();
                    DropDownList3.Text = myreader["Executive"].ToString();

                    myreader.Close();
                }
                finally
                {
                    con.Close();
                }
0

A czy nie ma tu znaczenie to, że textbox nie ma parametru wartość (value), a jedynie zawartość/tekst (text)? I może - nie można użyć:

cmd.Parameters.AddWithValue("@PESEL", TBPESELDoWyswietlenia.Text);

tak jak w przypadku:

cmd.Parameters.AddWithValue("@Identyfikator", DropDownList4.SelectedItem.Value);

0

Moim zdaniem typ danych też ma znaczenie podczas podawania parametru. Nie jestem pewny, bo nie używam readerów, ale czy przypadkiem metoda AddWithValue nie sprawdza typu podanej wartości? Jeśli u ciebie PESEL jest liczbą, a ty mu wrzucasz TBPESELDoWyswietlenia.Text gdzie typeof == string 🤔

Prawdopodobnie DropDownList4.SelectedItem.Value jest typu int więc działa ci do Idenyfikatora

1

Entity Framework, pisanie zapytań do bazy w stringach to nieporozumienie (i nie chodzi tutaj o cześć garderoby).

0

Problem rozwiązałem dzięki:

        cmd.Parameters.Add("@PESEL", OleDbType.VarChar).Value = TBPESELDoWyswietlenia.Text;

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