字符串或二进制数据将被截断。\r\n语句已终止。c#
我正在尝试将电子邮件添加到表中,但它抛出错误,电子邮件中的值为“prashhanth@oberonit.com". 我在邮件中没有发现任何错误。我添加了其他邮件,但没有添加此邮件 列RemovedEmail为varchar(50),空 “字符串或二进制数据将被截断。字符串或二进制数据将被截断。\r\n语句已终止。c#,c#,sql-server,C#,Sql Server,我正在尝试将电子邮件添加到表中,但它抛出错误,电子邮件中的值为“prashhanth@oberonit.com". 我在邮件中没有发现任何错误。我添加了其他邮件,但没有添加此邮件 列RemovedEmail为varchar(50),空 “字符串或二进制数据将被截断。语句已终止。” 更新 根据布莱德利的要求 完整代码 protected void btnAdd_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(t
语句已终止。” 更新 根据布莱德利的要求 完整代码
protected void btnAdd_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(txtEmails.Text))
{
string txt = txtEmails.Text;
string[] lst = txt.Split(new Char[] { '\n', '\r' },
StringSplitOptions.RemoveEmptyEntries);
string email = string.Empty;
var removedEmail = string.Empty;
using (SqlConnection connection = new SqlConnection(connectionString))
{
var foundEmail = string.Empty;
foreach (string emailStr in lst)
{
email = LastCharFromEmailAddress(emailStr).Replace("\r\n", string.Empty);
var intensifyDb = new IntensifyEntities();
var constultantUser = intensifyDb.ConsultantUsers.FirstOrDefault(x => x.Email == email);
// Delete the item
if (constultantUser != null)
{
intensifyDb.DeleteObject(constultantUser);// Save changes
intensifyDb.SaveChanges();
}
if (!intensifyDb.RemovedEmails.Any(x => x.RemovedEmails == email))
{
RemovedEmail consultant = new RemovedEmail
{
RemovedEmails = email
};
intensifyDb.AddToRemovedEmails(consultant);
intensifyDb.SaveChanges();
}
}
connection.Close();
}
}
}
此异常通常意味着您的db字段没有足够的长度 我建议在调试器中检查这段代码,并检查字符串的实际长度 编辑: 我认为它的额外空间会将sting复制到编辑器中,然后检查并尝试使用.Trim() 如果trim不起作用,可能是一些不可见的Unicode字符 尝试在代码中添加此项:
var debugCheck = string.Join("",
email.Select(c=> String.Format("{0:X2}", Convert.ToInt32(c))))
并将debugCheck的值发送回我,以便我可以检查它
(这将电子邮件值转换为十六进制字符串,这将有助于识别额外的字符,这些字符可能看起来像空格,但它们不是)
更新:
所以这个字符串实际上是(十六进制)707261736868616E7468406F6265726F6E69742E636F6D200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B
200B表示Unicode字符“零宽度空间”(U+200B),您可以使用
.Replace("\u200B", "");
删除所有unicode空白字符的更通用代码:
Regex.Replace(email, @"^[\s,]+|[\s,]+$", "")
此异常通常意味着您的db字段没有足够的长度 我建议在调试器中检查这段代码,并检查字符串的实际长度 编辑: 我认为它的额外空间会将sting复制到编辑器中,然后检查并尝试使用.Trim() 如果trim不起作用,可能是一些不可见的Unicode字符 尝试在代码中添加此项:
var debugCheck = string.Join("",
email.Select(c=> String.Format("{0:X2}", Convert.ToInt32(c))))
并将debugCheck的值发送回我,以便我可以检查它
(这将电子邮件值转换为十六进制字符串,这将有助于识别额外的字符,这些字符可能看起来像空格,但它们不是)
更新:
所以这个字符串实际上是(十六进制)707261736868616E7468406F6265726F6E69742E636F6D200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B
200B表示Unicode字符“零宽度空间”(U+200B),您可以使用
.Replace("\u200B", "");
删除所有unicode空白字符的更通用代码:
Regex.Replace(email, @"^[\s,]+|[\s,]+$", "")
您能告诉我们正在做什么吗?
AddToRemovedEmails
它在问题的底部。varchar(50)
根据错误,我们知道您正在尝试在列中插入或更新一个值,但您尝试插入/更新的值超过了字段的最大长度(以字节为单位)。如果您的字符集是UTF或其他双宽度集,这意味着varchar(50)字段的最大字符串长度实际上是25。请分享更多的代码,例如表模式和AddToRemovedEmails的主体,我们可能会为您提供帮助。只需运行探查器或启用查询跟踪intensifyDb.Database.Log=message=>Trace.Write(message)代码>就在AddToRemoveEmails方法之前。看看电子邮件字段里有什么。说UTF是双倍宽度是很容易误导的。无论如何,数据类型是varchar而不是NVARCHAR。请告诉我们您在做什么,它位于问题的底部。varchar(50)
根据错误,我们知道您正在尝试插入或更新列中的值,但您尝试插入/更新的值超过了最大长度(以字节为单位)字段。如果您的字符集是UTF或其他双倍宽度集,则表示varchar的最大字符串长度(50)字段实际上是25。请共享更多代码,例如表架构和AddToRemovedEmails的正文,我们可能会为您提供帮助。只需运行探查器或启用查询跟踪intensifyDb.Database.Log=message=>Trace.Write(message);
就在AddToReveEmails方法之前。查看email字段中的内容。说UTF是双倍宽度是非常容易误导的。无论如何,数据类型是varchar而不是nvarchar”prashhanth@oberonit.com"少于50个字符。除非有另一个我们看不到的字段溢出,否则会出现其他问题。@BradleyUffner是的,或者您没有发送“prashhanth@oberonit.com"就像你认为的那样,或者列实际上没有你认为的50宽。我不是OP,所以技术上我什么都没有做。Alexander V.是正确的。你引用的错误只有在插入/更新到字段中的数据超过容量时才会发生。@VinceHorst正确与实际之间存在差距为OP的问题提供有用的答案。”prashhanth@oberonit.com少于50个字符。除非有另一个我们看不到的字段溢出,否则会出现其他问题。@BradleyUffner是的,或者您没有发送prashhanth@oberonit.com"就像你认为的那样,或者列实际上没有你认为的50宽。我不是OP,所以技术上我什么都没有做。Alexander V.是正确的。你引用的错误只有在插入/更新到字段中的数据超过容量时才会发生。@VinceHorst正确与实际之间存在差距为OP的问题提供一个有用的答案。