2016-10-27 3 views
0

Ich habe eine Datentabelle in meinem Dataset verhindern, dass diese Felder hat:Kann keinen bindenden Fehler

enter image description here

und ich habe ein WPF-Fenster auf diese Felder, die die Anwender Daten in Kontrollen entsprechen. Die Kontrollen an einen datarow gebunden sind wie folgt:

DataContext = myApp.Tables("VehicleExpenses").NewRow 

Wenn ich das Formular zur Laufzeit lade ich diesen Fehler:

System.InvalidCastException was unhandled by user code 
HResult=-2147467262 
Message=Conversion from type 'DBNull' to type 'Long' is not valid. 

und das ist die Zeile, die den Fehler auslöst (dies wird erzeugt Code):

Return CType(Me(Me.tableVehicleExpenses.CategoryIDColumn),Long) 

So ist der Fehler offensichtlich, aber ich habe keine Ahnung, wie VB zu verhindern, einen Nullwert aus der neuen Reihe ziehen. Ich habe versucht, einen blockierenden Konverter zu schreiben und UpdateSourceTrigger = Explicit zu setzen, aber keiner löst das Problem.

+0

Ist es Nullable? Versuchen Sie 'Return CType (Me (Me.tableVehicleExpenses.CategoryIDColumn), Long?)' – djv

+0

Und Sie sind sicher, dass es in dieser Spalte keinen Nullwert gibt? – Searching

+0

@Verdoline Das ist generierter Code, nicht etwas, das ich geschrieben habe, also bin ich SEHR widerwillig darin, dort herumzuspielen. Nein, CategoryID ist nicht nullbar und sollte es nicht sein. Das ist ein Pflichtfeld. – SezMe

Antwort

1

--update 1--

Lassen Sie sich von Dataset und dieses Modell nicht zu verwechseln. Diese mittlere Schicht dient der Benutzerinteraktion und der Validierung. Das Speichern von Daten in db erfolgt in 2 stages. Sie benötigen weiterhin die automatisch generierten Eigenschaften und Methoden für CRUD Operationen.

diese Möglichkeit Stellen (dies ist C#)

public class Vehicle 
    { 
     public int VehId{get;set;} 
     public Vehicle(){} 
     public bool SaveToDb() 
     { 
      MyDataSet myDataSet = new MyDataSet(); 
      myDataSet.VehicleExpenses newVehRow = myDataSet.VehicleExpenses.NewVehicleExpensesRow(); 
      newVehRow.VehId = this.VehId; 
      myDataSet.VehicleExpenses.Rows.Add(newVehRow); 
      // Save the new row to the database 
      myDataSet.Update(this.myDataSet.VehicleExpenses); 

     } 
    } 

die Zeile mit, die direkt im tableNull Wert Löschen (falls vorhanden). Die DataTable.NewRow erstellt eine neue DataRow mit column Standardwerte (da nichts übergeben wird). Nicht sicher, warum es nicht Standardwert als 0-Einstellung für die Nicht-Nullable-Spalte

diese Option Versuchen statt myApp.Tables("VehicleExpenses").NewRow wenn möglich

'declare a VehicleExpenses in the form (you might have to create this class) 
Dim blankMo As VehicleExpenses 

' in Form_load() set this object with new VehicleExpenses and against Datacontext 
blankMo = New VehicleExpenses() 
DataContext = blankMo 

Sie benötigen einen separaten hinzufügen Speichern-Button und Funktion, um dieses Modell zu begehen Details zur Datenbank.

Lassen Sie uns wissen ..

+0

Das Feld kann nur "DBNull" sein, wenn die Spalte die Eigenschaft AllowNulls = true hat. Sonst wäre es der Standardwert von Long: 0. – djv

+1

Absolut. Ich denke, dass der Aufbau des Datensatzes eine gute Idee sein könnte. – Searching

+0

@Verdolino Ich glaube nicht, dass das stimmt. Man legt den Standardwert eines Feldes auf der Eigenschaftenseite fest. Der Standardwert aller Felder, unabhängig von der Eigenschaft AllowNulls, lautet SezMe