2016-11-02 6 views
1

Ich verwende Simple.Data und ich erhalte den folgenden Fehler in der letzten Zeile beim Versuch, den folgenden Code auszuführen: Eine nicht behandelte Ausnahme vom Typ 'System.ArgumentException' in System.Core aufgetreten .dll.Kann einen Datensatz mit Simple.Data nicht einfügen

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(); 

Beachten Sie, dass der auskommentierte Code funktioniert.

Edit: Added Class Definition

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

Ich denke, funnelQuotes ist ein falsches Argument für Insert-Methode, – Sebi

+0

Warum würden Sie sagen, dass funnelQuotes das falsche Argument ist? Was soll es dann sein? – jaromey

+0

Weil es das einzige Argument in der fehlerhaften Zeile ist. Ich brauche mehr Informationen, wenn Sie eine bessere Antwort brauchen. Zeigen Sie uns, die FunnelQuotes-Klasse könnte hilfreich sein. – Sebi

Antwort

1

Da ich nicht herausfinden konnte, warum dies nicht funktioniert, landete ich Einfügen von bis nur die Datensätze einen nach dem anderen in einer foreach-Schleife. Ich habe jedoch die Ursache des Problems entdeckt. Es war als ein Ergebnis der Feldgröße, die zu klein ist, z. B. hatte ich einen NVARCHAR (10) -Datentyp in der Datenbank für eines der Felder, aber eine der Zeilen hatte mehr als 10 Zeichen für dieses Feld. Es stellt sich heraus, dass die foreach-Schleife nur den Fehler durch Abschneiden des Feldes versteckt hat. Also dachte ich, ich würde das Verhalten von Simple.Data aufzeigen, abhängig davon, wie Sie Ihre Einfügung machen.

  1. Insert mit benannten Parametern (Ich gehe davon aus ist es das gleiche, wenn Sie mit dem Objekt einfügen): Kein Fehler ausgelöst wird, und das Textfeld abgeschnitten wird, wenn es zu lang ist.

    db.FunnelQuotes.Insert(
        Company: funnelQuotes[0].Company, 
        Opportunity: funnelQuotes[0].Opportunity, 
        QuoteNumber: funnelQuotes[0].QuoteNumber, 
        QuotedPrice: funnelQuotes[0].QuotedPrice 
    ); 
    
  2. Multi-Einsatz ohne Ergebnis einer Variablen zugewiesen: „String oder Binärdaten würden abgeschnitten“ System.InvalidOperationException mit einem Innerexception geworfen wird, der Ihnen sagt, dass

    db.Quotes.Insert(funnelQuotes); 
    
  3. Multi-Insert, das Ergebnis zu einer Liste zuweisen, wie in der Dokumentation Simple.Data gezeigt: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException geworfen wird. Das Detail lautet "Laufzeitbindung für eine Nullreferenz kann nicht ausgeführt werden". In diesem Fall werden jedoch die Daten noch eingefügt! Alle Zeichenfolgenfelder, die zu lang sind, werden abgeschnitten sein.

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