Qual é a diferença entre ExecuteScalar, ExecuteReader e ExecuteNonQuery?


Respostas:


190
  • ExecuteScalarnormalmente é usado quando sua consulta retorna um único valor. Se retornar mais, o resultado será a primeira coluna da primeira linha. Um exemplo pode ser SELECT @@IDENTITY AS 'Identity'.
  • ExecuteReaderé usado para qualquer conjunto de resultados com várias linhas / colunas (por exemplo, SELECT col1, col2 from sometable).
  • ExecuteNonQuery é normalmente usado para instruções SQL sem resultados (por exemplo, UPDATE, INSERT, etc.).

39
ExecuteNonQuerypode retornar o número de linhas afetadas.
Sangram Nandkhile

Achei que ExecuteNonQuery é usado quando você precisa chamar procedimentos armazenados que retornarão uma coleção de tabelas.
Gogutz

ExecuteNonQuery também funciona se você tiver a instrução de retorno no procedimento armazenado. stackoverflow.com/questions/6210027/…
FrenkyB

40

ExecuteNonQuery ():

  1. funcionará apenas com consultas de ação (criar, alterar, eliminar, inserir, atualizar, excluir).
  2. Retorna a contagem de linhas efetuadas pela Consulta.
  3. O tipo de retorno é int
  4. O valor de retorno é opcional e pode ser atribuído a uma variável inteira.

ExecuteReader ():

  1. funcionará com consultas de ação e sem ação (selecionar)
  2. Retorna a coleção de linhas selecionadas pela Consulta.
  3. O tipo de retorno é DataReader.
  4. O valor de retorno é obrigatório e deve ser atribuído a outro objeto DataReader.

ExecuteScalar ():

  1. funcionará com consultas sem ação que contêm funções de agregação.
  2. Retorna o valor da primeira linha e da primeira coluna do resultado da consulta.
  3. O tipo de retorno é objeto.
  4. O valor de retorno é obrigatório e deve ser atribuído a uma variável do tipo obrigatório.

URL de referência:

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


38

Cada um é um tipo de execução diferente.

  • ExecuteScalar será o tipo de consulta que retornará um único valor.

    Um exemplo seria retornar um id gerado após a inserção.

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

  • ExecuteReader fornece um leitor de dados que permitirá que você leia todas as colunas dos resultados, uma linha por vez.

    Um exemplo seria puxar informações de perfil para um ou mais usuários.

    SELECT * FROM my_profile WHERE id = '123456'

  • ExecuteNonQuery é qualquer SQL que não está retornando valores, mas na verdade está executando alguma forma de trabalho, como inserir, excluir ou modificar algo.

    Um exemplo seria atualizar o perfil de um usuário no banco de dados.

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


1
Parece que você pode usar ExecuteReader para fazer as tarefas executadas por ExecuteScalar e ExecuteNonQuery, então por que usar os outros dois? algum benefício de desempenho?
user20358

Um motivo para evitar o uso excessivo de ExecuteReader é que ele manterá esse leitor por perto até que você termine com ele. Com tudo isso, você deseja saber algumas informações específicas sobre como eles funcionam para usá-los com mais eficácia. O que descrevi aqui são algumas boas diretrizes.
Brendan Enrick de

9

Dos documentos (nota: MSDN é um recurso útil quando você quer saber o que as coisas fazem!):

ExecuteScalar

Use o método ExecuteScalar para recuperar um único valor (por exemplo, um valor agregado) de um banco de dados. Isso requer menos código do que usar o método ExecuteReader e, em seguida, executar as operações necessárias para gerar o valor único usando os dados retornados por um SqlDataReader.

ExecuteReader

Envia o CommandText para a conexão e cria um SqlDataReader.

... e de SqlDataReader ...

Fornece uma maneira de ler um fluxo somente de encaminhamento de linhas de um banco de dados SQL Server. Essa classe não pode ser herdada.

ExecuteNonQuery

