Jaka jest różnica między ExecuteScalar, ExecuteReader i ExecuteNonQuery?


Odpowiedzi:


191
  • ExecuteScalarjest zwykle używany, gdy zapytanie zwraca pojedynczą wartość. Jeśli zwróci więcej, wynikiem jest pierwsza kolumna pierwszego wiersza. Przykładem może być SELECT @@IDENTITY AS 'Identity'.
  • ExecuteReaderjest używany dla dowolnego zestawu wyników z wieloma wierszami / kolumnami (np SELECT col1, col2 from sometable.).
  • ExecuteNonQuery jest zwykle używany do instrukcji SQL bez wyników (np. UPDATE, INSERT itp.).

40
ExecuteNonQuerymoże zwrócić liczbę obsługiwanych wierszy.
Sangram Nandkhile

Pomyślałem, że ExecuteNonQuery jest używany, gdy trzeba wywołać procedury składowane, które zwrócą kolekcję tabel.
Gogutz,

Funkcja ExecuteNonQuery działa również, jeśli w procedurze składowanej znajduje się instrukcja return. stackoverflow.com/questions/6210027/…
FrenkyB

40

ExecuteNonQuery ():

  1. będzie działać tylko z Zapytaniami funkcjonalnymi (Utwórz, Zmień, Upuść, Wstaw, Aktualizuj, Usuń).
  2. Zwraca liczbę wierszy wykonanych przez zapytanie.
  3. Typ zwrotu to int
  4. Wartość zwracana jest opcjonalna i można ją przypisać do zmiennej całkowitej.

ExecuteReader ():

  1. będzie działać z zapytaniami działającymi i niezwiązanymi z działaniem (wybierz)
  2. Zwraca kolekcję wierszy wybranych przez zapytanie.
  3. Typ zwrotu to DataReader.
  4. Wartość zwracana jest obowiązkowa i powinna zostać przypisana do innego obiektu DataReader.

ExecuteScalar ():

  1. będzie działać z zapytaniami niezwiązanymi z działaniami, które zawierają funkcje agregujące.
  2. Zwróć wartość pierwszego wiersza i pierwszej kolumny wyniku zapytania.
  3. Typ zwracany to obiekt.
  4. Wartość zwracana jest obowiązkowa i powinna być przypisana do zmiennej wymaganego typu.

Referencyjny adres URL:

http://nareshkamuni.blogspot.in/2012/05/what-is-difference-between.html


38

Każdy z nich jest wykonaniem innego typu.

  • ExecuteScalar będzie typem zapytania, które będzie zwracać pojedynczą wartość.

    Przykładem może być zwrócenie wygenerowanego identyfikatora po wstawieniu.

    INSERT INTO my_profile (Address) VALUES ('123 Fake St.'); SELECT CAST(scope_identity() AS int)

  • ExecuteReader udostępnia czytnik danych, który umożliwia odczytanie wszystkich kolumn wyników w jednym wierszu.

    Przykładem może być pobranie informacji o profilu jednego lub większej liczby użytkowników.

    SELECT * FROM my_profile WHERE id = '123456'

  • ExecuteNonQuery to dowolny kod SQL, który nie zwraca wartości, ale w rzeczywistości wykonuje jakąś formę pracy, taką jak wstawianie, usuwanie lub modyfikowanie czegoś.

    Przykładem może być aktualizacja profilu użytkownika w bazie danych.

    UPDATE my_profile SET Address = '123 Fake St.' WHERE id = '123456'


1
Wygląda na to, że możesz używać ExecuteReader do wykonywania zadań wykonywanych zarówno przez ExecuteScalar, jak i ExecuteNonQuery, więc po co używać pozostałych dwóch? jakieś korzyści związane z wydajnością?
user20358

Jednym z powodów, dla których należy unikać nadużywania ExecuteReader, jest to, że będzie on trzymał tego czytnika w pobliżu, dopóki nie skończysz z tym. Przy tym wszystkim chcesz poznać konkretne informacje na temat ich działania, aby jak najefektywniej je wykorzystać. Przedstawiłem tutaj kilka dobrych wskazówek.
Brendan Enrick

9

Z dokumentacji (uwaga: MSDN to przydatny zasób, jeśli chcesz wiedzieć, co się dzieje!):

ExecuteScalar

Użyj metody ExecuteScalar, aby pobrać pojedynczą wartość (na przykład wartość zagregowaną) z bazy danych. Wymaga to mniej kodu niż użycie metody ExecuteReader, a następnie wykonanie operacji potrzebnych do wygenerowania pojedynczej wartości przy użyciu danych zwróconych przez SqlDataReader.

ExecuteReader

Wysyła CommandText do Connection i kompiluje SqlDataReader.

... i z SqlDataReader ...

Zapewnia sposób odczytu strumienia wierszy tylko do przodu z bazy danych SQL Server. Ta klasa nie może być dziedziczona.

ExecuteNonQuery

