Member 12605293 Ответов: 3

Ошибка преобразования в тип varchar значение в int


Привет Существует преобразования ошибка "ошибка преобразования в тип varchar значение в int"

Примечание: столбец Age(txtAge) является целочисленным.

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

<pre>public void Bind_ddlState()
        {


            SqlCommand cmd = new SqlCommand("SELECT [StateID] ,[StateName]   FROM [StateDetails] where [StateID]='" + DDlCountry.SelectedValue + "'", cn);
            SqlDataAdapter sda = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            sda.Fill(dt);
            Ddlstate.DataSource = dt;
            Ddlstate.DataTextField = "StateName";
            Ddlstate.DataValueField = "StateID";
            Ddlstate.DataBind();

            cn.Close();
        }



        protected void Button1_Click1(object sender, EventArgs e)
        {
            {
                cn.Open();
                SqlCommand cmd = new SqlCommand("INSERT INTO [RegisDetails] (Name, Department,Salry,DOJ,DOB, Age,Country,Stat,Phone,Email,Pincode)  VALUES ('" + txtname.Text + "','" + txtDept.Text + "','" + txtSalary.Text + "','" + txtDoj.Text + "','" + txtDob.Text + "','" + txtAge.Text + "','" + DDlCountry.Text + "','" + Ddlstate.Text + "','" + txtPhone.Text + "','" + TxtEmail.Text + "','" + txtPin.Text + "' )", cn);

                cmd.ExecuteNonQuery();
                cn.Close();
            }

        }


        protected void Button2_Click1(object sender, EventArgs e)
        {
            this.ClearCachedClientID();


        }

        protected void DDlCountry_SelectedIndexChanged(object sender, EventArgs e)
        {

            Bind_ddlState();

        }

      

        protected void txtDate1_TextChanged(object sender, EventArgs e)
        {


        }

        protected void txtDate2_TextChanged(object sender, EventArgs e)
        {

        }

        protected void txtAge_TextChanged(object sender, EventArgs e)
        {
            DateTime dateOfBirth = new DateTime();
            int currentYear, currentMonth, birthMonth, birthYear, years, months;
            dateOfBirth = Convert.ToDateTime(txtAge.Text);
            currentYear = Convert.ToInt32(DateTime.Now.Year);
            currentMonth = Convert.ToInt32(DateTime.Now.Month);
            birthYear = Convert.ToInt32(dateOfBirth.Year);
            birthMonth = Convert.ToInt32(dateOfBirth.Month);
            years = currentYear - birthYear;
            if ((currentMonth - birthMonth > 0))
            {
                months = Convert.ToInt32(currentMonth - birthMonth);
            }
            else
            {
                years = years - 1;
                months = Convert.ToInt32((12 - birthMonth) + currentMonth);
            }
            txtAge.Text = years.ToString() + "/" + months.ToString();


        }

F-ES Sitecore

Что такое "год"? "месяцы"? Ошибка говорит вам, что вы пытаетесь преобразовать varchar (строку в базе данных) в int, поэтому, если это поле содержит "hello", то преобразование в int завершится неудачей. Я также не вижу SQL в вашем вопросе, я не уверен, что вы публикуете соответствующий бит кода.

Jon McKee

Точно мои мысли. Похоже, что возраст может храниться в виде строки "ММ/ДД/гггг".

Member 12605293

Привет, Джон, взгляни на мой код. Есть ли необходимость в int. Parse/int. TryParse??

F-ES Sitecore

На какой линии вы получаете ошибку? Я вижу, что это может произойти, когда вы выполняете вставку. Однако мы не знаем, каковы ваши типы полей, что такое int, что такое varchar или что-то еще. Как я уже сказал, Вы пытаетесь преобразовать строку в int где-то, мы не можем получить доступ к вашей базе данных или вашим данным, поэтому вам просто нужно отследить, где происходит это преобразование.

Member 12605293

Имя варчар (50) Проверен
Отдел варчар(50) Проверен
Salry int проверено
DOJ datetime проверено
Доб датавремя проверено
Возраст int проверен
Страна варчар(30) Проверен
Стат варчар (30) Проверен
Телефон int проверен
Электронная почта varchar(50) Проверен
Пинкод инт проверено
Непроверенный