Você pode usar o ExecuteNonQuery para executar operações de catálogo (por exemplo, consultar a estrutura de um banco de dados ou criar objetos de banco de dados, como tabelas) ou para alterar os dados em um banco de dados sem usar um DataSet executando instruções UPDATE, INSERT ou DELETE.


8

Para adicionar ao que outras pessoas postaram:

ExecuteScalar conceitualmente retorna a coluna mais à esquerda da primeira linha do conjunto de resultados da consulta; você poderia ExecutarScalar uma equipe SELECT * FROM, mas obteria apenas a primeira célula das linhas resultantes Normalmente usado para consultas que retornam um único valor. Não tenho 100% de certeza sobre o SQLServer, mas no Oracle, você não o usaria para executar uma FUNCTION (um código de banco de dados que retorna um único valor) e espera que ele forneça o valor de retorno da função, embora as funções retornem valores únicos. . No entanto, se você estiver executando a função como parte de uma consulta, por exemplo, SELECT SUBSTR ('abc', 1, 1) FROM DUAL, então ele forneceria o valor de retorno em virtude do fato de que o valor de retorno é armazenado no canto superior esquerdo célula do conjunto de linhas resultante

ExecuteNonQuery seria usado para executar procedimentos armazenados de banco de dados, funções e consultas que modificam dados (INSERT / UPDATE / DELETE) ou modificam a estrutura do banco de dados (CREATE TABLE ...). Normalmente, o valor de retorno da chamada é uma indicação de quantas linhas foram afetadas pela operação, mas verifique a documentação do banco de dados para garantir isso


4

ExecuteReader() executa uma consulta SQL que retorna o objeto DBDataReader do provedor de dados que fornece acesso somente de encaminhamento e somente leitura para o resultado da consulta.

ExecuteScalar()é semelhante ao ExecuteReader()método projetado para consulta de singleton, como obter uma contagem de registros.

ExecuteNonQuery() executar não consulta que funciona com criar, excluir, atualizar, inserir)


3

ExecuteNonQuery

Este método ExecuteNonQuery será usado apenas para inserir, atualizar e excluir, criar e instruções SET. O método ExecuteNonQuery retornará o número de linhas efetuadas com as operações INSERT, DELETE ou UPDATE.

ExecuteScalar

É muito rápido recuperar valores únicos do banco de dados. Execute Scalar retornará um valor de coluna única de linha única, ou seja, valor único, na execução de Consulta SQL ou procedimento armazenado usando o objeto de comando. ExecuteReader

Execute Reader será usado para retornar o conjunto de linhas, na execução da Consulta SQL ou procedimento armazenado usando o objeto de comando. Este é apenas para a recuperação direta de registros e é usado para ler os valores da tabela do primeiro ao último.


3

O método ExecuteNonQuery retornará o número de linhas efetuadas com as operações INSERT, DELETE ou UPDATE. Este método ExecuteNonQuery será usado apenas para inserir, atualizar e excluir, criar e instruções SET. (Consulte Mais informação)

ExecuteScalar retornará um valor de coluna única linha única, ou seja, valor único, na execução de Consulta SQL ou procedimento armazenado usando o objeto de comando. É muito rápido recuperar valores únicos do banco de dados. (Consulte Mais informação)

ExecuteReader será usado para retornar o conjunto de linhas, na execução da Consulta SQL ou procedimento armazenado usando o objeto de comando. Este é apenas para a recuperação direta de registros e é usado para ler os valores da tabela do primeiro ao último. (Consulte Mais informação)


1

ExecuteNonQuery: é normalmente usado quando não há nada retornado das instruções Sql, como operações de inserção, atualização e exclusão.

cmd.ExcecuteNonQuery();

ExecuteScalar:

Ele será usado quando a consulta Sql retornar um valor único.

Int b = cmd.ExcecuteScalar();

ExecuteReader

Será usado quando a consulta Sql ou o Procedimento Armazenado retornar várias linhas / colunas

SqlDataReader dr = cmd.ExecuteReader();

para obter mais informações, você pode clicar aqui http://www.dotnetqueries.com/Article/148/-difference-between-executescalar-executereader-executenonquery

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.