Funkcji ExecuteNonQuery można używać do wykonywania operacji katalogu (na przykład wykonywania zapytań dotyczących struktury bazy danych lub tworzenia obiektów bazy danych, takich jak tabele) lub do zmiany danych w bazie danych bez użycia DataSet przez wykonanie instrukcji UPDATE, INSERT lub DELETE.


8

Aby dodać do tego, co opublikowali inni:

Funkcja ExecuteScalar koncepcyjnie zwraca skrajną lewą kolumnę z pierwszego wiersza zestawu wyników zapytania; można wykonać ExecuteScalar a SELECT * FROM staff, ale otrzyma się tylko pierwszą komórkę z wynikowych wierszy. Zwykle używane w przypadku zapytań zwracających pojedynczą wartość. Nie jestem w 100% pewien co do SQLServer, ale w Oracle nie użyłbyś go do uruchomienia FUNKCJI (kodu bazy danych, który zwraca pojedynczą wartość) i oczekujesz, że zwróci ci wartość zwracaną przez funkcję, nawet jeśli funkcje zwracają pojedyncze wartości. .Jeżeli jednak uruchamiasz funkcję jako część zapytania, np. SELECT SUBSTR ('abc', 1, 1) FROM DUAL, to zwróci ona wartość zwracaną ze względu na fakt, że wartość zwracana jest przechowywana w lewym górnym rogu komórka wynikowego zestawu wierszy

Metoda ExecuteNonQuery byłaby używana do uruchamiania procedur składowanych w bazie danych, funkcji i zapytań, które modyfikują dane (INSERT / UPDATE / DELETE) lub modyfikują strukturę bazy danych (CREATE TABLE ...). Zwykle wartość zwracana wywołania jest wskazaniem, na ile wierszy wpłynęła operacja, ale sprawdź dokumentację bazy danych, aby to zagwarantować


4

ExecuteReader() wykonuje zapytanie SQL, które zwraca obiekt DBDataReader dostawcy danych, który zapewnia dostęp tylko do przodu i tylko do odczytu dla wyniku zapytania.

ExecuteScalar()jest podobna do ExecuteReader()metody przeznaczonej do zapytań pojedynczych, takich jak uzyskiwanie liczby rekordów.

ExecuteNonQuery() nie wykonuj zapytania, które działa z tworzeniem, usuwaniem, aktualizacją, wstawianiem)


3

ExecuteNonQuery

Ta metoda ExecuteNonQuery będzie używana tylko do instrukcji wstawiania, aktualizowania i usuwania, tworzenia i ustawiania. Metoda ExecuteNonQuery zwróci liczbę wierszy wykonanych operacjami INSERT, DELETE lub UPDATE.

ExecuteScalar

Pobieranie pojedynczych wartości z bazy danych jest bardzo szybkie. Funkcja Execute Scalar zwróci wartość pojedynczej kolumny w jednym wierszu, tj. Pojedynczą wartość, po wykonaniu zapytania SQL lub procedury składowanej przy użyciu obiektu polecenia. ExecuteReader

Execute Reader zostanie użyty do zwrócenia zestawu wierszy podczas wykonywania zapytania SQL lub procedury składowanej przy użyciu obiektu polecenia. Ten służy do pobierania rekordów tylko do przodu i służy do odczytywania wartości tabeli od pierwszej do ostatniej.


3

Metoda ExecuteNonQuery zwróci liczbę wierszy wykonanych operacjami INSERT, DELETE lub UPDATE. Ta metoda ExecuteNonQuery będzie używana tylko do instrukcji wstawiania, aktualizowania i usuwania, tworzenia i ustawiania. (Czytaj więcej)

Funkcja ExecuteScalar zwróci wartość pojedynczej kolumny w jednym wierszu, tj. Pojedynczą wartość, po wykonaniu zapytania SQL lub procedury składowanej przy użyciu obiektu polecenia. Pobieranie pojedynczych wartości z bazy danych jest bardzo szybkie. (Czytaj więcej)

ExecuteReader zostanie użyty do zwrócenia zestawu wierszy podczas wykonywania zapytania SQL lub procedury składowanej przy użyciu obiektu polecenia. Ten służy do pobierania rekordów tylko do przodu i służy do odczytywania wartości tabeli od pierwszej do ostatniej. (Czytaj więcej)


1

ExecuteNonQuery: jest zwykle używany, gdy instrukcje Sql nie zwracają żadnych informacji, takich jak operacje wstawiania, aktualizowania, usuwania.

cmd.ExcecuteNonQuery();

ExecuteScalar:

Będzie używany, gdy zapytanie Sql zwróci pojedynczą wartość.

Int b = cmd.ExcecuteScalar();

ExecuteReader

Będzie używany, gdy kwerenda SQL lub procedura składowana zwróci wiele wierszy / kolumn

SqlDataReader dr = cmd.ExecuteReader();

aby uzyskać więcej informacji, kliknij tutaj http://www.dotnetqueries.com/Article/148/-difference-between-executescalar-executereader-executenonquery

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.