我正在使用ASP.NET Web窗体并尝试从SQL Server加载数据。这是关于我如何做的伪代码:
connect1 = connect("database")
categories = connect.query("select * from category")
loop categories as category
print category
connect2 = connect("database")
subCategories = connect2.query("select * from subCategory where category = @0", category)
loop subCategories as subCategory
print subCategory
connect3 = connect("database")
items = connect3.query("select * from item where subCategory = @0", subCategory)
loop items as item
print item
end loop 'items
connect3.close
end loop 'subcategories
connect2.close
end loop 'categories
connect1.close
正如你所看到的,我的脚本中有很多往返行程,当我只有很少的记录时这很好,但是当处理数百或更多时,这需要永远显示数据。
我可以做些什么来减少往返次数?我想从数据库中一次获取所有数据,然后在应用程序端对它们进行分类,但这可能吗?
答案 0 :(得分:2)
为什么不通过一个带有连接的查询获得所需的所有数据,然后在客户端进行过滤;或者你可以做的其他方式(它没有太多数据)将数据作为xml获取,将其反序列化为可迭代的迭代。
我认为你做了
categories = connect.query("select * from category");
所以你需要的只是:
whole_data = connect.query("select * from category c inner join subCategory sc on c.id = sc.id inner join item i on i.id = si.id") /*or some kind of*/
/*let me think that whole_data is a list of objects, not a dataset*/
categories = whole_data.Distinct(d => d.category);
subCategories = whole_data.Distinct(d => d.subCategories);
/*and then do your loops*/
用于手动映射的c#代码可能是这样的:
using (var connection = new SqlConnection(connString))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = "select * from ...";
var reader = command.ExecuteReader();
while (reader.Read())
{
var a = reader.GetInt32(0);
var b = reader.GetString(1);
/*so basically you read all fields that you get from DB and build object here, then you add it to List or any other kind of collection*/
}
}
答案 1 :(得分:1)
根据数据库的延迟,即使合并,建立连接也需要很长时间。为了避免这种问题,请在循环外部进行所有连接。也就是说,不要嵌套连接。相反,结构如下:
Connect1 = connect("database")
Connect2 = connect("database")
Connect3 = connect("database")
sql 1 nest
sql 2 nest
sql 3 nest
end nest
end nest
end nest
close connections.
如果每个循环有10个条目,并且连接需要10毫秒,那么只需要10 x 10 x 10 = 1000 mS即可进行连接。把它们带到巢外,然后你只用30 mS就可以了。在每个嵌套完成时关闭datareader,以便重用连接。
当然,对于您展示的示例,执行单个查询是最佳解决方案。 但是,如果您的查询是有选择性的,并且您需要执行一些无法在查询中组合的业务逻辑,那么请始终将您的连接移到循环之外。