vidya jobin Ответов: 1

Столкновение типов операндов: int несовместимо с датой вставки


мой код :-
мой формат даты sql - YYYY-mm-dd
ed = 1;
            con = new SqlConnection(conn);
            UID = Login.UID;
            DateTime dt = DateTime.Now;
            if (txtTFee.Text != "" || txtpending.Text != "" || txtinst .Text != "" || txtamt .Text != "" || txtbalance .Text != "" || txtcourse .Text != "" || txtdpay .Text != "")
            {
                cmd = new SqlCommand("insert into Fee values(@date,@Regno,@CID,@Feepaid,@tfee,@pend,1,@uid,@crdate,@upuid,@update,1)", con);
                con.Open();
                cmd.Parameters.AddWithValue("@date", Convert.ToDateTime(txtdate.Text));
                cmd.Parameters.AddWithValue("@Regno", comboBox1.SelectedValue.ToString());
                cmd.Parameters.AddWithValue("@CID", Convert.ToInt32(lblcid.Text));
                cmd.Parameters.AddWithValue("@Feepaid", Convert.ToDouble(txtamt.Text));
                cmd.Parameters.AddWithValue("@tfee", Convert.ToDouble(txtfeepaid.Text));

                cmd.Parameters.AddWithValue("@pend", Convert.ToDouble(txtpending.Text));
                // cmd.Parameters.AddWithValue("@ps", 1);

                cmd.Parameters.AddWithValue("@uid", UID);
                cmd.Parameters.AddWithValue("@crdate", dt);
                cmd.Parameters.AddWithValue("@upuid", UID);
                cmd.Parameters.AddWithValue("@update", dt);
                cmd.ExecuteNonQuery();
                con.Close();


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

ed = 1;
            con = new SqlConnection(conn);
            UID = Login.UID;
            DateTime dt = DateTime.Now;
            if (txtTFee.Text != "" || txtpending.Text != "" || txtinst .Text != "" || txtamt .Text != "" || txtbalance .Text != "" || txtcourse .Text != "" || txtdpay .Text != "")
            {
                cmd = new SqlCommand("insert into Fee values(@date,@Regno,@CID,@Feepaid,@tfee,@pend,1,@uid,@crdate,@upuid,@update,1)", con);
                con.Open();
                cmd.Parameters.AddWithValue("@date", Convert.ToDateTime(txtdate.Text));
                cmd.Parameters.AddWithValue("@Regno", comboBox1.SelectedValue.ToString());
                cmd.Parameters.AddWithValue("@CID", Convert.ToInt32(lblcid.Text));
                cmd.Parameters.AddWithValue("@Feepaid", Convert.ToDouble(txtamt.Text));
                cmd.Parameters.AddWithValue("@tfee", Convert.ToDouble(txtfeepaid.Text));

                cmd.Parameters.AddWithValue("@pend", Convert.ToDouble(txtpending.Text));
                // cmd.Parameters.AddWithValue("@ps", 1);

                cmd.Parameters.AddWithValue("@uid", UID);
                cmd.Parameters.AddWithValue("@crdate", dt);
                cmd.Parameters.AddWithValue("@upuid", UID);
                cmd.Parameters.AddWithValue("@update", dt);
                cmd.ExecuteNonQuery();
                con.Close();

Jochen Arndt

Убедитесь, что порядок ваших значений соответствует порядку столбцов таблицы и что последний столбец имеет тип int (где вы передаете '1').

1 Ответов

Рейтинг:
0

OriginalGriff

Здесь две проблемы, одну из которых вы уже заметили.
Сначала я разберусь с другим.
Никогда не используйте Convert.ToDateTime, или конвертировать.ToDouble для обработки пользовательского ввода - это рецепт для вашего приложения, чтобы выйти из строя, если они ошибаются в вводе, - и с таким количеством входов в одной форме шансы высоки. И это чертовски раздражало бы меня, если бы я заполнил все это, а приложение рухнуло из-за того, что я неправильно набрал дату в первом поле...
Всегда используйте DateTime.Вместо этого попробуйте проанализировать и т. д. и сообщить о проблемах пользователям, а затем вернуться из метода, чтобы дать им возможность исправить это.

Теперь проблема, с которой вы столкнулись.
Когда вы не перечисляете имена столбцов, в которые вставляете, SQL вставляет их в фиксированном порядке - так же, как он перечисляет их в представлении "столбцы" в SSMS. Он не пытается выполнить какое-либо" сопоставление " по типу или пропустить какие-либо столбцы, такие как столбец идентификаторов, которые он все равно обрабатывает.
Вероятно, у вас есть столбец int ID, который задан как IDENTITY, и SQL пытается вставить значение DateTime в этот столбец: отсюда и ошибка. Это хорошая практика-всегда перечислять столбцы, которые вы хотите выбрать или повлиять, это также делает ваш код более устойчивым к изменениям базы данных в будущем и уменьшает объем данных, которые вы выбираете без необходимости, повышая производительность приложения.

cmd = new SqlCommand("INSERT INTO Fee (MyDate, RegNo, CID, FeePaid, TFee, PEND, UID, CRDate, UPUID, UPDate) VALUES (@date, @Regno, @CID, @Feepaid, @tfee, @pend, 1, @uid, @crdate, @upuid, @update, 1)", con);