C# 为什么我的DBML将varchar(8000)发送到InsertOnSbumit上的数据库?

C# 为什么我的DBML将varchar(8000)发送到InsertOnSbumit上的数据库?,c#,sql-server-2008,dbml,C#,Sql Server 2008,Dbml,我的dbml中有一个非常直接的表,有几个varchar(20)和两个varchar(50)列: 以下是我的dbml的xml定义: <?xml version="1.0" encoding="utf-8"?> <Database Name="AppraisalsLenderX" Class="AppraisalsLenderXDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007"

我的dbml中有一个非常直接的表,有几个varchar(20)和两个varchar(50)列:

以下是我的dbml的xml定义:

        <?xml version="1.0" encoding="utf-8"?>
<Database Name="AppraisalsLenderX" Class="AppraisalsLenderXDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
      <Connection Mode="AppSettings" ConnectionString="Data Source=emdb.gr-stage.com;Initial Catalog=AppraisalsLenderX;User ID=LenderXSQLUser" SettingsObjectName="GuaranteedRate.Appraisal.Infrastructure.Data.Properties.Settings" SettingsPropertyName="AppraisalsLenderXConnectionString" Provider="System.Data.SqlClient" />
      <Table Name="dbo.LenderXMessage" Member="LenderXMessages">
        <Type Name="LenderXMessage">
          <Column Name="LenderXMessageID" Type="System.Int32" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
          <Column Name="EventType" Type="System.String" DbType="VarChar(50) NOT NULL" CanBeNull="false" />
          <Column Name="EventID" Type="System.String" DbType="VarChar(50) NOT NULL" CanBeNull="false" />
          <Column Name="AppraisalOrderID" Type="System.String" DbType="VarChar(20) NOT NULL" CanBeNull="false" />
          <Column Name="LoanNumber" Type="System.String" DbType="VarChar(20) NOT NULL" CanBeNull="false" />
          <Column Name="OrderStatus" Type="System.String" DbType="VarChar(20) NOT NULL" CanBeNull="false" />
          <Column Name="LoanOfficerEmailAddress" Type="System.String" DbType="VarChar(20)" CanBeNull="true" />
        </Type>
      </Table>
    </Database>
            using (AppraisalsLenderXDataContext db = new AppraisalsLenderXDataContext(ConfigurationManager.ConnectionStrings["AppraisalsLenderX"].ConnectionString))
        {
            LenderXMessage message = new LenderXMessage();
            message.EventType = lxEvent.EventType;
            message.EventID = lxEvent.EventID;
            message.AppraisalOrderID = lxEvent.LXData.AppraisalOrder.AppraisalOrderID;
            message.LoanNumber = lxEvent.LXData.AppraisalOrder.LXAppFile.LoanNumber;
            message.OrderStatus = lxEvent.LXData.AppraisalOrder.OrderStatus;
            message.LoanOfficerEmailAddress = lxEvent.LXData.AppraisalOrder.LoanOfficerInfo.LoanOfficerAccount;
            db.LenderXMessages.InsertOnSubmit(message);
            try
            {
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                log.Error($"Error attempting to insert a record into AppraisalsLenderX database ... StackTrace: {ex.ToString()}");
            }
        }
    }
    exec sp_executesql N'INSERT INTO [dbo].[LenderXMessage]([LenderXMessageID], [EventType], [EventID], [AppraisalOrderID], [LoanNumber], [OrderStatus], [LoanOfficerEmailAddress])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6)',N'@p0 uniqueidentifier,@p1 varchar(8000),@p2 varchar(8000),@p3 varchar(8000),@p4 varchar(8000),@p5 varchar(8000),@p6 varchar(8000)',@p0='00000000-0000-0000-0000-000000000000',@p1='Event.Appraisal.Request.DatesSet',@p2='311AED46-7689-11E8-B8A0-2CEE6AEAE87B',@p3='248422',@p4='161481439',@p5='in_progress',@p6='testloanofficer@aaa.com'
System.Data.SqlClient.SqlException (0x80131904): String or binary data would be truncated.
问题:为什么在我提交changes()时,它会将其发送到SQL引擎:

        <?xml version="1.0" encoding="utf-8"?>
