Неправильный синтаксис рядом с ‘,’. ошибка

#asp.net #sql #syntax #connection

#asp.net #sql #синтаксис #подключение

Вопрос:

Я получаю ошибку SQL при попытке сделать это:

     public static int GetOrderId(decimal totalprice, int userid)
    {
        string s = "SELECT * from orders where OrderUserId = "   userid   " and OrderTotalPrice = "   totalprice;
        cmd = new SqlCommand(s, con);
        int temporderid = Convert.ToInt32(cmd.ExecuteScalar());

        return temporderid;
    }
  

Насколько я вижу, из-за того, что он возвращает OrderTotalPrice, формат несовместим. Но я не могу понять, как получить его в совместимом формате.

Комментарии:

1. Вы должны использовать параметризованные запросы (хотя, по крайней мере, в этом случае оба значения, по крайней мере, гарантированно числовые)

2. Как выглядит команда SQL после ее объединения с аргументами? В основном значение s перед выполнением вашей команды. Вы также обычно не можете использовать ExecuteScalar с SELECT * запросом. ExecuteScalar ожидает, что будет возвращено одно значение, а не строка данных.

3. так что переход на reader insteed может помочь или?

4. просто изменил его на: строка s = «ВЫБРАТЬ * из заказов, где OrderUserId = » userid » и OrderTotalPrice = » totalprice; cmd = новая SqlCommand(s, con); reader = cmd. ExecuteReader(); int temporderid = (int) считыватель. GetSqlInt32(0); возвращает temporderid; но все равно выдает ту же ошибку, потому что форматирование

5. Пара предложений 1) используйте сохраненные процедуры, вы получаете бонусы, такие как производительность и безопасность. 2) если вы хотите вернуть только 1 значение, выберите TOP 1 * вместо select * . Я не уверен, может ли ваша ошибка быть вызвана тем, что вы выбираете несколько записей, но пытаетесь поместить их в переменную int, которая может содержать только 1 значение.

Ответ №1:

Вероятно, это форматирование totalprice с запятой, например 3,14 , где SQL Server ожидает точку, например 3.14 .

Одним из способов исправить это было бы указать InvariantCulture, в котором используется точка:

 var s = string.Format(
    CultureInfo.InvariantCulture, 
    "SELECT * from orders where OrderUserId = {0} and OrderTotalPrice = {0:0.0}",
    42, 3.1415);
  

Это форматирует цену как 3.1 на любом компьютере.

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

 var com = new SqlCommand();
com.CommandType = CommandType.Text;
com.CommandText = "SELECT * from orders where OrderUserId = @userid "  
    "and OrderTotalPrice = @totalprice";
com.Parameters.AddWithValue("@userid", 42);
com.Parameters.AddWithValue("@totalprice", 3.1415);
var temporderid = com.ExecuteScalar();
  

Тогда вам не нужно беспокоиться о форматах, потому что вы отправляете базе данных double, а не double в формате строки.

Ответ №2:

Я думаю, это потому, что totalprice преобразуется во что-то вроде 12,35 , когда вы объединяете запрос.

Поэтому я бы посоветовал вам использовать параметризованный запрос. Например, вот так:

 var s = "SELECT * from orders "  
    " where OrderUserId = @userid and OrderTotalPrice = @totalprice";
var cmd = new SqlCommand(s, con);
cmd.Parameters.AddWithValue("userid", userid);
cmd.Parameters.AddWithValue("totalprice", totalprice);

int temporderid = Convert.ToInt32(cmd.ExecuteScalar());