错误:c#业务层表中列的值为DBNull
本文关键字:DBNull 业务 错误 | 更新日期: 2023-09-27 18:07:50
我使用Visual studio 2010和SQL SERVER management studio 2008 R2
我有一个表Order,它引用了表Booking
CREATE TABLE [Order]
(OrderNumber int IDENTITY (1,1) NOT NULL PRIMARY KEY,
CustNumber int FOREIGN KEY REFERENCES Customer(CustNumber),
EmpNumber int FOREIGN KEY REFERENCES Employee(EmpNumber),
OrderDate date,
Deliver char,
StatusID int FOREIGN KEY REFERENCES [Status] (StatusID),
BookingNumber int FOREIGN KEY REFERENCES Booking(BookingNumber),
TotalAmount float,
OutstandingAmount float);
GO
CREATE TABLE Booking
(BookingNumber int IDENTITY (1,1) NOT NULL PRIMARY KEY,
BookingDate datetime,
BookingTime datetime,
StatusID int FOREIGN KEY REFERENCES [Status](StatusID),
CustNumber int FOREIGN KEY REFERENCES Customer(CustNumber),
EmpNumber int FOREIGN KEY REFERENCES Employee(EmpNumber)
);
GO
我也有一个类Order和ClassList OrderList继承自orderClass
public class Order
{
public int OrderNumber { set; get;}
public int CustNumber { set; get;}
public int EmpNumber { set; get;}
public DateTime OrderDate { set; get;}
public char Deliver { set; get;}
public int StatusID { set; get;}
public int BookingNumber { set; get; }
public float TotalAmount { set; get;}
public float OutstandingAmount { set; get; }
public Order()
{
OrderNumber = 0;
CustNumber = 0;
EmpNumber = 0;
OrderDate = DateTime.Today;
Deliver = ' ';
StatusID = 0;
BookingNumber = 0;
TotalAmount = 0;
OutstandingAmount = 0;
}
public Order(int a, int b, int c, DateTime d, char e,int f, int g, float h, float i)
{
OrderNumber = a;
CustNumber = b;
EmpNumber = c;
OrderDate = d;
Deliver = e;
StatusID = f;
BookingNumber = g;
TotalAmount = h;
OutstandingAmount = i;
}
namespace EAMS_BusinessTier
{
public class OrderList : System.ComponentModel.BindingList <Order>
{private EAMS_DBDataSetTableAdapters.OrderTableAdapter OrderTA = new EAMS_DBDataSetTableAdapters.OrderTableAdapter();
private EAMS_DBDataSet ds = new EAMS_DBDataSet();
/////////// Read OrderList //////////////////////////
public OrderList()
{
OrderTA.FillbyOrder(ds.Order);
foreach (EAMS_DBDataSet.OrderRow r in ds.Order.Rows)
{
Order m = new Order(r.OrderNumber,r.CustNumber,r.EmpNumber,r.OrderDate,Convert.ToChar(r.Deliver),r.StatusID,r.BookingNumber,Convert.ToInt32(r.TotalAmount),Convert.ToInt32(r.OutstandingAmount));
this.Add(m);
}
}
public OrderList(int id)
{
OrderTA.FillbyOrder(ds.Order);
foreach (EAMS_DBDataSet.OrderRow r in ds.Order.Rows)
{
if (id == r.OrderNumber)
{
Order m = new Order(r.OrderNumber, r.CustNumber, r.EmpNumber, r.OrderDate, Convert.ToChar(r.Deliver), r.StatusID, r.BookingNumber, Convert.ToInt32(r.TotalAmount), Convert.ToInt32(r.OutstandingAmount));
this.Add(m);
}
}
}
/////END////
///////////////////// get OrderList ////////////////////////
public OrderList getOrderList()
{
return this;
}
public OrderList getOrderList(int id)
{
OrderList t = new OrderList(id);
return t;
}
////END////
///////////////////// Save Order ////////////////////////
public void SaveOrder()
{
EAMS_DBDataSet.BankDataTable temp = new EAMS_DBDataSet.BankDataTable();
foreach (Order r in this)
{
EAMS_DBDataSet.OrderRow nr = ds.Order.NewOrderRow();
nr.OrderNumber = r.OrderNumber;
nr.CustNumber = r.CustNumber;
nr.EmpNumber = r.EmpNumber;
nr.OrderDate = r.OrderDate;
nr.Deliver = Convert.ToString(r.Deliver);
nr.StatusID = r.StatusID;
nr.BookingNumber = r.BookingNumber;
nr.TotalAmount = r.TotalAmount;
nr.OutstandingAmount = r.OutstandingAmount;
temp.Rows.Add(nr.ItemArray);
}
ds.Order.Merge(temp, false);
foreach (EAMS_DBDataSet.OrderRow r in ds.Order.Rows)
if (r.RowState == DataRowState.Unchanged)
{
r.Delete();
}
OrderTA.Update(ds.Order);
}
////END////
//////////////// Insert Order //////////////////////////////
public void InsertOrder(int a, int b, int c, DateTime d, char e, int f,int g,float h,float i)
{
Order m = new Order(a, b, c, d, e, f, g, h, i);
this.Add(m);
}
////END////
/////////////////Delete Order /////////////////////////
public void DeleteOrder(int del)
{
int i = 0;
int d = -1;
foreach (Order r in this)
{
if (r.OrderNumber == del)
{
d = i;
}
i++;
}
if (d > -1)
{
this.RemoveAt(d);
}
}
////END////
/////////////// Update Order ///////////////////////
public void UpdateOrder(int a, int b, int c, DateTime d, char e, int f, int g, float h, float i)
{
Order r = new Order(a, b, c, d, e, f, g, h, i);
foreach (Order nr in this)
{
if (r.OrderNumber == nr.OrderNumber)
{
nr.OrderNumber = r.OrderNumber;
nr.CustNumber = r.CustNumber;
nr.OrderDate = r.OrderDate;
nr.Deliver = r.Deliver;
nr.StatusID = r.StatusID;
nr.BookingNumber = r.BookingNumber;
nr.TotalAmount = r.TotalAmount;
nr.OutstandingAmount = r.OutstandingAmount;
break;
}
}
}
////END////
不是每个订单都有预订号,所以在order表中预订号可能为空值。
当我尝试在构建业务层并连接到OrderList Data对象后加载表示层中的OrderList时,会发生错误。下面是我用来从表示层加载OrderList的代码
using EAMS_BusinessTier;
namespace DXApplication2
{
public partial class Form5 : Form
{
public Form5()
{
InitializeComponent();
}
internal OrderList OrderLis = new OrderList();
private void Form5_Load(object sender, EventArgs e)
{
orderListBindingSource.DataSource = OrderLis;
}
当我试图在运行时加载OrderList时,我一直得到这个错误"在表'Order'列'BookingNumber'的值是DBNull."我如何处理这个错误?
提前感谢
更改订单类型。BookingNumber从int到Nullable<int>
。或者只是int?
验证EDM。表Order中的字段BookingNumber必须允许为空。
改变Order m = new Order(r.OrderNumber,r.CustNumber,r.EmpNumber,r.OrderDate,Convert.ToChar(r.Deliver),r.StatusID,r.BookingNumber,Convert.ToInt32(r.TotalAmount),Convert.ToInt32(r.OutstandingAmount));
:
Order m = new Order(r.OrderNumber,r.CustNumber,r.EmpNumber,r.OrderDate,Convert.ToChar(r.Deliver),r.StatusID,(int?)r.BookingNumber,Convert.ToInt32(r.TotalAmount),Convert.ToInt32(r.OutstandingAmount));