Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
vladuhus
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 10
1

Conversion failed when converting the nvarchar value to data type int при подсчете записей

02.12.2019, 08:08. Просмотров 396. Ответов 13
Метки нет (Все метки)

Пытаюсь подсчитать кол-во записей в таблице которые имеют введенный Логин, но встречаю эту ошибку:
System.Data.SqlClient.SqlException: "Conversion failed when converting the nvarchar value 'dsfdsaf' to data type int.",
где dsfdsaf - логин пользователя.
Ошибка появляется здесь:
vb.net
1
2
SqlCommand UsersCount = new SqlCommand("SELECT COUNT(*) FROM [Clients] WHERE [login] = " + TextBox1.Text, sqlConnection);
                    int count = Convert.ToInt32(UsersCount.ExecuteScalar());
Подскажите, почему так происходит и как это исправить?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2019, 08:08
Ответы с готовыми решениями:

Conversion failed when converting the nvarchar value 'Label' to data type int.
Есть сайт Asp.net. Помогите разобраться, на локальном компьютере все работает нормально. Скинул на...

Поставщик Microsoft OLE DB для SQL Server (0x80040E07) Error converting data type nvarchar to decimal.
var Text = new String(mySmartUpload.Form.Item('Text').Values); var id_prize = ...

13

sau
2348 / 1818 / 322
Регистрация: 22.07.2011
Сообщений: 6,972
Завершенные тесты: 1
02.12.2019, 12:45 2
vladuhus, нужен полный текст ошибки , включая данные из stacktrace.
+ скрин части кода с местом ошибки
+ скрин схемы БД

П.С В запросе , значение TextBox1.Text нужно обернуть в кавычки , если login сравнивается со строкой.
+ параметры запроса лучше подставлять через SqlParams , иначе есть риск sql иньекций.
1
vladuhus
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 10
02.12.2019, 14:15  [ТС] 3
Код с ошибкой:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
    public partial class LoginSite : System.Web.UI.Page
    {
        public int idcookie;
        public string rules;
            private SqlConnection sqlConnection = null;
        protected async void Page_Load(object sender, EventArgs e)
        {
            string connectionString = ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString;
            sqlConnection = new SqlConnection(connectionString);
            await sqlConnection.OpenAsync();
        }
 
        protected async void Button1_Click(object sender, EventArgs e)
        {
 
            Dictionary<string, string> db = new Dictionary<string, string>();
            SqlCommand getUsersCredCmd = new SqlCommand("SELECT [login], [password] FROM [Users]", sqlConnection);
            SqlDataReader sqlReader = null;
            try
            {
                sqlReader = await getUsersCredCmd.ExecuteReaderAsync();
                while (await sqlReader.ReadAsync())
                {
                    db.Add(Convert.ToString(sqlReader["login"]), Convert.ToString(sqlReader["password"]));
                }
            }
            catch { }
            finally
            {
                if (sqlReader != null)
                    sqlReader.Close();
            }
           // try
            {
                if (TextBox2.Text == db[TextBox1.Text])
                {
                    SqlCommand UsersCount = new SqlCommand("SELECT COUNT(*) FROM [Clients] WHERE [login] = " + TextBox1.Text, sqlConnection);
                    int count = Convert.ToInt32(UsersCount.ExecuteScalar());
                    if (count > 0)
                    {
                        SqlCommand UserID = new SqlCommand("SELECT [id] FROM [Clients] WHERE [login] = " + TextBox1.Text, sqlConnection);
                        int userid = Convert.ToInt32(UserID.ExecuteScalar());
                        idcookie = userid;
                        rules = "Client";
                    }
                    else
                    {
                        SqlCommand UserID = new SqlCommand("SELECT [id] FROM [Drivers] WHERE [login] = " + TextBox1.Text, sqlConnection);
                        int userid = Convert.ToInt32(UserID.ExecuteScalar());
                        idcookie = userid;
                        rules = "Driver";
                    }
                    HttpCookie rulecookie = new HttpCookie("rules", rules);
                    HttpCookie id = new HttpCookie("id", idcookie.ToString());
                    HttpCookie login = new HttpCookie("login", TextBox1.Text);
                    HttpCookie sign = new HttpCookie("sign", SignGenerator.GetSign(TextBox2.Text + "bytepp"));
                    HttpCookie signrule = new HttpCookie("signrule", SignGenerator.GetSign(rules + "bytepp"));
                    Response.Cookies.Add(login);
                    Response.Cookies.Add(sign);
                    Response.Redirect("WelcomeSite.aspx", false);
                }
                else
                {
                    string script = "alert('Неверный логин или пароль');";
                    ClientScript.RegisterClientScriptBlock(this.GetType(), "MessageBox", script, true);
                }
            }
           // catch
            {
 
               //string script = "alert('Введите логин и пароль');";
                //ClientScript.RegisterClientScriptBlock(this.GetType(), "MessageBox", script, true);
 
            }
 
        }
    }
 }