F-ES Sitecore

Ваше поле "возраст" - это int, но вы вставляете значение txtAge в кавычки. Во-первых, кавычки означают, что значение является строкой, во-вторых, значение txtAge-это что-то вроде "20\5". Как это перевести в int?

Вам просто нужно убедиться, что значения, входящие в поля, верны, и использование параметризованных запросов поможет вам в этом, но вам также нужно точно решить, что будет храниться в Age и как убедиться, что значение попадет туда.

Member 12605293

Да точно такая же строка "я вижу, что это возможно происходит, когда вы выполняете вставку"

Jon McKee

Если вы имеете в виду Convert.ToInt32 методы, то не. значение datetime хранит инвидивуальный год/месяц/день в виде int.

Боковое Примечание: существует небольшая разница между Convert.ToInt32 и Int32.Parse. Convert возвращает 0 вместо того, чтобы создавать исключение для недопустимого аргумента.

Afzaal Ahmad Zeeshan

Это действительный номер варчара? Убедитесь, что там нет никаких дополнительных символов, таких как специальные символы.

Member 12605293

Привет Afzaal
Какой варчар???

Afzaal Ahmad Zeeshan

Тип столбца.

Member 12605293

Да это действительно так

3 Ответов

Рейтинг:
23

OriginalGriff

Начните с того, что не делайте этого так! Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Используйте различные методы TryParse для преобразования пользовательских входных данных в соответствующие типы данных-числа в int или double переменные, даты в DateTime и так далее - а затем передайте преобразованные значения в SQL в качестве параметров, не забывая сообщать о любых проблемах пользователю, а не просто слепо предполагать, что его ввод верен.

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


Рейтинг:
15

Ramesh Kumar Barik

"Ошибка преобразования в тип varchar значение в int"

Эта проблема возникла из-за вставки строкового значения в целочисленное поле таблицы.

В вашей таблице базы данных есть 4 столбца (зарплата, возраст, телефон, пинкод), которые имеют тип данных int.

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

Примечание: любое целочисленное значение, заключенное в одинарную кавычку, может быть вставлено в целочисленное поле без какой-либо ошибки. Например: "0" или "123"


Er.Muneer Khan

Преобразовать.ToInt64(txtAge. Text);

Vincent Maverick Durano

Это небезопасно. Что делать, если txtAge.Текст содержит не числовые значения?

Er.Muneer Khan

проверка возраста текстового поля простой

Рейтинг:
0

Vincent Maverick Durano

Во-первых, добавление значений из ваших входных данных в ваш SQL-оператор-это большое НЕТ-НЕТ, так как это может привести вас к атаке SQL-инъекции. Прочитай: Защитите свои данные: предотвратите SQL-инъекцию[^][^]

Во-вторых, сделайте привычкой ставить объекты, которые едят ресурсы, такие как SqlConnection в using statement чтобы убедиться, что объекты будут правильно утилизированы и закрыты после их использования.

В-третьих, не пишите свой код для расчета возраста в TextChanged событие, потому что это событие всегда будет срабатывать, когда вы вводите / изменяете что-то из TextBox В качестве альтернативы вы могли бы вместо этого написать код по адресу ButtonClick событие.

А теперь опусти свой вопрос...

Ты сказал:, Age столбец имеет тип integer. Теперь глядя на ваш код по адресу TextChanged событие, вы используете это:

txtAge.Text = years.ToString() + "/" + months.ToString();


Теперь ваш txtAge.Текстовое значение содержит символ"/", который вызывает возникшую у вас ошибку. Целочисленный тип может принимать только числовые значения, поэтому вам нужно убедиться, что значение вашего TxtAge должно содержать только числовые значения. Чтобы предотвратить это, вы могли бы:

1. реализуйте проверку на стороне клиента, чтобы разрешить только числовые значения для вашего txtAge с помощью JavaScript/jQuery
2. как было предложено, используйте Типа int32.Метод TryParse (Система)[^] для повторной проверки значения на сервере. Например:
int age;
if(Int32.TryParse(txtAge.Text.Trim(), out age))
{
    //do stuff here
    //use the value of age variable in your query
}
else
{
    Response.Write("Not valid");
}