解决方案 »

  1.   

    http://baike.baidu.com/link?url=AsP6npW_cg1gWOGy_V-E1Xzt-uWN5Ld0V3kooQAmgv8THbqCQ7Ijgg47zLBO0y8Tf1tN62twCWtoFmdhyjWRxq你需要定期实盘,记下期出库存,盘盈/盘亏数,剩下滴则实时计算
      

  2.   

    按照数据库设计,要有表
    型号表(基本数据表)
    出入库表(履历表),内含型号表主键
    库存表(保存当前库存状态),内含型号表主键在入库的时候,先查询 型号表 是否有要入库的型号,没有的话就插入一条型号记录,同时插入一条库存记录。
    有的话找出 库存表 对应的型号库存,更改之。
    在数据库中查询存不存在,采用Select Count(1) From....Where ...或者使用if exists...,效率还是比较高的,楼主说使用List遍历,List里面的入库单的多个型号数据吗?那就这样吧。最好写存储过程。因为型号表和库存表的记录数基本一致(一个型号一条库存),而且型号信息简单(只有一个名称信息)的话,型号表也可以不用。
    那查询存不存在就得查 库存表
      

  3.   

    每次入库都新增一条数据。
    出库修改数据状态。你需要的只是统计上做group by而已。
      

  4.   

    当然需要先select,然后才决定是update还是insert。如果你能够让SQL Server研发项目组把Update和Insert语句合并成一条新的Upsert语句,那你就“不麻烦”了。否则,你当然需要把这三条语句写在一个事务中。写3条语句就嫌麻烦,你也太懒啦。库存需要大量进行查询,一个程序中有成千上万其它行为需要频繁查询库存数量和库存成本(大多数是要求移动加权平均成本),因此每一次查询都把所有历史明细“统计一遍”这是不显示的。查询库存账时,不做任何计算,直接查询出结果!因此需要实时库存数量和库存成本。
      

  5.   


    楼主做的是简单的库存管理。
    在实际中,库存统计要展示的内容多、形式也多,什么图表曲线分类的,所以实际是不查询库存表(Stock)的,建立出入库履历表,记录每次出入库的信息,录入的时候只做插入操作,查询的时候查询出入库履历表。
    然后定期盘点,形成盘点表,在数据量大时可直接采用盘点节点。数据量再大还要备份分库。
      

  6.   


    楼主做的是简单的库存管理。
    在实际中,库存统计要展示的内容多、形式也多,什么图表曲线分类的,所以实际是不查询库存表(Stock)的,建立出入库履历表,记录每次出入库的信息,录入的时候只做插入操作,查询的时候查询出入库履历表。
    然后定期盘点,形成盘点表,在数据量大时可直接采用盘点节点。数据量再大还要备份分库。
    这是第一次做仓管系统,完全自己的想法,就没想那么深。软件需求也是经理嫌我平时闲着没事建议做做的,
      

  7.   

    这样库存就完全没有安全性与稳定性可言拉啊
    多条就不安全,放到一条记录里就安全?谁告诉你的,该打.
    你要做的不过是入库的时候直接插入一条记录,出库的时候需要select,,group by,看是否有足够的库存可以出库,避免总量变成负数
    而允许出库的时候,出库其实也insert一条,设置个标识字段表示一下到底是出库还是入库
    查询的时候累加一下就完了,sum(入库)-sum(出库)
    这样还能看清每一笔出入库的量和时间
      

  8.   

    我使用VS2013写的,在调试的时候是单线程运行,可以正常操作,但是单独运行程序的时候,是多线程运行的,这是会出现一种情况,就是在软件读取或写入一张数据表的过程中,如果另一个表的操作也触发了,那么其就会失效。直接描线的结果就是第二张表修改失败。这个需要如何解决呢?
    你要使用多线程,就要使用多个数据库连接对象,不要用同一个全局对象或静态对象
    每太明白啊,就局下面的语句为例子吧,读取STOCKINFO是成功的,可是往SOCK插入的时候就会失败,这是为什么呢?string connStr = @"server=.;database=NETSHARE;uid=sa;pwd=1";
                SqlConnection conn = new SqlConnection(connStr);
                conn.Open();
                SqlCommand com = new SqlCommand();
                com.Connection = conn;            List<StockData> sdlist = new List<StockData>();            com.CommandText = "select * from [stockinfo] where stockid='" + textBox1.Text + "'";
                SqlDataReader sdr = com.ExecuteReader();
                while (sdr.Read())
                {
                    StockData sd = new StockData();
                    sd.Version = sdr[1].ToString();
                    sd.Quantity = sdr.GetInt32(3);
                    sdlist.Add(sd);
                }
                sdr.Close();            int Quantity = 0;
                foreach (StockData sid in sdlist)
                {          
                    com.CommandText = "select * from stock where Version='" + sid.Version + "'";
                    int i = Convert.ToInt32(com.ExecuteScalar());
                    if (i != 0)
                    {
                        SqlDataReader sdrt = com.ExecuteReader();
                        Quantity = sdrt.GetInt32(2) + sid.Quantity;
                        sdrt.Close();
                        com.CommandText = "updata stock set Quantity = @Quantity";
                        com.Parameters.AddWithValue("@Quantity", Quantity);
                        com.ExecuteNonQuery();
                    }
                    else
                    {
                        com.CommandText = "insert into stock values(@Version,@Quantity)";  //执行到这里时,程序会不报错执行完毕,但是实际上并没有插入任何数据
                        com.Parameters.Clear();
                        com.Parameters.AddWithValue("@Version", sid.Version);
                        com.Parameters.AddWithValue("@Quantity", sid.Quantity);
                    }
                }
                conn.Close();
      

  9.   

    我使用VS2013写的,在调试的时候是单线程运行,可以正常操作,但是单独运行程序的时候,是多线程运行的,这是会出现一种情况,就是在软件读取或写入一张数据表的过程中,如果另一个表的操作也触发了,那么其就会失效。直接描线的结果就是第二张表修改失败。这个需要如何解决呢?
    你要使用多线程,就要使用多个数据库连接对象,不要用同一个全局对象或静态对象
    每太明白啊,就局下面的语句为例子吧,读取STOCKINFO是成功的,可是往SOCK插入的时候就会失败,这是为什么呢?string connStr = @"server=.;database=NETSHARE;uid=sa;pwd=1";
                SqlConnection conn = new SqlConnection(connStr);
                conn.Open();
                SqlCommand com = new SqlCommand();
                com.Connection = conn;            List<StockData> sdlist = new List<StockData>();            com.CommandText = "select * from [stockinfo] where stockid='" + textBox1.Text + "'";
                SqlDataReader sdr = com.ExecuteReader();
                while (sdr.Read())
                {
                    StockData sd = new StockData();
                    sd.Version = sdr[1].ToString();
                    sd.Quantity = sdr.GetInt32(3);
                    sdlist.Add(sd);
                }
                sdr.Close();            int Quantity = 0;
                foreach (StockData sid in sdlist)
                {          
                    com.CommandText = "select * from stock where Version='" + sid.Version + "'";
                    int i = Convert.ToInt32(com.ExecuteScalar());
                    if (i != 0)
                    {
                        SqlDataReader sdrt = com.ExecuteReader();
                        Quantity = sdrt.GetInt32(2) + sid.Quantity;
                        sdrt.Close();
                        com.CommandText = "updata stock set Quantity = @Quantity";
                        com.Parameters.AddWithValue("@Quantity", Quantity);
                        com.ExecuteNonQuery();
                    }
                    else
                    {
                        com.CommandText = "insert into stock values(@Version,@Quantity)";  //执行到这里时,程序会不报错执行完毕,但是实际上并没有插入任何数据
                        com.Parameters.Clear();
                        com.Parameters.AddWithValue("@Version", sid.Version);
                        com.Parameters.AddWithValue("@Quantity", sid.Quantity);
                    }
                }
                conn.Close();
    额,第四十行没写 com.ExecuteNonQuery();。
    应该这么描述:单步调试没错,但是运行DEBUG里的EXE程序的时候会插入失败。