我在应用程序中显示来自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+)时,它的工作速度非常慢。
是否有更有效的方式来显示这些数据量,我将如何实现它?
谢谢
答案 0 :(得分: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);
}
您还可以尝试使用DataRow的Field<T>
扩展名
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");
但是,我认为真正的性能提升将在您提交给数据库引擎的查询中以及正确处理表上的索引。 尝试检索可能的最小行数,搜索索引字段和/或更改为存储过程。
答案 1 :(得分:0)
在这里,我已经编写了样本存储过程,您可以了解...
您可以以xml格式传递as 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