Arham Anees Ответов: 3

Оператор Sql в C# выдает ошибку sqlexception


вот мой код
//cmd is already declared as string
cmd = "SELECT SUM(purchasePrice) AS price, COUNT(purchasePrice) AS num" +
"FROM ( SELECT TOP ("+quantity+") purchasePrice FROM store.dbo.tblSingleItems" +
"WHERE IsActive='1' AND proID='" + proID + "') AS profit" +
"UPDATE TOP ("+quantity+") tblSingleItems SET IsActive='1',salePrice='"
 + price +"' " +
"WHERE IsActive='1' AND proID='" + proID + "'";

SqlCommand sqlcmd = new SqlCommand(cmd, con);
SqlDataAdapter sda = new SqlDataAdapter(sqlcmd);
DataTable tbl = new DataTable();
sda.Fill(tbl);
con.Close();

когда это выполняется в приложении, дает Синтаксическая ошибка рядом с '='

Что я уже пробовал:

я попробовал эту команду в sql server 2014, которая дает мне вывод без каких-либо ошибок. я очень внимательно посмотрел, но не смог найти никакой синтаксической ошибки. если кто-нибудь может узнать

3 Ответов

Рейтинг:
21

David_Wimbley

Во-первых, это не то, как вы должны строить sql-оператор, вы открыты для атак sql-инъекций здесь.

Параметризация sql запросов c#

Затем просто посмотрите на свой запрос. После этого у тебя нет места store.dbo.tblSingleItems и следующая строка: WHERE IsActive = '1' Итак, ваш запрос, когда он разбирается, выглядит так, чтобы сделать его более очевидным, вот он весь на одной строке

SELECT SUM(purchasePrice) AS price, COUNT(purchasePrice) AS numFROM ( SELECT TOP ("+quantity+") purchasePrice FROM store.dbo.tblSingleItemsWHERE IsActive='1' AND proID='" + proID + "') AS profitUPDATE TOP(1) tblSingleItems SET IsActive='1',salePrice='1' WHERE IsActive='1' AND proID='1';


Поэтому вам, вероятно, нужно настроить свой код так, чтобы он выглядел следующим образом

cmd = "SELECT SUM(purchasePrice) AS price, COUNT(purchasePrice) AS num " +
"FROM ( SELECT TOP ("+quantity+") purchasePrice FROM store.dbo.tblSingleItems " +
"WHERE IsActive='1' AND proID='" + proID + "') AS profit " +
"UPDATE TOP ("+quantity+") tblSingleItems SET IsActive='1',salePrice='" + price +"' " + " WHERE IsActive='1' AND proID='" + proID + "'";


Обратите внимание на дополнительные пробелы. Я думаю, что у вас могут быть проблемы в вашем заявлении SELECT, так как оно не имеет большого смысла для меня, но если эта часть работает, то отлично. Просто обращаюсь к синтаксической ошибке.


Arham Anees

на самом деле я никогда не изучал базу данных в качестве первого курса программирования, поэтому я получил помощь от google. честно говоря, я не знаю, как это работает, но это работает.

Arham Anees

это сработало. спасибо чувак :)

Рейтинг:
1

Richard Deeming

Если вы отладите свой код и посмотрите на последнюю строку, вы увидите проблему: вам не хватает пробелов в нескольких строках.

const string query = 
    "SELECT SUM(purchasePrice) AS price, COUNT(purchasePrice) AS num " + // <--Add a space here
    "FROM ( SELECT TOP (@quantity) purchasePrice FROM store.dbo.tblSingleItems " + // <-- And here
    "WHERE IsActive = '1' AND proID = @proID) AS profit; " + // <-- And here
    "UPDATE TOP (@quantity) tblSingleItems SET IsActive = '1', salePrice = @price "
    "WHERE IsActive='1' AND proID = @proID;";

using (SqlCommand sqlcmd = new SqlCommand(query, con))
{
    sqlcmd.Parameters.AddWithValue("@quantity", quantity);
    sqlcmd.Parameters.AddWithValue("@proID", proID);
    sqlcmd.Parameters.AddWithValue("@price", price);
    
    SqlDataAdapter sda = new SqlDataAdapter(sqlcmd);
    DataTable tbl = new DataTable();
    sda.Fill(tbl);
    ...
}


Рейтинг:
1

Wes Carroll

Вам нужно несколько пробелов в начале и конце ваших строк, чтобы разделить операторы sql, чтобы они не переходили друг к другу. т. е. +"WHERE should be + "WHERE" кроме того, вы действительно должны использовать параметры в своем запросе.