在存储过程中使用内部联接时,在c#中的多个表中显示数据网格上的数据

时间:2012-08-13 09:34:44

标签: c# sql-server join stored-procedures datagridview

我在C#中编写代码,我希望从具有关系的多个表中选择数据网格中的数据。我有一个Client& Item_Configuration作为父表,Item_Order作为子表,具有ClientItem_Configuration表的外键。我只想从所有三个表中获取数据并显示在数据网格上。

我的存储过程是:

ALTER PROC [dbo].[Full_SP]
    @clientName varchar(50) = null,
    @itemName varchar(50) = null,
    @clientId_FK varchar(50) = null,
    @operation int
AS
BEGIN
    SET NOCOUNT ON;

    IF @operation = 2
    BEGIN
        SELECT 
            Client.clientName, Item_Configuration.itemName,
            Item_Order.orderId, Item_Order.orderDate, 
            Item_Order.Quantity, Item_Order.status, Item_Order.totalPrice      
        FROM
            Item_Order 
        INNER JOIN
            Client ON Item_Order.clientId_FK = Client.clientId
        JOIN
            Item_Configuration ON Item_Order.itemId_FK = Item_Configuration.itemId
    END
END

我搜索数据网格的功能是在C#中,即

private void btnSrchFull_Click(object sender, EventArgs e)
{
    SqlConnection conn1 = new SqlConnection();

    try
    {
        conn1.ConnectionString = "server=.\\ms2k5;database=Info_Connect;Trusted_Connection=true";
        conn1.Open();

        SqlCommand selectFull = new SqlCommand("Full_SP", conn1);
        selectFull.CommandType = CommandType.StoredProcedure;

        selectFull.Parameters.Add("@operation", SqlDbType.VarChar);
        selectFull.Parameters["@operation"].Value = 2;

        SqlDataReader myReader = selectFull.ExecuteReader();

        List<FullFill> list = new List<FullFill>();

        while (myReader.Read())
        {
                if (myReader.HasRows)
                {
                    FullFill fullfill = new FullFill();
                    fullfill = MapFullfill(myReader, fullfill);
                    list.Add(fullfill);
                }
            }

            myReader.NextResult();

            foreach (FullFill ffll in list)
            {
                if (myReader.Read() && myReader.HasRows)
                {

                    MapClint(myReader, ffll);
                }
            }

            myReader.NextResult();

            foreach (FullFill ffll1 in list)
            {
                if (myReader.Read() && myReader.HasRows)
                {
                    MapItem(myReader, ffll1);
                }
            }

            dataGridView1.DataSource = list;
            double totPrice = 0;

            for (int i = 0; i < dataGridView1.RowCount; i++)
            {
                totPrice = totPrice +
                Convert.ToDouble(dataGridView1.Rows[i].Cells[5].Value);
                totCost.Text = totPrice.ToString();
            }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.StackTrace + MessageBoxIcon.Error);
    }
    finally
    {
        if (conn1.State != ConnectionState.Closed)
        {
            conn1.Close();
        }
    }
}

private FullFill MapItem(SqlDataReader myReader, FullFill itemName)
{
    itemName.ItemName =myReader["itemName"].ToString();
    return itemName;
}

private FullFill MapClient(SqlDataReader myReader, FullFill clientName)
{
    clientName.ClientName = myReader["clientName"].ToString();
    return clientName;
}

private FullFill MapFullfill(SqlDataReader myReader, FullFill fullfill)
{
    fullfill.OrderNo = myReader["orderId"].ToString();

    fullfill.OrderDate = Convert.ToDateTime(myReader["orderDate"]);
    fullfill.Quantity = Convert.ToInt32(myReader["Quantity"]);
    fullfill.Status = myReader["status"].ToString();
    fullfill.TotalPrice = Convert.ToDouble(myReader["totalPrice"]);
    return fullfill;
}

我创建了一个属性类,即

class FullFill
{
    public string orderNo;
    public string clientName;
    public DateTime orderDate;
    public string itemName;
    public int quantity;
    public double totCost;
    public string status;

    public string OrderNo 
    { 
        get { return orderNo; } 
        set { orderNo = value; } 
    }

    public string ClientName 
    { 
        get { return clientName; } 
        set { clientName = value; } 
    }

    public DateTime OrderDate 
    { 
        get { return orderDate; } 
        set { orderDate = value; } 
    }

    public string ItemName 
    {
        get { return itemName; } 
        set { itemName = value; } 
    }

    public int Quantity 
    { 
        get { return quantity; } 
        set { quantity = value; } 
    }

    public double TotalPrice 
    { 
        get { return totCost; } 
        set { totCost = value; } 
    }

    public string Status 
    { 
         get { return status; } 
         set { status = value; } 
    }
}

问题是我只能从子表中找到数据(Item_Order)我没有从父表中获取数据

2 个答案:

答案 0 :(得分:0)

也许更容易在SQL中创建view并在其上运行存储过程(select),您可以轻松地显示所有内容。

答案 1 :(得分:0)

我只是编辑MapFullFill()函数的一些代码。使用我在MapClint()和MapItem()中编写的代码,因为只有一个查询返回所有记录,因此不需要nextResult()函数。