0
Миниатюры
Conversion failed when converting the nvarchar value to data type int при подсчете записей   Conversion failed when converting the nvarchar value to data type int при подсчете записей  
sau
2348 / 1818 / 322
Регистрация: 22.07.2011
Сообщений: 6,972
Завершенные тесты: 1
02.12.2019, 16:08 4
vladuhus, хм , откройте как вкладочку "Триггеры" - скорее всего , есть триггер на таблице клиентов.
- ошибка должна быть вида "Недопустимое имя столбца" т.к Вы неправильно запрос строите , но вместо этого , у Вас на уровне БД ошибка конвертации , притом, что в самом запросе никакой конвертации не видно.
0
02.12.2019, 16:08
vladuhus
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 10
03.12.2019, 06:34  [ТС] 5
sau, Нет, триггеров я не создавал, папка абсолютно пустая.
0
sau
2348 / 1818 / 322
Регистрация: 22.07.2011
Сообщений: 6,972
Завершенные тесты: 1
03.12.2019, 09:28 6
vladuhus, проверьте , работает ли какой либо запрос к таблице Clients
0
vladuhus
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 10
03.12.2019, 11:57  [ТС] 7
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SqlCommand reguser = new SqlCommand("INSERT INTO [Users] (login, password)VALUES(@login, @password)", sqlConnection);
                reguser.Parameters.AddWithValue("login", TextBox1.Text);
                reguser.Parameters.AddWithValue("password", TextBox2.Text);
                await reguser.ExecuteNonQueryAsync();
                //SqlCommand UserID = new SqlCommand("SELECT [id] FROM [Users] WHERE [login] = " + TextBox1.Text, sqlConnection);
                //SqlDataReader sqlReaderID = null;
                //sqlReaderID = await UserID.ExecuteReaderAsync();
                //int userid = Convert.ToInt32(UserID.ExecuteScalar());
                reguser = new SqlCommand("INSERT INTO [Clients] (name, surname, fathername, phone, login)VALUES(@name, @surname,@fathername,@phone, @login)", sqlConnection);
                reguser.Parameters.AddWithValue("name", TextBox3.Text);
                reguser.Parameters.AddWithValue("surname", TextBox4.Text);
                reguser.Parameters.AddWithValue("fathername", TextBox5.Text);
                reguser.Parameters.AddWithValue("phone", TextBox6.Text);
                reguser.Parameters.AddWithValue("login", TextBox1.Text);
                Response.Redirect("LoginSite.aspx", false);
                await reguser.ExecuteNonQueryAsync();
Запрос на добавление работает. Здесь же не работает выборка id из Users, с той же ошибкой
0
sau
2348 / 1818 / 322
Регистрация: 22.07.2011
Сообщений: 6,972
Завершенные тесты: 1
03.12.2019, 14:13 8
vladuhus,
покажите содержимое папки Триггеры
1
vladuhus
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 10
04.12.2019, 01:18  [ТС] 9
Вот, пусто
0
Миниатюры
Conversion failed when converting the nvarchar value to data type int при подсчете записей  
kolorotur
Эксперт .NET
12377 / 9847 / 2535
Регистрация: 17.09.2011
Сообщений: 16,756
Завершенные тесты: 1
04.12.2019, 02:49 10
Цитата Сообщение от vladuhus Посмотреть сообщение
Запрос на добавление работает.
А по какой причине вы не пользуетесь параметризованным запросом при подсчете элементов?
У вас, например, из-за этого строковое значение не в кавычках и запрос выглядит так:
SQL
1
SELECT COUNT(*) FROM [Clients] WHERE [login] = dsfdsaf
Вместо такого:
SQL
1
SELECT COUNT(*) FROM [Clients] WHERE [login] = 'dsfdsaf'
Причина, может, и не в этом, но начните с правильного построения запроса — с использованием параметров.
1
vladuhus
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 10
04.12.2019, 11:47  [ТС] 11
vb.net
1
SqlCommand UsersCount = new SqlCommand("SELECT COUNT(*) FROM [Clients] WHERE [login] = '" + TextBox1.Text+"'", sqlConnection);
Написал запрос таким образом вроде начал работать. Посмотрим, что будет дальше
0
sau
2348 / 1818 / 322
Регистрация: 22.07.2011
Сообщений: 6,972
Завершенные тесты: 1
04.12.2019, 11:56 12
vladuhus, странное описание ошибки , причем тут converting to data type int ?...
- обычно , на запрос вида SELECT COUNT(*) FROM [Clients] WHERE [login] = dsfdsaf , должен ругнуться на недопустимое имя столбца. А какой версии сервер БД ?
- может на уровне обьектов сервера есть какой перехват exeption, который пытается обработать некорректный select и валится на преобразовании.
0
vladuhus
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 10
04.12.2019, 11:58  [ТС] 13
SQL Server 2014
P.S.
Как делать упоминание пользователя на этом форуме?
0
kolorotur
Эксперт .NET
12377 / 9847 / 2535
Регистрация: 17.09.2011
Сообщений: 16,756
Завершенные тесты: 1
04.12.2019, 15:32 14
Цитата Сообщение от vladuhus Посмотреть сообщение
Написал запрос таким образом
Напишите в TextBox1 такую строку:
Код
' OR 1 = 1; DROP TABLE [Clients]; --
И поймите уже, почему всегда нужно использовать параметризованные запросы, если значения параметров приходят извне, т.е. находятся вне вашего контроля.
0
04.12.2019, 15:32
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2019, 15:32

Arithmetic overflow error converting expression to data type int.
Люди, помогите... есть табличка, там столбец типа int (SQL Server 7 bigint нету), так вот когда...

Conversion failed when converting date and/or time from character string
В Форме: Dim ID As Integer Dim Company_Name As String Dim License_Key As...

Ошибка: Conversion failed when converting date and/or time from character string.
Все время эту ошибку выдает. Как изменить в запросе чтобы не ругалось. //запрос на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.