创建一个存储过程以从SQL Server WPF的多个表中选择数据

本文关键字:WPF 数据 选择 Server 一个 存储过程 创建 SQL | 更新日期: 2024-09-24 14:39:25

我试图从数据库中获取一些信息并将其显示在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返回所有上述信息,该trainNo是TestPack表中的一列。

创建一个存储过程以从SQL Server WPF的多个表中选择数据

如果我理解正确,您需要读取相关数据。您并没有显示所有的代码,但在嵌套的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#中,您可以直接从此函数创建类型化数据集。

顺便说一句:我不会使用存储过程来读取数据。SP意味着要做一些事情。。。