agrorkhan Ответов: 1

Ошибка при вставке данных


SqlConnection cnn = new SqlConnection("Data Source=HAIER-PC;Initial Catalog=casemanegement;Integrated Security=True");
String sql = null;
sql = "insert into caseProfile ([file_number], [title_of_case], [nature_of_case], [district_id], [court_id], [institution_date], [appeal_number], [matter_in_dispute], [brief_on_case], [department_recomendation], [section_id]) values(@fn,@toc,@noc,@di,@ci,@id,@an,@mid,@boc,@dr,@si)";
warningmessage.Text = " Connection open hogaya hy";
using (cnn)
{
    try
    {
        cnn.Open();
        int di = 0;
        int ci = 0;
        int si = 0;
        loginform ln = new loginform();
        SqlCommand dis = new SqlCommand("Select district_id from District where (DistrictName='" + district.SelectedItem.ToString() + "'", cnn);
        SqlDataReader disr = dis.ExecuteReader();
        if (disr.HasRows)
        {
            while (disr.Read())
            {
                di = Int32.Parse(disr["district_id"].ToString());
                warningmessage.Text = "districtid::::::" + di;
            }

        }
        SqlCommand cid = new SqlCommand("Select court_id from courtName where (court_name='" + courtName.SelectedText + "'", cnn);
        SqlDataReader csr = cid.ExecuteReader();
        while (csr.Read())
            ci = Convert.ToInt32(csr["court_id"]);

        SqlCommand sid = new SqlCommand("Select section_id from login where (user_id='" + ln.textBox1.Text + "'", cnn);
        SqlDataReader ssr = sid.ExecuteReader();
        while (ssr.Read())
            si = Convert.ToInt32(ssr["section_id"]);
        //warningmessage.Text = "Testing  ::::::";
        using (SqlCommand cmd = new SqlCommand(sql, cnn))
        {
            cmd.Parameters.Add("@fn", SqlDbType.NVarChar).Value = fileNumber.Text;
            cmd.Parameters.Add("@toc", SqlDbType.NVarChar).Value = titleOfCase.Text;
            cmd.Parameters.Add("@noc", SqlDbType.NVarChar).Value = natureOfCase.Text;
            cmd.Parameters.Add("@di", SqlDbType.Int).Value = di;
            cmd.Parameters.Add("@ci", SqlDbType.Int).Value = ci;
            cmd.Parameters.Add("@id", SqlDbType.Date).Value = institutionDate.Text;
            cmd.Parameters.Add("@an", SqlDbType.NVarChar).Value = appealNumber.Text;
            cmd.Parameters.Add("@mid", SqlDbType.NVarChar).Value = matterInDispute.Text;
            cmd.Parameters.Add("@boc", SqlDbType.NVarChar).Value = briefOnCase.Text;
            cmd.Parameters.Add("@dr", SqlDbType.NVarChar).Value = departmentRecomendation.Text;
            cmd.Parameters.Add("@si", SqlDbType.Int).Value = si;
            int rowAdded = cmd.ExecuteNonQuery();
            if (rowAdded > 0)
                warningmessage.Text = "Record Inserted::::::" + rowAdded;
            else
                warningmessage.Text = "No Record Inserted::::::" + rowAdded;
        }
    }
    catch (Exception ex)
    {
        warningmessage.Text = "Error:" + ex.Message;
    }
}


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

Всегда показывает ошибку... Пожалуйста, исправьте это

RickZeeland

И каково точное сообщение об ошибке ?

ZurdoDev

И как мы можем это исправить?

srko

Пожалуйста, добавьте ошибку, чтобы мы могли точно направлять вас по этому вопросу.

1 Ответов

Рейтинг:
0

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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

А затем выясните, почему вы открываете SqlDataReader на соединении, а затем пытаетесь вставить, не закрывая сначала считыватель? Это не сработает! И почему вы все равно делаете этот код считывателя - это наименее эффективный способ получить последнее значение и не обязательно даст вам правильный результат в любом случае ... особенно после того, как вы выйдете из dev и перейдете в производство, где странные прерывистые проблемы приведут к сильно искореженной базе данных, которую нужно будет исправить.