C# limit wyników w SQL


(Dkqmail) #1

Witam

Programuję w Visual Studio 2005 aplikację wykorzystującą bazę danych i mam pytanie?

Jak zbudować zapytanie SQL, aby zostało zwróconych 10 wyników w zakresach np. 1 - 10, 11 - 20 itp.

SELECT * FROM Test LIMIT 1,10

Próbując wykonać w/w zapytanie otrzymuję błąd.

SqlConnection connection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Database.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");


connection.Open();


SqlCommand command = new SqlCommand("SELECT * FROM Test LIMIT 1,10", connection);

SqlDataReader reader = command.ExecuteReader();


connection.Close();

Fragment kodu do połączenia z bazą danych.

Proszę o pomoc w rozwiązaniu problemu.


(kowal.luk) #2

nie wiem w czym jest problem, zapytanie jest dobre, może lepiej

SELECT * FROM Test LIMIT 0,10

zapytanie to zwróci 10 pierwszych rekordów, teraz trzeba je przeszukać readerem

reader.Read();

to będzie odczyt 1 rekordu, teraz pętelka i wyciągasz to co chcesz. przykładowo może to wyglądać tak:

reader.Read();

            if (reader.HasRows)

            {

                List lista = new List();

                while (reader.Read())

                    lista.Add(reader["tutaj_nazwa_kolumny_ktora_chcesz_pobrac"].ToString());

            }

            reader.Close();

(Somekindsoftware) #3

No właśnie problem jest w tym, że zapytanie jest złe, bo w MSSQL nie ma czegoś takiego jak LIMIT.


(Marcin Gl Pl) #4

Jest coś takiego SELECT TOP(10) * FROM Tabela

ale nie można wybrać coś w postaci 10 elementów, zaczynając od 20.


(kowal.luk) #5

ok, faktycznie nie ma, ale nie było precyzji na MSSQL, sam się nie domyśle, to że visual studio i c# to nie oznacza mssql

z tego co pamiętam to jest coś takiego

SELECT * FROM tabela WHERE nazwa_kolumny BETWEEN 20 AND 30

(Grzelix) #6

@kowal.luk Between sprawdza wartości natomiast limit z mysql poprostu pobiera określoną liczbę rekordów.

trochę skomplikowane zapytanie ale działa, jak będe miał chwilę to sprawdzę może coś mniej skomplikowanego napiszę.

SELECT TOP 10 * FROM 

(SELECT TOP 60 * 

FROM tabela

ORDER BY column DESC) A 

ORDER BY column ASC

(Somekindsoftware) #7

Nie trzeba się domyślać, wystarczy przeczytać kod z pierwszego postu:

SqlConnection connection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Database.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");

Od razu widać, że to połączenie do MSSQL Express Edition. dkqmail , spróbuj tak:

select * from (select row_number() over (order by Id) as rownum, * from Test

) as O where O.rownum between (1) and (10)

(Dkqmail) #8

Problem rozwiązało zapytanie:

SELECT TOP 20 * FROM Test WHERE id not in (SELECT TOP 10 id FROM Test ORDER BY id) ORDER BY id

Dziękuję za pomoc.