Prudhvi Raj Ответов: 3

Преобразование не удалось при преобразовании значения varchar 'hello' в тип данных int.


Необработанное исключение типа "System.Data.SqlClient. SqlException" произошло в System.Data.dll

Дополнительная информация: преобразование не удалось при преобразовании значения varchar 'hello' в тип данных int.

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

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Invoice_Genraton
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }
        SqlDataAdapter da;
         DataSet ds;
         SqlConnection con;
        private void btnSubmit_Click(object sender, EventArgs e)
        {
            con = new SqlConnection("Data Source=localhost;Initial Catalog=allcare;Integrated Security=True;Pooling=False");
            da = new SqlDataAdapter("insert into [prudhvi] values('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','"
                                        + textBox4.Text + "','" + textBox5.Text + "','" + textBox6.Text + "','" + textBox7.Text + "','" + textBox8.Text + "','" +
                                        textBox9.Text + "','" + textBox10.Text + "','" +  "')", con);
            ds = new DataSet();
            da.Fill(ds);
            Form2 f2 = new Form2();
            this.Hide();
            f2.label12.Text = textBox1.Text.ToString();
            f2.label13.Text = textBox2.Text.ToString();
            f2.label14.Text = textBox3.Text.ToString();
            f2.label15.Text = textBox4.Text.ToString();
            f2.label16.Text = textBox5.Text.ToString();
            f2.label17.Text = textBox6.Text.ToString();
            f2.label18.Text = textBox7.Text.ToString();
            f2.label19.Text = textBox8.Text.ToString();
            f2.label20.Text = textBox9.Text.ToString();
            f2.label21.Text = textBox10.Text.ToString();
            
            int n1 = int.Parse(textBox9.Text);
            int n2 = int.Parse(textBox10.Text);
            int total = n1 + n2;
            f2.label22.Text = total.ToString();
            f2.Show();


        }
    }
}

3 Ответов

Рейтинг:
2

Patrice T

Никогда не создавайте SQL-запрос путем конкатенации с пользовательскими вводами, он называется "SQL-инъекция", он опасен для вашей базы данных и подвержен ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользовательский ввод типа "Брайан О'Коннер" может привести к сбою вашего приложения, то это уязвимость SQL-инъекции.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]


Рейтинг:
0

OriginalGriff

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

int iVal;
if (!int.TryParse(txtThisShouldBeANumber.Text, out iVal))
   {
   ... Report input problem to user ...
   return;
   }
using (da = new SqlDataAdapter("INSERT INTO MyTable (MyColumnName) VALUES (@NUM)", com))
   {
   da.InsertCommand.Parameters.AddWithValue("@NUM", iVal);
   ...
   }
Это более дружелюбно для ваших пользователей, легче читать, легче поддерживать и чертовски безопаснее, чем передача контроля над вашей БД пользователю! И как еще одно преимущество, ваша проблема исчезнет в то же самое время...

Кстати: сделайте себе одолжение и перестаньте использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что" TextBox8 " - это номер мобильного телефона сегодня, но когда вам придется изменить его через три недели, вы тогда это сделаете? Используйте описательные имена - например, "tbMobileNo" - и ваш код станет легче читать, более самодокументируемым, более легким в обслуживании-и на удивление быстрее кодировать, потому что Intellisense может добраться до" tbMobile "за три нажатия клавиш, где" TextBox8 " занимает размышление и 8 нажатий клавиш...


Рейтинг:
0

Nirav Prabtani

На самом деле ваше исключение дает ответ на ваш вопрос.


Вы пытаетесь вставить значение varchar в поле int базы данных

Либо вы должны изменить тип данных столбца на varchar, либо вы можете вставить значения int только в этот конкретный столбец

На практике лучше писать имена столбцов в инструкции Insert соответствующих значений
напр.

INSERT INTO TABLE_NAME (COLUMN1,COLUMN2...) VALUES (@VAL1,@VAL2)


Дайте мне знать, если у вас есть какие-либо вопросы или опасения по этому поводу.