Nishant.Chauhan80 Ответов: 1

Вставить ошибку запроса "строка или двоичные данные будут усечены. Заявление было прекращено. С#"


Структура моей таблицы :

Alter TABLE [dbo].[tbStudInfo](
	[stdID] [varchar](50) NOT NULL,
	[fname] [varchar](50) NOT NULL,
	[lname] [varchar](50) NOT NULL,
	[address] [varchar](50) NULL,
	[city] [varchar](50) NOT NULL,
	[pcode] [bigint] NULL,
	[phno] [varchar](50) NULL,
	[cellno] [varchar](50) NULL,
	[gender] [varchar](10) NOT NULL,
	[emailID] [varchar](50) NOT NULL,
	[bdate] [varchar](50) NULL,
	[qua] [varchar](50) NULL,
	[cID] [varchar](50) NOT NULL,
	[fcID] [varchar](50) NOT NULL,
	[bid] [varchar](20) NOT NULL,
	[Filename] [varchar](50) NULL,
	[ContentType] [varchar](255) NULL,
	[Data] [binary](1) NULL
) ON [PRIMARY]



при вставке данных в базу данных cmd.Ошибка метода executenonquery показать
string or binary data would be truncated. the statement has been terminated.
'


string strQuery = "insert into tbStudInfo values(@stdid,@fname,@lname,@address,@city,@pcode,@phno,@cellno,@gender,@emailID,@bdate,@qua,@cID,@fcID,@bid,@Filename,@ContentType,@Data)";       
              
                SqlCommand cmd = new SqlCommand(strQuery, con);

                cmd.Parameters.Add("@stdid", SqlDbType.VarChar ,50).Value = txtStID.Text;
                cmd.Parameters.Add("@fname", SqlDbType.VarChar ,50).Value = txtFname.Text;
                cmd.Parameters.Add("@lname", SqlDbType.VarChar,50).Value = txtLname.Text;
                cmd.Parameters.Add("@address", SqlDbType.VarChar,50).Value = txtAdd.Text;
                cmd.Parameters.Add("@city", SqlDbType.VarChar, 50).Value = txtCity.Text;
                cmd.Parameters.Add("@pcode", SqlDbType.BigInt).Value = Convert.ToInt64(txtPcode.Text);
              //  cmd.Parameters.AddWithValue("@phno", int.Parse(txtPhno.Text));
                //cmd.Parameters.AddWithValue("@cellno", int.Parse(txtCell.Text));
                cmd.Parameters.Add("@phno", SqlDbType.VarChar, 50).Value = txtPhno.Text;
                cmd.Parameters.Add("@cellno", SqlDbType.VarChar,50).Value =txtCell.Text;
                cmd.Parameters.Add("@gender", SqlDbType.VarChar,10).Value = RadioButtonList1.SelectedItem.Text;
                cmd.Parameters.Add("@emailID", SqlDbType.VarChar,50).Value = txtMailID.Text;
                cmd.Parameters.Add("@bdate", SqlDbType.VarChar,50).Value = "";
                cmd.Parameters.Add("@qua", SqlDbType.VarChar,50).Value = txtQua.Text;
                cmd.Parameters.Add("@cID", SqlDbType.VarChar,50).Value = tecourse;
                cmd.Parameters.Add("@fcID", SqlDbType.VarChar,50).Value = teFaculty;
                cmd.Parameters.Add("@bid", SqlDbType.VarChar,20).Value = cmbBacthID.SelectedItem.ToString();
                cmd.Parameters.Add("@Filename", SqlDbType.VarChar,50).Value = filename;
                cmd.Parameters.Add("@ContentType", SqlDbType.VarChar,50).Value = contenttype;
                cmd.Parameters.Add("@Data", SqlDbType.Binary).Value = bytes;
                cmd.ExecuteNonQuery();


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

информация о студенте вставка данных в базу данных

Richard MacCutchan

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

1 Ответов

Рейтинг:
11

OriginalGriff

Ваша таблица почти полностью состоит из NVARCHAR(50) - единственными исключениями являются BIGINT и однобайтовый двоичный столбец - и это проблема.
Вы заметили, что это проблема, потому что один из элементов данных, передаваемых в SQL Server, слишком велик: либо строка длиннее 50 символов, либо байтовые данные имеют длину два или более байта. Вы не можете исправить это: вам нужно либо изменить свой код для проверки ваших входных данных, либо изменить свою БД, либо и то, и другое - что является лучшим решением!

When you store everything in strings, you give yourself huge problems later because string manipulation is not SQL's forte - it's much, much better at manipulating data! And when you just dump data into a DB as strings regardless of it's content, you cause yourself a huge amount of work down the line. For example, your date field. That's not a value date, so anything you try to do with it later - like work out the users age - needs to take into account empty strings, which SQL is poor at. Course ID is almost certainly a number, and should match an existing course. But you just dump the user entry in there as if it was - so later when you try to use it, it doesn't work because your data is bad and it;'s far, far too late to fix it!

Измените свою БД таким образом, чтобы значения хранились в соответствующих форматах: даты в поле DATE, DATETIME или DATETIME2, целые числа в поле INT и так далее. Двоичные данные должны сказать, насколько они могут быть большими, или лучше использовать VARBINARY(MAX), Если вы не уверены.

И проверяйте свои пользовательские входные данные, преобразуя их в "правильные значения", используя соответствующие методы TryParse в верхней части вашего метода, и сообщайте о проблемах вместо того, чтобы продолжать работу. Затем передайте преобразованное значение в качестве параметров SQL, чтобы оно поместилось в соответствующие типизированные столбцы!

Проверьте свои данные как можно больше, прежде чем вставлять их: как только они окажутся в БД, уже слишком поздно их исправлять!