Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将查询结果作为产品库存C MS Access内部连接到datagridview_C#_Ms Access_Datagridview - Fatal编程技术网

C# 将查询结果作为产品库存C MS Access内部连接到datagridview

C# 将查询结果作为产品库存C MS Access内部连接到datagridview,c#,ms-access,datagridview,C#,Ms Access,Datagridview,我有两个win表单,一个用于购买,一个用于销售,都可以访问2个Access数据库 我想制作一个库存页面,通过从产品购买中减去产品销售额来显示库存,按产品序列订购,然后将结果发送到DataGridView或Listbox,任何可行的方法都可以 我不知道怎么才能做到这一点 这是我的尝试 OleDbCommand command = new OleDbCommand("SELECT Purchase.InvoiceDate, Purchase.Pname, (Purchase.Pqty - S

我有两个win表单,一个用于购买,一个用于销售,都可以访问2个Access数据库

我想制作一个库存页面,通过从产品购买中减去产品销售额来显示库存,按产品序列订购,然后将结果发送到DataGridView或Listbox,任何可行的方法都可以

我不知道怎么才能做到这一点

这是我的尝试

    OleDbCommand command = new OleDbCommand("SELECT Purchase.InvoiceDate, Purchase.Pname, (Purchase.Pqty - Sales.Pqty) AS I, Purchase.Bcode, Sales.InvoiceDate, Sales.Pname, Sales.Bcode FROM Purchase INNER JOIN Sales ON Purchase.Bcode = Sales.Bcode GROUP By Purchase.Bcode;");
    command.Connection = cn;
    OleDbDataReader dr = null;
    cn.Open();
    dr = command.ExecuteReader();
    while (dr.Read())
    {
        for (int i = 0; i < dataGridView1.Rows.Count; i++)
        {
            dataGridView1.Rows[i].Cells[0].Value = (dr["Bcode"].ToString());
            dataGridView1.Rows[i].Cells[1].Value = (dr["Pname"].ToString());
            dataGridView1.Rows[i].Cells[2].Value = (dr["Sales.Pqty"].ToString());
            dataGridView1.Rows[i].Cells[3].Value = (dr["Purchase.Pqty"].ToString());
            dataGridView1.Rows[i].Cells[4].Value = (dr["I"].ToString());
        }

    }
    cn.Close();

下面是一个示例,它从数据库中获取数据,将其转换为列表,然后将dataGridView与此数据绑定

获取数据并填充列表。商品是DTO,它包含您在DataGrid中需要的所有列:

public List<Goods> GetGoods()
    {
        var result = new List<Goods>();
       var queryString = "SELECT * FROM.... ORDER BY ...";

        using (OleDbConnection connection = new OleDbConnection(connString))
        {
            OleDbDataReader reader = FillReader(connection, queryString);

            while (reader.Read())
            {
                var goods = new Goods();

                goods.GoodsName     = reader["name"].ToString();
                goods.NumberCode    = reader["number"].ToString();

                result.Add(goods);
            }

            reader.Close();
        }

        return result;
    }
private OleDbDataReader FillReader(OleDbConnection connection, string queryString)
{
    OleDbCommand command = new OleDbCommand(queryString, connection);

    OleDbDataReader reader = command.ExecuteReader();

    return reader;
}
规则是-当您使用group by时,您查询的每一列都必须是聚合函数的一部分。 因此,除了那些需要某种其他类型的聚合之外,所有这些都应该在下面的GROUPBY语句中列出。 在您的情况下,您需要知道可用产品的数量。 这是您的采购数量-销售数量。 如果您的产品只有一条购买记录和一条销售记录,并且PQty是最新的,那么您可以删除我放置的计数功能

但我想每次销售都有产品,每次购买都有产品,所以计数是正确的方法

另一个建议是创建Products表,其中您有: 产品ID 产品名称

在销售和购买中,您使用的是ProductId而不是Pname,因为现在您多次重复Pname,这可能会导致错误和无效数据…等等,这是一个很长的过程,检查数据库原则,规范化。。。。
这就是关系数据库的概念。

dataGridView有一个属性DataSource,您应该设置它。是的,请问正确的SQL代码是什么?我之前认为结果是正确的,但显然这是非常错误的尝试上面建议的SQL,可能需要轻微调整,但应该可以工作…如果您得到重复的行,请在选择后添加DISTINCT关键字。非常感谢,我在MS Access中尝试了您的SQL查询,它工作正常,但前提是我在Sales table中有2条记录,除此之外,数字都错了,而且我使用了SUM而不是Count,因为Count给了我行数而不是值对不起,当然Count是错误的,SUM是正确的。伟大的请共享表中的屏幕截图,如果是生产数据,请隐藏数据。这将更好地理解您的表,并可以编写正确的SQL来帮助您。请检查我的答案中的更新SQL。由于存在JOIN,销售总和每次都将返回倍数结果,正如您之前注意到的行一样多,因此我们只对Pname是主查询当前行上的Pname的行求和…您应该看到问题所在,并可以从此处继续。我得走了,祝你好运。
public List<Goods> GetGoods()
    {
        var result = new List<Goods>();
       var queryString = "SELECT * FROM.... ORDER BY ...";

        using (OleDbConnection connection = new OleDbConnection(connString))
        {
            OleDbDataReader reader = FillReader(connection, queryString);

            while (reader.Read())
            {
                var goods = new Goods();

                goods.GoodsName     = reader["name"].ToString();
                goods.NumberCode    = reader["number"].ToString();

                result.Add(goods);
            }

            reader.Close();
        }

        return result;
    }
private OleDbDataReader FillReader(OleDbConnection connection, string queryString)
{
    OleDbCommand command = new OleDbCommand(queryString, connection);

    OleDbDataReader reader = command.ExecuteReader();

    return reader;
}
    SELECT 
Last(Purchase.InvoiceDate) AS LatestPurchaseInvoiceDate, 

Purchase.Pname, 

Sum(Purchase.Pqty)-(SELECT SUM(Sales.Pqty) as SalesQty FROM Sales WHERE Pname = Purchase.Pname  GROUP BY Pname) AS Expr1, 

Last(Sales.InvoiceDate) AS LatestSalesInvoiceDate, 

Sales.Pname

    FROM Purchase INNER JOIN Sales ON Purchase.Pname = Sales.Pname
    GROUP BY Purchase.Pname, Sales.Pname;