2

在我的应用程序中显示来自 SQL 数据库的数据时出现性能问题。问题是我需要显示大量参数(客户个人数据、他当前的统计数据等)。

到目前为止,我已经使用了SqlCommand.ExecuteScalar(对于单个参数)或DataTable.Rows[].ItemArray.GetValue()(对于多个参数 - 我使用其查询从数据库中提取必要数据的 DataTable 填充SqlDataAdapter)并将它们的值分配给适当的控件。假设该命令是 SqlCommand 类型:

对于单个参数

command.CommandText = "SELECT Parameter1 FROM MyTable WHERE Condition = Value";
 textBox1.Text = command.ExecuteScalar().ToString();

对于多个参数(SDA 是一个 SqlDataAdapter):

command.CommandText="SELECT Parameter1 - ParameterN FROM MyTable WHERE Condition = Value";
 SDA.SelectCommand = command;
 SDA.Fill(MyDataTable);
 textBox1.Text = MyDataTable.Rows[0].ItemArray.GetValue(0).ToString();
 comboBox1.Text = MyDataTable.Rows[0].ItemArray.GetValue(1).ToString();
/*
I repeat similar lines of code for each parameter and display it in the appropriate control.
*/

这种方法可以正常工作,但是当我有大量参数(20+)时,它的工作速度非常慢。

有没有更有效的方法来显示这些数据量,我将如何实现它?

谢谢

4

2 回答 2

2

对于第二个示例,SqlDataReader 可能会执行得更好,因为您只需读取一次值,而使用 DataAdapter,您需要加载 DataTable 然后循环遍历表的行(有效地读取数据两次)。

command.CommandText="SELECT Field1,...,FieldN FROM MyTable WHERE Condition = Value";
SqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
    // Of course this works correctly just if your query returns one row....
    textBox1.Text = reader.GetString(0);
    comboBox1.Text = reader.GetString(n);
}

您也可以尝试使用Field<T>DataRow 的扩展名

command.CommandText="SELECT Field1,...,FieldN FROM MyTable WHERE Condition = Value";
SqlDataAdapter SDA = new SqlDataAdapter(command);
SDA.Fill(MyDataTable);
textBox1.Text = MyDataTable.Rows[0].Field<string>("Field1");
comboBox1.Text = MyDataTable.Rows[0].Field<string>("FieldN");

但是,我认为真正的性能提升在于您提交给数据库引擎的查询以及表上索引的正确工作。尝试检索尽可能少的行数,搜索索引字段和/或更改为存储过程。

于 2013-05-07T09:10:45.813 回答
0

在这里,我编写了示例存储过程,您可以了解...

您可以以 xml 格式传递 amny 参数并插入到临时表中...

现在你有值名称/值对的表意味着参数名称/值....

现在你可以做你的进一步工作......

    /*
    EXEC wa_TempGetDaya '<SampleXML>
    <tblXML><AccountID>3</AccountID><Code>11</Code><Description>Leptospiral infect NEC</Description></tblXML> 
    </SampleXML>'
    */
    CREATE PROCEDURE  wa_TempGetDaya
    (   
        @ParaXML NVARCHAR(MAX)  
    )  
    AS  
    SET NOCOUNT ON

    BEGIN

        DECLARE @AccountID INT
        DECLARE @MyXML XML
        SET @MyXML = @ParaXML  

        IF OBJECT_ID('tempdb..#TempData') IS NOT NULL
        DROP TABLE #TempData 

        SELECT * INTO #TempData 
        FROM (
               SELECT
                   Parse.value('(AccountID)[1]', 'INT') AS 'AccountID',
                   Parse.value('(Code)[1]', 'Varchar(100)') AS 'Code',
                   Parse.value('(Description)[1]', 'varchar(1000)') AS 'Description'
                FROM
                   @MyXML.nodes('/SampleXML/tblXML') AS YourData(Parse) 
              ) AS tbl



  declare @para1 varchar(20)
    declare @para2 varchar(20)
    declare @para3 varchar(20)


SELECT @para1 =AccountID ,@para2 =Code,@para3 =Description from #TempICD

    END
于 2013-05-07T09:11:33.580 回答