错误: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."我如何处理这个错误?

提前感谢

错误:c#业务层表中列的值为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));