2016-03-25 2 views
1

Я пытаюсь выполнить поиск в таблице sql для определенной строки и вернуть количество найденных наблюдений. Он продолжает возвращать -1, хотя строка находится в таблице или нет. Вот мой код:Поиск строки в таблице SQL неуспешно

@{ 
    Layout = "~/_Layout.cshtml"; 
    Page.title = "TestArea"; 


    var db = Database.Open("Cafeen"); 
    string SearchWord = "Jolly"; 

    var msg = db.Execute("SELECT COUNT(*) FROM Products WHERE ProductName = @SearchWord"); 

} 

<p>@msg</p>  

Должен ли я, возможно, использовать что-то другое, чем COUNT(*)? Каково значение -1? Я бы предположил, что выражение возвращает 0, если строка не найдена.

+0

Вы на самом деле не передавая строку слово для поиска в db.Execute() называют там, ты? – Nyerguds

+0

Попробуйте var msg = db.Execute ("SELECT COUNT (*) FROM Продукты WHERE ProductName = '" + SearchWord + "'"); – Jamaxack

+1

@ Jamaxack Осторожно. Если эта строка вводится пользователем, вы запрашиваете сценарии Bobby Tables. – Nyerguds

ответ

1

Вы используете пространство имен WebMatrix.Data. В этом контексте вы должны вызывать метод QuerySingle не Execute, потому что, как многие уже заявили, этот метод предназначен для не возвращающих данных строк.

Метод Execute используется для выполнения команд без запроса в базе данных , таких как SQL Drop, создание, удаление, обновление, и вставить команды.

Кроме того, я предлагаю, чтобы изменить оператор запроса к более производительным один

var db = Database.Open("Cafeen"); 
string SearchWord = "Jolly"; 
string cmdText = @"IF EXISTS(SELECT 1 FROM Products 
          WHERE ProductName = @searchWord) 
         SELECT 1 ELSE SELECT 0"; 
int exists = Convert.ToInt32(db.QuerySingle(cmdText, SearchWord)); 
..... 
0

В db.Execute и SqlCommand.ExecuteNonQuery:

Для UPDATE, INSERT и DELETE заявления, возвращаемое значение есть число строк, затронутых командой. Когда триггер существует в вставленной или обновляемой таблице, возвращаемое значение включает в себя количество строк, затронутых как операцией вставки, так и обновлением, а также количеством строк, затронутых триггером или триггерами. Для всех других типов операторов, таких как SELECT, возвращаемое значение равно -1. Если происходит откат, возвращаемое значение равно -1.

Взгляните на следующие ссылки могут быть полезны:

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

How to Identify whether SQL job is successfully executed or not in C#

0

, относящихся к базе данных SQL, есть:

SqlCommand.ExecuteScalar Method() 

(ре: https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar(v=vs.110).aspx)

В противном случае, обратитесь к Database.QueryValue Методу (ре: https://msdn.microsoft.com/en-us/library/webmatrix.data.database.queryvalue(v=vs.111).aspx)

Оба метода возвращает скалярное значение из первого столбца/первой строки.

Кроме того, вместо COUNT(*) в инструкции SQL вы можете использовать COUNT(1) для лучшей производительности.

Надеюсь, это поможет.

+0

OP использует класс 'Database' из' WebMatrix'. – niksofteng

Смежные вопросы