Как решить «Строковые или двоичные данные будут обрезаны. \ R \ nОперация была прервана». Ошибка?

2

У меня есть процедура, которая обновляет некоторые записи. Когда я его выполню, я получаю следующее исключение

"Строковые или двоичные данные будут усечены.\R\nПриложение завершено".

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

Вот мой код для обновления

            bool isFinished = dba.update(desingnation, title, initials, surname, fullname, callingName, civilSatatus, natinality, nic, birthday, passport,
                                          hometp, mobiletp, province, district, division, electorate, gramaNiladhari, takafull, p_city,
                                          c_city, p_hno, c_hno, tokens_P, tokens_C, previousEmployeements, bank, branch, type, account, gender, educatinalQ, languageE, languageS, languageT, empNo, appNo);
            if (isFinished)
            {
                WebMsgBox.Show("Successfully Inserted!");
            }
            else
            {
                WebMsgBox.Show("Some Errors Occured");
            }
        }
        else
        {
            WebMsgBox.Show("Some feilds are not valid");
        }
    }
}              

Это код для передачи параметров хранимым процедурам

            try
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Connection = connection;
                    cmd.CommandTimeout = 0;
                    cmd.Transaction = transactions;

                    /*=======================Update employee details================================*/
                    cmd.CommandText = "update_HS_HR_EMPLOYEE_AADM";

                    cmd.Parameters.Add("@appNo", SqlDbType.Int).Value = appNo;
                    cmd.Parameters.Add("@CALLING_NAME", SqlDbType.VarChar).Value = callingName;
                    cmd.Parameters.Add("@INITIALS", SqlDbType.VarChar).Value = initials;
                    cmd.Parameters.Add("@SURNAME", SqlDbType.VarChar).Value = surname;
                    cmd.Parameters.Add("@TITLE", SqlDbType.VarChar).Value = title;
                    cmd.Parameters.Add("@NAME", SqlDbType.VarChar).Value = fullname;
                    cmd.Parameters.Add("@FULLNAME", SqlDbType.VarChar).Value = fullname + " " + surname;
                    cmd.Parameters.Add("@NIC", SqlDbType.VarChar).Value = nic;
                    cmd.Parameters.Add("@BDY", SqlDbType.VarChar).Value = birthday;
                    cmd.Parameters.Add("@GENDER", SqlDbType.VarChar).Value = gender;
                    cmd.Parameters.Add("@NATIONALITY", SqlDbType.VarChar).Value = natinality;
                    cmd.Parameters.Add("@CIVILSTATUS", SqlDbType.VarChar).Value = civilSatatus;
                    cmd.Parameters.Add("@DESIGNATION", SqlDbType.VarChar).Value = desingnation;
                    cmd.Parameters.Add("@P_ADD1", SqlDbType.VarChar).Value = p_hno;
                    cmd.Parameters.Add("@P_ADD2", SqlDbType.VarChar).Value = tokens_P[0];

                    if (tokens_P.Length > 1)
                        cmd.Parameters.Add("@P_ADD3", SqlDbType.VarChar).Value = tokens_P[1];
                    else
                        cmd.Parameters.Add("@P_ADD3", SqlDbType.VarChar).Value = "";

                    cmd.Parameters.Add("@P_CITY", SqlDbType.VarChar).Value = p_city;
                    cmd.Parameters.Add("@TP_HOME", SqlDbType.VarChar).Value = hometp;
                    cmd.Parameters.Add("@TP_MOBILE", SqlDbType.VarChar).Value = mobiletp;
                    cmd.Parameters.Add("@PROVINCE", SqlDbType.VarChar).Value = province;
                    cmd.Parameters.Add("@DISTRICT", SqlDbType.VarChar).Value = district;
                    cmd.Parameters.Add("@C_ADD1", SqlDbType.VarChar).Value = c_hno;
                    cmd.Parameters.Add("@C_ADD2", SqlDbType.VarChar).Value = tokens_C[0];
                    cmd.Parameters.Add("@PER_GNDIV_CODE", SqlDbType.VarChar).Value = gramaNiladhari;
                    cmd.Parameters.Add("@PER_DSDIV_CODE", SqlDbType.VarChar).Value = division;
                    cmd.Parameters.Add("@TAKAFUL", SqlDbType.VarChar).Value = takafull;
                    cmd.Parameters.Add("@PASSPORT_NO", SqlDbType.VarChar).Value = passport;

                    if (tokens_C.Length > 1)
                        cmd.Parameters.Add("@C_ADD3", SqlDbType.VarChar).Value = tokens_C[1];
                    else
                        cmd.Parameters.Add("@C_ADD3", SqlDbType.VarChar).Value = "";

                    cmd.Parameters.Add("@C_CITY", SqlDbType.VarChar).Value = c_city;
                    cmd.Parameters.Add("@ELECTORATE", SqlDbType.VarChar).Value = electorate;

                    //int appNO = int.Parse((cmd.ExecuteScalar().ToString()));
                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();         


  }     
}         

