哪应该怎么办呀!怎么设计?还有,在C#做web程序的时候,有没有Delphi中启用本地缓存的概念,在C#是怎么实现的呀?

解决方案 »

  1.   

    根据设计模式的mvc原则,你“把采购单设计成一个类,把在采购单上需要实现的方法,做这个类的过程”是不合适的。你可以建一个“采购单”类,只包含数据,再建个“采购单控制类”,专门用于存贮,修改采购单的数据!
      

  2.   

    举个很简单的例子,一个采购单,主表上有一个字段BillID(单号),从表上有三个字段NOid(自增字段),ResID(商品编号),BillID(单号),这个采购单需要实现新建、保存、打开、删除。怎么设计?(这里有一个问题需要注意就是在保存以前单号是没有的,只有保存以前才可以生成,因为单号要是连续的,不能重复,这就是我为什么问能不能启用本地缓存的原因)。嘻嘻
      

  3.   

    楼主可以看看Duwamish7.0里面的定单处理过程,里面的购物车操作也很经典,向数据库提交的时候是用的存储过程,看了如果有什么疑问可以再来问我。。
      下面就是产生一笔定单的存储过程,大家注意SET XACT_ABORT ON ,这就是事务处理。
         ALTER PROCEDURE InsertOrderDetailsByList
        @OrderId        INT,
        @ItemIdList     NVARCHAR(4000) = NULL,
        @QuantityList   NVARCHAR(4000) = NULL,
        @PriceList      NVARCHAR(4000) = NULL
    AS
        SET NOCOUNT ON    DECLARE @Length INT
        DECLARE @FirstItemIdWord NVARCHAR(4000)
        DECLARE @FirstQuantityWord NVARCHAR(4000)
        DECLARE @FirstPriceWord NVARCHAR(4000)
        DECLARE @ItemId INT
        DECLARE @Quantity INT
        DECLARE @Price MONEY
        
        SELECT @Length = DATALENGTH(@ItemIdList)    WHILE @Length > 0
        BEGIN
            EXECUTE @Length = PopFirstWord @ItemIdList OUTPUT, @FirstItemIdWord OUTPUT
            EXECUTE PopFirstWord @QuantityList OUTPUT, @FirstQuantityWord OUTPUT
            EXECUTE PopFirstWord @PriceList OUTPUT, @FirstPriceWord OUTPUT        IF @Length > 0
            BEGIN
                SELECT @ItemId = CONVERT(INT, @FirstItemIdWord)
                SELECT @Quantity = CONVERT(INT, @FirstQuantityWord)
                SELECT @Price = CONVERT(MONEY, @FirstPriceWord)            EXECUTE InsertOrderDetail @OrderId, @ItemId, @Price, @Quantity
            END 
        END
      

  4.   

    你应该去看看Duwamish7.0 的定单操作,很经典。在向数据库提交的时候用的存储过程,下面是添加定单的主存储过程。你看看。
    ALTER PROCEDURE InsertOrderDetailsByList
        @OrderId        INT,
        @ItemIdList     NVARCHAR(4000) = NULL,
        @QuantityList   NVARCHAR(4000) = NULL,
        @PriceList      NVARCHAR(4000) = NULL
    AS
        SET NOCOUNT ON    DECLARE @Length INT
        DECLARE @FirstItemIdWord NVARCHAR(4000)
        DECLARE @FirstQuantityWord NVARCHAR(4000)
        DECLARE @FirstPriceWord NVARCHAR(4000)
        DECLARE @ItemId INT
        DECLARE @Quantity INT
        DECLARE @Price MONEY
        
        SELECT @Length = DATALENGTH(@ItemIdList)    WHILE @Length > 0
        BEGIN
            EXECUTE @Length = PopFirstWord @ItemIdList OUTPUT, @FirstItemIdWord OUTPUT
            EXECUTE PopFirstWord @QuantityList OUTPUT, @FirstQuantityWord OUTPUT
            EXECUTE PopFirstWord @PriceList OUTPUT, @FirstPriceWord OUTPUT        IF @Length > 0
            BEGIN
                SELECT @ItemId = CONVERT(INT, @FirstItemIdWord)
                SELECT @Quantity = CONVERT(INT, @FirstQuantityWord)
                SELECT @Price = CONVERT(MONEY, @FirstPriceWord)            EXECUTE InsertOrderDetail @OrderId, @ItemId, @Price, @Quantity
            END 
        END
      

  5.   

    哎,网速慢,发重了。下面是添加从表的存储过程。上面的 Execute InsertOrderDetail
    就是调用下面的。
    ALTER PROCEDURE InsertOrderDetail
        @OrderId    INT = NULL,
        @ItemId     INT = NULL,
        @UnitPrice  MONEY = NULL,
        @Quantity   INT = NULL
    AS
        SET NOCOUNT ON    -- INSERT OrderItems INFORMATION
        INSERT OrderItems (OrderId,
                           ItemId,
                           UnitPrice,
                           Quantity)    SELECT @OrderId,
               @ItemId,
               @UnitPrice,
               @Quantity    RETURN 0另外 PopFirstWord 就是将用‘,’连接的子表数据分割开,然后一条一条执行Execute InsertOrderDetail
    //分割函数
    LTER PROCEDURE PopFirstWord
        @SourceString   NVARCHAR(4000) = NULL OUTPUT,
        @FirstWord      NVARCHAR(4000) = NULL OUTPUT
    AS
        SET NOCOUNT ON    DECLARE @Oldword        NVARCHAR(4000)
        DECLARE @Length         INT
        DECLARE @CommaLocation  INT    SELECT @Oldword = @SourceString    IF NOT @Oldword IS NULL
        BEGIN
            SELECT @CommaLocation = CHARINDEX(',',@Oldword)
            SELECT @Length = DATALENGTH(@Oldword)        IF @CommaLocation = 0
            BEGIN
                SELECT @FirstWord = @Oldword
                SELECT @SourceString = NULL            RETURN @Length
            END        SELECT @FirstWord = SUBSTRING(@Oldword, 1, @CommaLocation -1)
            SELECT @SourceString = SUBSTRING(@Oldword, @CommaLocation + 1, @Length - @CommaLocation)        RETURN @Length - @CommaLocation
        END    RETURN 0
      

  6.   

    你需要好好看看Duwamish ,里面讲的很详细在看看它的实体类,就是强类型化数据集 OrderData,在看看是如何形成一笔定单的过程。。
      

  7.   

    修改的时候可以把数据由数据库提出来,然后填充强类型化数据集,数据集里面有主表和从表的数据,修改完后直接Update(OrderData,OrderData.Table[主表]);
          然后再Update(OrderData,OrderData.Tables[从表]);
      在想SqlDataAdapter.UpdateCommand 传参数的时候直接写个存储过程就行了,然后把数据利用分割符传入就OK。