Wybierz opcję Zapytanie, aby pobrać dane z programu SQL Server


Próbuję uruchomić zapytanie SQL Select w moim kodzie C #. Ale zawsze otrzymuję wynik -1
int result = command.ExecuteNonQuery();

Jednak ta sama tabela, jeśli używam do
delete
lub
insert
, działa ...
ConnectString
też jest w porządku.
Sprawdź poniższy kod
SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Password=");
conn.Open();SqlCommand command = new SqlCommand("Select id from [table1] where name=@zip", conn);//command.Parameters.AddWithValue("@zip","india");
int result = command.ExecuteNonQuery();// result gives the -1 output.. but on insert its 1
using (SqlDataReader reader = command.ExecuteReader())
{
// iterate your results here
Console.WriteLine(String.Format("{0}",reader["id"]));
}conn.Close();

Zapytanie działa dobrze na SQL Server, ale nie rozumiem, dlaczego nie działa tylko zapytanie wybierające.
Wszystkie inne żądania działają.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Sposób

SqlCommand.ExecuteNonQuery
Funkcji ExecuteNonQuery można używać do wykonywania operacji katalogowych (takich jak wykonywanie zapytań dotyczących struktury bazy danych lub tworzenia obiektów bazy danych, takich jak tabele) lub do modyfikowania danych w bazie danych bez użycia DataSet przez wykonanie instrukcji UPDATE, INSERT lub DELETE.
Mimo że funkcja ExecuteNonQuery nie zwraca żadnych wierszy, wszystkie parametry wyjściowe lub wartości zwracane, które są zamapowane na parametry, są wypełniane danymi.
W przypadku instrukcji UPDATE, INSERT i DELETE wartością zwracaną jest liczba wierszy, na które ma wpływ polecenie. Gdy wyzwalacz istnieje we wstawionej lub zaktualizowanej tabeli, wartość zwracana obejmuje liczbę wierszy, na które ma wpływ operacja wstawiania lub aktualizacji, oraz liczbę wierszy, na które ma wpływ wyzwalacz lub wyzwalacze. W przypadku wszystkich innych typów operatorów zwracana wartość to -1. Jeśli nastąpi wycofanie, wartość zwracana również wynosi -1.

Metoda SqlCommand.ExecuteScalar

wykonuje instrukcję języka Transact-SQL w celu połączenia i zwraca liczbę wierszy, których to dotyczy.

Więc nie. z instrukcji zwracanych przez instrukcję SELECT należy użyć metody ExecuteScalar.

Połączyć:

http://msdn.microsoft.com/en-us/ library/system.data.sqlclient.sqlcommand.executenonquery (v = vs.110). aspx
http://msdn.microsoft.com/en-u ... query(v=vs.110).aspx
Więc wypróbuj poniższy kod:
SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Password=");
conn.Open();SqlCommand command = new SqlCommand("Select id from [table1] where name=@zip", conn);
command.Parameters.AddWithValue("@zip","india");
// int result = command.ExecuteNonQuery();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
Console.WriteLine(String.Format("{0}",reader["id"]));
}
}conn.Close();
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Według MSDN
http://msdn.microsoft.com/ru-ru/ library/system.data.sqlclient.sqlcommand.executenonquery (v = vs.110). aspx
http://msdn.microsoft.com/ru-r ... query(v=vs.110).aspx
wynik -


jest to liczba dotkniętych wierszy
a ponieważ Twoje zapytanie to
select
,

żadna linia nie zostanie dotknięta

(tj. wstawione, usunięte lub zaktualizowane).
Jeśli chcesz wrócić

jedna linia

zapytanie, użyj
ExecuteScalar ()
zamiast
ExecuteNonQuery ()
:
int result = (int) (command.ExecuteScalar());

Jeśli jednak spodziewasz się zwrotu

Wiele wierszy
,
ExecuteReader ()
to jedyna opcja:
using (SqlDataReader reader = command.ExecuteReader()) {
while (reader.Read()) {
int result = reader.GetInt32(0); ...
}
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

możesz użyć
ExecuteScalar ()
zamiast
ExecuteNonQuery ()
, aby uzyskać jeden wynik
użyj tego w ten sposób
Int32 result= (Int32) command.ExecuteScalar();
Console.WriteLine(String.Format("{0}", result));

Wykona zapytanie i zwróci pierwszą kolumnę pierwszego wiersza w zestawie wyników zwróconych przez zapytanie. Dodatkowe kolumny lub wiersze są ignorowane.
Ponieważ chcesz otrzymać tylko jedną linię w zamian, usuń to użycie
SqlDataReader
z kodu
using (SqlDataReader reader = command.ExecuteReader())
{
// iterate your results here
Console.WriteLine(String.Format("{0}",reader["id"]));
}

ponieważ spowoduje to ponowne wykonanie polecenia i wpłynie na wydajność strony.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To znaczy zgodnie z projektem.
http://msdn.microsoft.com/en-us/ library/system.data.sqlclient.sqlcommand.executenonquery (v = vs.110). aspx
http://msdn.microsoft.com/en-u ... query(v=vs.110).aspxW przypadku instrukcji UPDATE, INSERT i DELETE wartością zwracaną jest liczba wierszy, na które ma wpływ polecenie. Gdy wyzwalacz istnieje we wstawionej lub zaktualizowanej tabeli, wartość zwracana obejmuje liczbę wierszy, na które ma wpływ operacja wstawiania lub aktualizacji, oraz liczbę wierszy, na które ma wpływ wyzwalacz lub wyzwalacze. W przypadku wszystkich innych typów operatorów zwracana wartość to -1. Jeśli nastąpi wycofanie, wartość zwracana również wynosi -1.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

należy również dodać parametr @zip
SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Password=");
conn.Open();
SqlCommand command = new SqlCommand("Select id from [table1] where name=@zip", conn);
//
// Add new SqlParameter to the command.
//
command.Parameters.AddWithValue("@zip","india");
int result = (Int32) (command.ExecuteScalar());
using (SqlDataReader reader = command.ExecuteReader())
{
// iterate your results here
Console.WriteLine(String.Format("{0}",reader["id"])); }
conn.Close();
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Powinieneś użyć
ExecuteScalar ()
(który zwraca pierwszy wiersz pierwszej kolumny) zamiast
ExecuteNonQuery ()
(który zwraca liczbę wierszy, których to dotyczy).
Aby uzyskać więcej informacji, skontaktuj się z

różnice między executescalar i executenonquery
http://www.aspneto.com/ado-net ... .html
.
Mam nadzieję że to pomoże!

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się