无法插入包含 Simple.Data 的记录

Cannot insert a record with Simple.Data

我正在使用 Simple.Data,在尝试 运行 下面的代码时,我在最后一行收到以下错误: 'System.ArgumentException' 类型的未处理异常发生在 System.Core.dll.

    var db = Database.OpenConnection(ConnectionString);
    var product = db.DimDistrict.FindByDistrict("HOUSE");
    //db.FunnelQuotes.Insert(
    //    Company: funnelQuotes[0].Company,
    //    Opportunity: funnelQuotes[0].Opportunity,
    //    QuoteNumber: funnelQuotes[0].QuoteNumber,
    //    QuotedPrice: funnelQuotes[0].QuotedPrice);
    IList<FunnelQuote> retrows = db.FunnelQuotes.Insert(funnelQuotes).ToList();

请注意,注释掉的代码有效。

编辑:添加了 Class 定义

class FunnelQuote
{
    public string Company { get; set; }
    public string Opportunity { get; set; }
    public string QuoteNumber { get; set; }
    public float QuotedPrice { get; set; }
}

因为我找不到为什么这不起作用,我最终只是在 foreach 循环中一次插入一条记录。但是,我发现了问题的根源。这是因为字段大小太小,例如,我在数据库中有一个字段的 NVARCHAR(10) 数据类型,但其中一行的字段超过 10 个字符。事实证明,foreach 循环只是通过截断字段来隐藏错误。所以我想我会根据您的插入方式指出 Simple.Data 的行为。

  1. 使用命名参数插入(如果按对象插入,我假设它是相同的):不会抛出错误,如果文本字段太长则会被截断。

    db.FunnelQuotes.Insert(
        Company: funnelQuotes[0].Company,
        Opportunity: funnelQuotes[0].Opportunity,
        QuoteNumber: funnelQuotes[0].QuoteNumber,
        QuotedPrice: funnelQuotes[0].QuotedPrice
    );
    
  2. 多插入而不将结果分配给变量:System.InvalidOperationException 抛出一个 InnerException,告诉您 "String or binary data would be truncated."

    db.Quotes.Insert(funnelQuotes);
    
  3. 多插入,将结果分配给列表,如 Simple.Data 文档所示:抛出 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException。详细信息是 "Cannot perform runtime binding on a null reference"。但是,在这种情况下,数据仍会被插入!任何太长的字符串字段都将被截断

    List<FunnelQuote> retrows = db.Quotes.Insert(funnelQuotes).ToList();