我有一个更新某些记录的程序。当我执行它时,我得到以下异常
"字符串或二进制数据将被截断。\ 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)
在Cql代码中指定SqlDBType.Varchar中的varchar大小,该代码与存储过程中指定的大小相匹配,例如。
cmd.Parameters.Add("@CALLING_NAME", SqlDbType.VarChar, 50).Value = callingName;
对应于存储过程中的参数@CALLING_NAME VARCHAR(50)
。
这可确保在传递给存储过程时不会超出大小。
如果没有为string参数指定length,则ADO.NET将获取可能超过存储过程VARCHAR参数中指定的指定大小的任意长度值。
同样在前端,确保在文本框中输入的字符数不超过相应的参数大小。
这可以使用MaxLength
属性完成,或者如果大小超过则使用JQuery / Javascript提示用户输入消息。
执行其他参数并检查。
答案 1 :(得分:0)
当您尝试插入高于列的指定大小的值时,会显示指定的错误"String or binary data would be truncated.\r\nThe statement has been terminated."
。当我们查看给定的过程时,我们无法识别每列的大小,所以如果你用你给出的值交叉检查列的大小会更好。
我可以说@GENDER
可能会导致类似的问题,因为它在过程中被定义为@GENDER CHAR(1),
但是您正在为该方法添加一个字符串并将其作为SqlDbType.VarChar
传递给它你必须将值作为char。对于这个特定的领域
答案 2 :(得分:-1)
String or binary data would be truncated
错误告诉您正在丢失数据。关于此错误的烦人的事情之一是,它不会告诉您问题与哪一列相关,并且在这种情况下(具有很多列),很难诊断。
请注意,对于每一列,C#变量中都有一个值,声明的参数类型(在C#代码和存储的proc中)以及表中列的大小(其定义从问题-可以解释为什么还没有被接受的答案)。对于所有列,所有这些最大长度和类型都需要捆绑在一起。您确实需要检查所有这些内容。但是我们都喜欢快捷方式,所以...
查找哪一列出现问题的提示是找到发生这种情况的场景,以便您可以轻松地重复进行此操作-如果您对此方法进行了单元测试,则这样做特别容易。现在,修改存储的proc以注释掉一半的列,然后重试。
现在,您已经确定了哪些列有问题,请对照存储的proc参数定义,C#参数定义和C#变量中的值检查表中的每列定义。您可能需要一直追溯到在用户界面中输入值的位置,并确保已设置适当的限制以防止该值太大。
作为一个提示,我喜欢进行单元测试,使我的参数大小与它们相关的列的类型和大小相对应。我还具有代表每个字符串字段的最大长度和数字字段的最大值的常量。这些常量已针对数据库中的列进行了单元测试,并在限制用户在用户界面中提供的值时使用。该方法的单元测试也可以使用它们,以证明为每列插入最大可能的值实际上是可行的。