Это хранимая процедура

ALTER PROCEDURE [dbo].[update_HS_HR_EMPLOYEE_AADM] 
@appNo Int,
@CALLING_NAME VARCHAR(50),
@INITIALS VARCHAR(50),
@SURNAME VARCHAR(50),
@TITLE VARCHAR(50),
@NAME VARCHAR(50),
@FULLNAME VARCHAR(100),
@NIC VARCHAR(15),
@BDY VARCHAR(50),
@GENDER CHAR(1),
@NATIONALITY VARCHAR(50),
@CIVILSTATUS VARCHAR(50),
@DESIGNATION VARCHAR(50),
@P_ADD1 VARCHAR(50),
@P_ADD2 VARCHAR(50),
@P_ADD3 VARCHAR(50),
@P_CITY VARCHAR(50),
@TP_HOME VARCHAR(50),
@TP_MOBILE VARCHAR(50),
@PROVINCE VARCHAR(50),
@DISTRICT VARCHAR(50),
@C_ADD1 VARCHAR(50),
@C_ADD2 VARCHAR(50),
@C_ADD3 VARCHAR(50),
@C_CITY VARCHAR(50),
@ELECTORATE VARCHAR(50),
@PER_GNDIV_CODE VARCHAR(50),
@PER_DSDIV_CODE VARCHAR(50),
@TAKAFUL VARCHAR(50),
@PASSPORT_NO VARCHAR(50)

AS

BEGIN

update [HS_HR_EMPLOYEE_AADM]
SET
       [EMP_CALLING_NAME]=@CALLING_NAME
       ,[EMP_MIDDLE_INI]=@INITIALS
       ,[EMP_SURNAME]=@SURNAME
       ,[EMP_TITLE]=@TITLE
       ,[EMP_NAMES_BY_INI]=@NAME
       ,[EMP_FULLNAME]=@FULLNAME
       ,[EMP_NIC_NO]=@NIC
       ,[EMP_BIRTHDAY]=@BDY
       ,[EMP_GENDER]=@GENDER
       ,[NAT_CODE]=@NATIONALITY
       ,[EMP_MARITAL_STATUS]=@CIVILSTATUS
       ,[EMP_DATE_JOINED]=GETDATE()
       ,[EMP_CONFIRM_FLG]=0
       ,[CT_CODE]='000008'
       ,[DSG_CODE]=@DESIGNATION
       ,[CAT_CODE]='000001'
       ,[EMP_PER_ADDRESS1]=@P_ADD1
       ,[EMP_PER_ADDRESS2]=@P_ADD2
       ,[EMP_PER_ADDRESS3]=@P_ADD3
       ,[EMP_PER_CITY]=@P_CITY
       ,[EMP_PER_TELEPHONE]=@TP_HOME
       ,[EMP_PER_MOBILE]=@TP_MOBILE
       ,[EMP_PER_PROVINCE_CODE]=@PROVINCE
       ,[EMP_PER_DISTRICT_CODE]=@DISTRICT
       ,[EMP_TEM_ADDRESS1]=@C_ADD1
       ,[EMP_TEM_ADDRESS2]=@C_ADD2
       ,[EMP_PER_ELECTORATE_CODE]=@ELECTORATE
       ,[EMP_TEM_ADDRESS3]=@C_ADD3
       ,[EMP_TEM_CITY]=@C_CITY
       ,[EMP_PER_GNDIV_CODE]=@PER_GNDIV_CODE
       ,[EMP_PER_DSDIV_CODE]=@PER_DSDIV_CODE
       ,[EMP_PASSPORT_NO]=@TAKAFUL
       ,[EMP_TAK]=@PASSPORT_NO
       where App_no = @appNo

