我在C#中编写代码,我希望从具有关系的多个表中选择数据网格中的数据。我有一个Client
& Item_Configuration
作为父表,Item_Order
作为子表,具有Client
和Item_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)我没有从父表中获取数据
答案 0 :(得分:0)
也许更容易在SQL中创建view并在其上运行存储过程(select),您可以轻松地显示所有内容。
答案 1 :(得分:0)
我只是编辑MapFullFill()函数的一些代码。使用我在MapClint()和MapItem()中编写的代码,因为只有一个查询返回所有记录,因此不需要nextResult()函数。