<Database Name="AppraisalsLenderX" Class="AppraisalsLenderXDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
      <Connection Mode="AppSettings" ConnectionString="Data Source=emdb.gr-stage.com;Initial Catalog=AppraisalsLenderX;User ID=LenderXSQLUser" SettingsObjectName="GuaranteedRate.Appraisal.Infrastructure.Data.Properties.Settings" SettingsPropertyName="AppraisalsLenderXConnectionString" Provider="System.Data.SqlClient" />
      <Table Name="dbo.LenderXMessage" Member="LenderXMessages">
        <Type Name="LenderXMessage">
          <Column Name="LenderXMessageID" Type="System.Int32" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
          <Column Name="EventType" Type="System.String" DbType="VarChar(50) NOT NULL" CanBeNull="false" />
          <Column Name="EventID" Type="System.String" DbType="VarChar(50) NOT NULL" CanBeNull="false" />
          <Column Name="AppraisalOrderID" Type="System.String" DbType="VarChar(20) NOT NULL" CanBeNull="false" />
          <Column Name="LoanNumber" Type="System.String" DbType="VarChar(20) NOT NULL" CanBeNull="false" />
          <Column Name="OrderStatus" Type="System.String" DbType="VarChar(20) NOT NULL" CanBeNull="false" />
          <Column Name="LoanOfficerEmailAddress" Type="System.String" DbType="VarChar(20)" CanBeNull="true" />
        </Type>
      </Table>
    </Database>
            using (AppraisalsLenderXDataContext db = new AppraisalsLenderXDataContext(ConfigurationManager.ConnectionStrings["AppraisalsLenderX"].ConnectionString))
        {
            LenderXMessage message = new LenderXMessage();
            message.EventType = lxEvent.EventType;
            message.EventID = lxEvent.EventID;
            message.AppraisalOrderID = lxEvent.LXData.AppraisalOrder.AppraisalOrderID;
            message.LoanNumber = lxEvent.LXData.AppraisalOrder.LXAppFile.LoanNumber;
            message.OrderStatus = lxEvent.LXData.AppraisalOrder.OrderStatus;
            message.LoanOfficerEmailAddress = lxEvent.LXData.AppraisalOrder.LoanOfficerInfo.LoanOfficerAccount;
            db.LenderXMessages.InsertOnSubmit(message);
            try
            {
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                log.Error($"Error attempting to insert a record into AppraisalsLenderX database ... StackTrace: {ex.ToString()}");
            }
        }
    }
    exec sp_executesql N'INSERT INTO [dbo].[LenderXMessage]([LenderXMessageID], [EventType], [EventID], [AppraisalOrderID], [LoanNumber], [OrderStatus], [LoanOfficerEmailAddress])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6)',N'@p0 uniqueidentifier,@p1 varchar(8000),@p2 varchar(8000),@p3 varchar(8000),@p4 varchar(8000),@p5 varchar(8000),@p6 varchar(8000)',@p0='00000000-0000-0000-0000-000000000000',@p1='Event.Appraisal.Request.DatesSet',@p2='311AED46-7689-11E8-B8A0-2CEE6AEAE87B',@p3='248422',@p4='161481439',@p5='in_progress',@p6='testloanofficer@aaa.com'
System.Data.SqlClient.SqlException (0x80131904): String or binary data would be truncated.
注意到varchar(8000)了吗? 我当然会遇到这个错误:

        <?xml version="1.0" encoding="utf-8"?>
<Database Name="AppraisalsLenderX" Class="AppraisalsLenderXDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
      <Connection Mode="AppSettings" ConnectionString="Data Source=emdb.gr-stage.com;Initial Catalog=AppraisalsLenderX;User ID=LenderXSQLUser" SettingsObjectName="GuaranteedRate.Appraisal.Infrastructure.Data.Properties.Settings" SettingsPropertyName="AppraisalsLenderXConnectionString" Provider="System.Data.SqlClient" />
      <Table Name="dbo.LenderXMessage" Member="LenderXMessages">
        <Type Name="LenderXMessage">
          <Column Name="LenderXMessageID" Type="System.Int32" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
          <Column Name="EventType" Type="System.String" DbType="VarChar(50) NOT NULL" CanBeNull="false" />
          <Column Name="EventID" Type="System.String" DbType="VarChar(50) NOT NULL" CanBeNull="false" />
          <Column Name="AppraisalOrderID" Type="System.String" DbType="VarChar(20) NOT NULL" CanBeNull="false" />
          <Column Name="LoanNumber" Type="System.String" DbType="VarChar(20) NOT NULL" CanBeNull="false" />
          <Column Name="OrderStatus" Type="System.String" DbType="VarChar(20) NOT NULL" CanBeNull="false" />
          <Column Name="LoanOfficerEmailAddress" Type="System.String" DbType="VarChar(20)" CanBeNull="true" />
        </Type>
      </Table>
    </Database>
            using (AppraisalsLenderXDataContext db = new AppraisalsLenderXDataContext(ConfigurationManager.ConnectionStrings["AppraisalsLenderX"].ConnectionString))
        {
            LenderXMessage message = new LenderXMessage();
            message.EventType = lxEvent.EventType;
            message.EventID = lxEvent.EventID;
            message.AppraisalOrderID = lxEvent.LXData.AppraisalOrder.AppraisalOrderID;
            message.LoanNumber = lxEvent.LXData.AppraisalOrder.LXAppFile.LoanNumber;
            message.OrderStatus = lxEvent.LXData.AppraisalOrder.OrderStatus;
            message.LoanOfficerEmailAddress = lxEvent.LXData.AppraisalOrder.LoanOfficerInfo.LoanOfficerAccount;
            db.LenderXMessages.InsertOnSubmit(message);
            try
            {
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                log.Error($"Error attempting to insert a record into AppraisalsLenderX database ... StackTrace: {ex.ToString()}");
            }
        }
    }
    exec sp_executesql N'INSERT INTO [dbo].[LenderXMessage]([LenderXMessageID], [EventType], [EventID], [AppraisalOrderID], [LoanNumber], [OrderStatus], [LoanOfficerEmailAddress])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6)',N'@p0 uniqueidentifier,@p1 varchar(8000),@p2 varchar(8000),@p3 varchar(8000),@p4 varchar(8000),@p5 varchar(8000),@p6 varchar(8000)',@p0='00000000-0000-0000-0000-000000000000',@p1='Event.Appraisal.Request.DatesSet',@p2='311AED46-7689-11E8-B8A0-2CEE6AEAE87B',@p3='248422',@p4='161481439',@p5='in_progress',@p6='testloanofficer@aaa.com'
