Ошибка: оценка выражения не поддерживается - PullRequest
0 голосов
/ 06 июня 2018

Я хочу просто увеличить значение столбца в базе данных на 1, но я всегда получаю expression evaluation not supported error /

Я использую этот запрос:

UPDATE SISTEMSKA_OGRANICENJA SET TRENUTNO = ((SELECT N.TRENUTNO FROM 
SISTEMSKA_OGRANICENJA N WHERE N.KORISNIKID = @KorisnikID AND N.OGRANICENJE = 
@Ogranicenje) + 1) WHERE KORISNIKID = @KOrisnikID 
AND OGRANICENJE = @Ogranicenje

Iтакже пытался без объявления N в операторе выбора, но он все еще не работает.

Я также пытался

UPDATE SISTEMSKA_OGRANICENJA SET TRENUTNO = TRENUTNO + 1) WHERE KORISNIKID 
= @KOrisnikID AND OGRANICENJE = @Ogranicenje

Я знаю, в чем проблема, поле TRENUTNO имеет тип Varchar.Как я могу преобразовать его в int добавить 1 и затем обратно в varchar все в одном запросе?Я знаю, как сделать это с двумя, но это будет медленнее.

Временно я сделал это в 2 запроса, как это:

public static void UvecajTrenutno(Ogranicenja ogranicenje, int korisnikId)
{
    using (FbConnection con = new FbConnection(M.Baza.connectionString))
    {
        int trenutno = -1;
        con.Open();
        using (FbCommand cmd = new FbCommand("SELECT TRENUTNO FROM SISTEMSKA_OGRANICENJA WHERE KORISNIKID = @KorisnikID AND OGRANICENJE = @Ogranicenje", con))
        {
            cmd.Parameters.AddWithValue("@KorisnikID", korisnikId);
            cmd.Parameters.AddWithValue("@Ogranicenje", ogranicenje);

            FbDataReader dr = cmd.ExecuteReader();

            if(dr.Read())
            {
                trenutno = Convert.ToInt32(dr[0]);
            }
        }
        if(trenutno < 0)
        {
            MessageBox.Show("Doslo je do greske! - Korisnik.Ogranicenje.UvecajTrenutno");
            return;
        }
        using (FbCommand cmd = new FbCommand("UPDATE SISTEMSKA_OGRANICENJA SET TRENUTNO = @TR WHERE KORISNIKID = @KorisnikID AND OGRANICENJE = @Ogranicenje", con))
        {
            cmd.Parameters.AddWithValue("@KorisnikID", korisnikId);
            cmd.Parameters.AddWithValue("@Ogranicenje", ogranicenje);
            cmd.Parameters.AddWithValue("@TR", trenutno + 1);

            cmd.ExecuteNonQuery();
        }
    }
}

1 Ответ

0 голосов
/ 06 июня 2018

Вам необходимо изменить оператор обновления на:

UPDATE SISTEMSKA_OGRANICENJA 
    SET TRENUTNO = (cast(TRENUTNO as integer) + 1)
    WHERE KORISNIKID = @KOrisnikID AND OGRANICENJE = @Ogranicenje

Правильно IIRC (не может проверить это прямо сейчас), это должно автоматически привести к varchar, но в противном случае изменить его на

UPDATE SISTEMSKA_OGRANICENJA 
    SET TRENUTNO = cast(cast(TRENUTNO as integer) + 1 as varchar(20))
    WHERE KORISNIKID = @KOrisnikID AND OGRANICENJE = @Ogranicenje

Однако, как я указал в комментариях, если TRENUTNO предполагается числовым значением, и если оно предназначено для манипулирования таким образом (что, похоже, имеет место, как вы делаете это сейчас),тогда было бы лучше изменить этот столбец на числовое значение (целое число, bigint и т. д.) вместо строкового типа.Это было бы реальным решением вашей проблемы.

Решение с приведениями будет терпеть неудачу, если TRENUTNO содержит значения, которые не могут быть преобразованы в целое число.

Небольшое предупреждение: я не понимаюУ меня нет доступа к установке Firebird прямо сейчас, позже я проверю свой ответ сегодня.

...