Pobieranie danych z MySQL poprzez parametry

0

Witam wszystkich,

Mam pewien problem z pobraniem danych poprzez parametry poprzez kontroler ODBC.
Standardowe zapytanie wygląda tak:

OdbcCommand command;
queryString = "SELECT * FROM players WHERE id=?;";
command = new OdbcCommand(queryString, connection);
command.Parameters.Add("@id", OdbcType.Int).Value = (int)(Session["userid"]);

... i wszystko działa prawidłowo. Problem zaczyna się, gdy chcę ułożyć zapytanie w stylu:

OdbcCommand command;
DateTime teraz = DateTime.Now;
queryString = "INSERT INTO norma (id_player, rok, miesiac, min_gier) SELECT * FROM (SELECT ?, " + teraz.Year + ", " + teraz.Month + ", ?) as tmp WHERE NOT EXISTS (SELECT id_norma FROM norma WHERE id_player=? AND rok=" + teraz.Year + " AND miesiac=" + teraz.Month + ") LIMIT 1;";
command = new OdbcCommand(queryString, connection);
command.Parameters.Add("@id_p", OdbcType.Int).Value = (int)(Session["userid"]);
command.Parameters.Add("@liczba_g", OdbcType.Int).Value = (int)(Session["liczba_g"]);
command.Parameters.Add("@id_p2", OdbcType.Int).Value = (int)(Session["userid"]);

Dostaję wówczas wyjątek: System.Data.Odbc.OdbcException: ERROR [HY000] [MySQL][ODBC 5.3(w) Driver][mysqld-5.7.11-log]Column count doesn't match value count at row 1
Jak tylko wyrzucę parametry i wpiszę dane bezpośrednio do zapytania, to wszystko działa.
Czy moglibyście mi pomóc i powiedzieć, gdzie mam błąd i jak to powinno wyglądać?

Dziękuję i pozdrawiam,
Tomek

0

Błąd ten zwykle występuje, gdy wkładasz do tabeli wartości kilku pól, choć tabela ta zawiera inną liczbę atrybutów. Ten

SELECT * FROM (SELECT ?...

wywala zapewne więcej kolumn niż 4, które chcesz wsadzić do tabeli norma.

0

Dzięki za odpowiedź.
Problem polega na tym, że jak zamiast ? wstawię np Session["userid"].ToString(), to wszystko działa, czyli chyba nie ma problemu w konstrukcji zapytania, a w sposobie przekazania parametrów. Zauważyłem, że ostatni znak zapytania jest przekazany prawidłowo, gdyż jak skomentowałem pierwsze 2 parametry, to wszystko działało. Wygląda na to, że jeśli jest jasno określony typ zmiennej ODBC to wszystko działa. W przypadku ostatniego znaku zapytania wiadomo, że potrzebny jest Int. A jak jest w przypadku pierwszych dwóch parametrów? Bo może to nie jest Int tylko coś innego.

1

Afair nie możesz wykorzystać parametrów do pobierania kolumn, zatem: SELECT id, ? FROM cośtam jest błędnym zapytaniem.

0

Nie rozumiem, parametry kleisz stringiem, a treść zapytania chcesz zbudować parametrami?
Pokaż prawidłowy SQL zapytania, które chcesz zbudować.

0

@Patryk27 takiej informacji potrzebowałem. Dzięki.
@somekind np. INSERT INTO norma (id_player, rok, miesiac, min_gier) SELECT * FROM (SELECT 1, " + teraz.Year + ", " + teraz.Month + ", 50) as tmp WHERE NOT EXISTS (SELECT id_norma FROM norma WHERE id_player=1 AND rok=" + teraz.Year + " AND miesiac=" + teraz.Month + ") LIMIT 1;
Chodzi o wpisanie danych do tabeli norma w danym miesiącu, gdy jeszcze taki wiersz w tym miesiącu jest nie wpisany.

PS. Teraz jak tak patrzę na to po dniu, to zastanawiam się po co wpisuję teraz.Year i teraz.Month, jak mogę to zrobić z poziomu MySQL...

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