System.Data.SqlClient.SqlException (0x80131904): String or binary data would be truncated.

为什么?我不得不修剪来自xml规范的字符串:

[XmlRoot("event")]
public class LenderXEvent
{
    [XmlElement("type")]
    public string EventType { get; set; }
    [XmlElement("id")]
    public string EventID { get; set; }
    [XmlElement("data")]
    public LenderXData LXData { get; set; }
}
我正在发送到数据库。它现在起作用了。以下是更新的代码:

    using (AppraisalsLenderXDataContext db = new AppraisalsLenderXDataContext(ConfigurationManager.ConnectionStrings["AppraisalsLenderX"].ConnectionString))
{
    LenderXMessage message = new LenderXMessage();
    message.EventType = lxEvent.EventType.Substring(0, lxEvent.EventType.Length);
    message.EventID = lxEvent.EventID.Substring(0, lxEvent.EventID.Length);
    message.AppraisalOrderID = lxEvent.LXData.AppraisalOrder.AppraisalOrderID.Substring(0, lxEvent.LXData.AppraisalOrder.AppraisalOrderID.Length);
    message.LoanNumber = lxEvent.LXData.AppraisalOrder.LXAppFile.LoanNumber.Substring(0, lxEvent.LXData.AppraisalOrder.LXAppFile.LoanNumber.Length);
    message.OrderStatus = lxEvent.LXData.AppraisalOrder.OrderStatus.Substring(0, lxEvent.LXData.AppraisalOrder.OrderStatus.Length);
    message.LoanOfficerEmailAddress = lxEvent.LXData.AppraisalOrder.LoanOfficerInfo.LoanOfficerAccount.Substring(0, lxEvent.LXData.AppraisalOrder.LoanOfficerInfo.LoanOfficerAccount.Length);
    message.DateCreated = DateTime.Now;
    db.LenderXMessages.InsertOnSubmit(message);
    try
    {
        db.SubmitChanges();
    }
    catch (Exception ex)
    {
        log.Error($"Error attempting to insert a record into AppraisalsLenderX database ... StackTrace: {ex.ToString()}");
    }
}

感谢@mjwillis的回答。

您的
[dbo].[LenderXMessage]
表真的接受varchar(8000)吗?正如您所说,您的表设置了
几个varchar(20)和2个varchar(50)列
字符串或二进制数据将被截断。
忽略8000。这不是你问题的原因。该错误的原因是您传递的一个值太长,无法放入数据库。我认为您是对的@mjwills,我修剪了字符串,现在我没有收到错误。我会回答我自己的问题,但是,谢谢<代码>lxEvent.LXData.evaluationOrder.OrderStatus.Substring(0,lxEvent.LXData.evaluationOrder.OrderStatus.Length)与
lxEvent.LXData.evalumatalorder.OrderStatus
相同(因为如果长度为500,则要求的是前500个字符,即整个字符串)。这一改变不可能有帮助。这就是@mjwills修复它的原因。对不起,它不可能有。一定是别的什么改变了。或者您只是开始发送与该更改无关的较小数据。