END
  • 0
    Не могли бы вы удалить ненужные коды
  • 0
    @ не повезло, я удалил некоторые коды, которые берут данные из текстовых полей и все. Пожалуйста, взгляните
Теги:
sql-server
stored-procedures

3 ответа

0

Указанная ошибка: "String or binary data would be truncated.\r\nThe statement has been terminated." показывает, когда вы пытаетесь вставить значение, превышающее заданный размер столбца. Когда мы изучаем данную процедуру, мы не можем определить размеры каждого столбца. Поэтому было бы лучше, если вы перекрестите размеры размеров столбцы со значениями, которые вы даете.

Я могу сказать, что @GENDER может вызвать аналогичную проблему, поскольку в процедуре она определена как @GENDER CHAR(1), но вы берете строку для метода и передаете ее как SqlDbType.VarChar вместо этого вы должны SqlDbType.VarChar значение как символ. для этого конкретного поля

  • 0
    Я попробовал, но ничего не изменилось
  • 0
    сравните каждое поле и значения, которые вы передаете, и убедитесь, что вы передаете правильные значения
0

Укажите размер varchar в SqlDBType.Varchar в коде С#, соответствующем размеру, указанному в хранимой процедуре, например.

cmd.Parameters.Add("@CALLING_NAME", SqlDbType.VarChar, 50).Value = callingName;

соответствующий параметру @CALLING_NAME VARCHAR(50) в хранимой процедуре. Это гарантирует, что размер не будет превышен при передаче в хранимую процедуру.

Если длина длины не указана для строкового параметра, ADO.NET выбирает значение арбитальной длины, которое может превышать размер, указанный в параметрах VARCHAR хранимых процедур.

Также на переднем конце убедитесь, что количество символов, вводимых в текстовые поля, не превышает соответствующий размер параметров. Это может быть сделано с использованием атрибута MaxLength или запроса пользователя с сообщением с использованием JQuery/Javascript, если размер превышает.

Сделайте это для других параметров и проверьте.

-1

String or binary data would be truncated ошибка говорит вам, что вы теряете данные. Одна из неприятных особенностей этой ошибки заключается в том, что она не сообщает вам, к каким столбцам относится проблема, и в подобном сценарии (с большим количеством столбцов) ее сложно диагностировать.

Обратите внимание, что для каждого столбца есть значение в переменной С#, объявленный тип параметра (как в коде С#, так и в хранимой процедуре) и размер столбца в таблице (определение которого отсутствует в вопросе - что может объяснить, почему пока нет принятого ответа). Все эти максимальные длины и типы должны быть связаны для всех столбцов. Вам действительно нужно проверить их все; но мы все любим ярлыки, так что...

Мой совет по нахождению проблемы в каких столбцах состоит в том, чтобы найти сценарий, в котором это происходит, чтобы вы могли легко повторить его - это особенно легко сделать, если у вас есть модульное тестирование этого метода. Теперь измените сохраненный процесс, чтобы закомментировать половину столбцов, и повторите попытку.

  • Если это работает, то вы знаете, что без комментариев столбцы в порядке (для этого конкретного набора данных), и проблема была в одном из столбцов, который был закомментирован, поэтому раскомментируйте половину строк и повторите попытку.
  • Если это не сработало, то проблема в столбцах без комментариев, поэтому закомментируйте половину оставшихся столбцов и повторите попытку.
  • Повторяйте, пока не решите, какие столбцы имеют проблемы. Я говорю "столбцы", потому что, хотя проблема может быть только в одном столбце, их может быть больше.
  • Теперь верни все как было, когда ты начал.

Теперь, когда вы выяснили, какие столбцы имеют проблемы, проверьте каждое определение столбца в таблице по сохраненному определению параметра proc, определению параметра С# и значению в переменной С#. Возможно, вам придется проследить это до того момента, когда значение было введено в пользовательском интерфейсе, и убедиться, что установлены соответствующие ограничения, чтобы предотвратить слишком большое значение.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню