AttaUrRahman Ответов: 1

Как мне справиться с этой ошибкой


Ошибка
Необработанное исключение типа 'System.FormatException' произошло в mscorlib.dll

Дополнительная информация: строка не была распознана как допустимая Дата-Время. Существует неизвестное слово, начинающееся с индекса 0.


Код:
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 Data_Entry
{
    public partial class mainform : Form

    {
        public mainform()
        {
            InitializeComponent();
        }
       
        Dataaccess dc= new Dataaccess();

        private void groupControl1_Paint(object sender, PaintEventArgs e)
        {

        }
        private void buttonclear_Click(object sender, EventArgs e)
        {
           this.textEditserialno.Text = "";
           this.textEditname.Text = "";
           this.textEditfathername.Text = "";
           comboBoxgender.SelectedIndex = -1;
           this.textEditcnic.Text = "";
           this.textEditmobileno.Text = "";
           this.textEditaddress.Text = "";
           //this.textEditvc.Text = "";
           //this.textEdittehsil.Text = "";
           //this.textEditdistrict.Text = "";
           this.textEditoccupation.Text = "";
        }

        private void Buttonsubmitt_Click(object sender, EventArgs e)
        {
            //try
            //{
                String serialno = textEditserialno.Text.ToString();
                //int serial= Int32.Parse(serialno);
                long serial = Int64.Parse(serialno);
                String name = textEditname.Text.ToString();
                String fathername = textEditfathername.Text.ToString();
                String gender = comboBoxgender.SelectedItem.ToString();
                String nic = textEditcnic.Text.ToString();
                //int cnic = Int32.Parse(nic);
                long cnic = Int64.Parse(nic);
                String mobileno = textEditmobileno.Text.ToString();
                //int mobile = Int32.Parse(mobileno);
                long mobile = Int64.Parse(mobileno);
                DateTime date = DateTime.Parse(dateEditdob.ToString());
                String address = textEditaddress.Text.ToString();
                String vc = textEditvc.Text.ToString();
                String tehsil = textEdittehsil.Text.ToString();
                String district = textEditdistrict.Text.ToString();
                String occupation = textEditoccupation.Text.ToString();

                String q = "Insert into entry values(" + serial + ",'" + name + "','
" + fathername + "','" + gender + "'," + cnic + "," + mobileno + ",'" +date+ "',''" + address + "','" + vc + "','" + tehsil + "','" + district + "','" + occupation + "')";
                SqlCommand sc = new SqlCommand (q,dc.open());
                 sc.ExecuteNonQuery();
                //if (i>=1)
                    MessageBox.Show("Data Entered Successfully : ");
                //else
                //    MessageBox.Show("Data Not Entered ");
//}catch(System.Exception exp){
            //    MessageBox.Show("Error is " + exp.ToString());
            }
            
        }

        
    }


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

Я попробовал, но не нашел ошибки

0x01AA

Прекратите строить sql-операторы с конкатенациями строк. Это убережет вас от sql-инъекции, и это убережет вас от проблемы, с которой вы сталкиваетесь с datetime. Есть участники, у которых есть стандартный ответ на этот вопрос, просто обратите внимание, чтобы прочитать его, @OriginalGriff, который теперь является вашей частью ;)

Richard Deeming

const string Query = @"INSERT INTO entry (serial, name, fathername, gender, cnic, mobileno, date, address, vc, tehsil, district, occupation) VALUES (@serial, @name, @fathername, @gender, @cnic, @mobileno, @date, @address, @vc, @tehsil, @district, @occupation)";

using (SqlConnection connection = dc.Open())
using (SqlCommand command = new SqlCommand(Query, connection))
{
    command.Parameters.AddWithValue("@serial", serial);
    command.Parameters.AddWithValue("@name", name);
    command.Parameters.AddWithValue("@fathername", fathername);
    command.Parameters.AddWithValue("@gender", gender);
    command.Parameters.AddWithValue("@cnic", cnic);
    command.Parameters.AddWithValue("@mobileno", mobileno);
    command.Parameters.AddWithValue("@date", date);
    command.Parameters.AddWithValue("@address", address);
    command.Parameters.AddWithValue("@vc", vc);
    command.Parameters.AddWithValue("@tehsil", tehsil);
    command.Parameters.AddWithValue("@district", district);
    command.Parameters.AddWithValue("@occupation", occupation);
    command.ExecuteNonQuery();
}

1 Ответов

Рейтинг:
5

OriginalGriff

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

И когда вы исправите это, вы будете преобразовывать строковые даты в значения C# DateTime, используя DateTime.TryParse или DateTime.TryParseExact, а затем передача onl;y допустимых данных в вашу БД через параметр. И в этот момент ваша проблема исчезнет в то же самое время.

Но сделайте себе одолжение и перечислите столбцы, в которые вы вставляете:
INSERT INTO MyTable (ColumnName1, ColumnName2) VALUES (@C1Param, @C2Param)
Таким образом, ваш код будет работать, даже если ваш дизайн БД изменится, а также будет намного легче обнаружить, что вы поменяли местами два значения и отправили их в неправильные столбцы...


0x01AA

О боже я опоздал на несколько секунд со своим комментарием :-)