我在应用程序中显示来自SQL数据库的数据时遇到性能问题。问题是,我有大量的参数,我需要显示(客户的个人数据,他的当前统计等)。
到目前为止,我使用了SqlCommand.ExecuteScalar
(单个参数)或DataTable.Rows[].ItemArray.GetValue()
(多个参数-我用SqlDataAdapter
填充DataTable,其查询从数据库中提取必要的数据)并将其值分配给适当的控件。假设命令是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+),它的工作速度非常慢。
是否有更有效的方法来显示这些数据量,我该如何实现它?
谢谢
对于第二个示例,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");
然而,我认为真正的性能增益将是提交给数据库引擎的查询和表上索引的正确工作。尝试检索尽可能少的行数,搜索索引字段和/或更改为存储过程。
这里我写了一个示例存储过程,你可以从中得到想法…
你可以传递尽可能多的参数,你可以在XML格式和插入到临时表…
现在你有一个表的值名称/值对意味着参数名称/值....
现在你可以做你下一步的工作了…
/*
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