我试图从数据库中获取一些信息并在DataGrid中显示它,但获取信息的速度很慢,因为我从多个表中获取数据。我需要加快速度。以下是我的数据库表的结构
TestPack (Id, test_pack_no, train_no, .....)
Sheet (id, **testPackId**, sheet_no, ....)
Spool (id, **sheetId**, spool_no, bore_size, ....)
FieldJoint(id, **spoolId**, thickness, size, ...)
以下是创建FieldJoints列表的代码(一个包含Testpack,Sheet,Spool和FIeldJoint等必填字段的自定义类)。
foreach (var tp in allTestPacks)
{
foreach (var sheet in tp.Sheets)
{
foreach (var spool in sheet.Spools)
{
foreach (var joint in spool.FieldJoints)
{
var newJoint = new FieldJoint
{
TestPackNo = tp.test_pack_no,
TrainNo = tp.train_no,
IsometricNo = spool.sheet_no,
SpoolNo = spool.spool_no,
BoreSize = spool.bore_size,
Thickness = joint.joint_thickness.Value,
JointSize = joint.joint_size.Value,
};
_fieldJointsInfo.Add(newJoint);
}
}
}
}
我相信如果我可以创建一个直接在托管数据库的服务器上运行的存储过程,它将加快性能。如何将上面的代码转换为一个存储过程,该过程将输入一个字符串" trainNo"并返回基于该trainNo的所有上述信息,这是TestPack表中的一列。
答案 0 :(得分:1)
如果我理解正确,您想要阅读相关数据。你没有显示所有的代码,但是在嵌套的for循环中读取数据听起来像是痛苦的......
这样的功能怎么样?
CREATE FUNCTION dbo.GetTestPackDetails
(
@TrainNo VARCHAR(100)
)
RETURNS TABLE
AS
RETURN
SELECT tp.Id AS TestPackId
,tp.test_pack_no
,tp.train_no
,sh.id AS SheetId
,sh.sheet_no
,sp.id As SpoolId
,sp.spool_no,sp.bore_size
,fj.id AS FieldJointId
,fj.thikness
,fj.size
--add more columns...
FROM TestPack AS tp
INNER JOIN Sheet AS sh ON tp.Id=sh.testPackId
INNER JOIN Spool AS sp ON sh.id=sp.sheetId
INNER JOIN FieldJoint AS fj ON sp.id=fj.spoolId
WHERE tp.train_no=@TrainNo;
你可以用
来调用它SELECT * FROM dbo.GetTestpackDetails('TheTrainNo');
在C#中,您可以直接从此函数创建一个类型化的DataSet。
顺便说一下:我不仅使用存储过程读取数据。 SP意味着做某事......