当我调用此代码时:
using (var connection = new SqlConnection(connectionString))
{
var command = new SqlCommand("SELECT * FROM Table", connection);
connection.Open();
using (var reader = command.ExecuteReader())
{
while(reader.Read())
{
// Do something here
}
}
}
Run Code Online (Sandbox Code Playgroud)
内部会发生什么?这在网络层面如何运作?是否会为每次调用进行新的数据库往返,Read或者内部是否有批量读取?
我这么问是因为我刚才读的ODP.NET提供FetchSize两个属性OracleCommand和OracleDataReader我的理解是多少记录应通过单次往返于数据库中预装的定义.我想知道SQL Server是否以类似的方式工作,并且是否存在可以在某处配置的类似行为.我没有找到任何这样的配置SqlCommand,SqlDataReader或CommandBehavior.
我的目标很简单,我想做异步I/O调用(使用异步等待) - 但是:
好.
目前这里是我的代码,它的工作是从db读取并将每一行项目投射到a Func<>
public IEnumerable < T > GetSomeData < T > (string sql, Func < IDataRecord, T > projector)
{
using(SqlConnection _conn = new SqlConnection(@"Data Source=..."))
{
using(SqlCommand _cmd = new SqlCommand(sql, _conn))
{
_conn.Open();
_cmd.CommandTimeout = 100000;
using(IDataReader rdr = _cmd.ExecuteReader())
{
while (rdr.Read()) yield return projector(rdr);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
那么,投影机是什么?
每个类都有一个函数,它获取a record(IDataRecord)并创建一个实体:
示例:
public class MyClass
{
public static MyClass MyClassFactory(IDataRecord …Run Code Online (Sandbox Code Playgroud) 我只是尝试将我的ASP .NET MVC应用程序的一部分异步,但即使在阅读并尝试了很多之后我也不太了解async-await模式并希望有人能给我一个提示.
基本上我有以下几点:
一个javascript调用我的控制器获取图表的部分视图(这在很多图表的页面加载后发生了几次)
// Load content of one chart
my.loadChartContent = function (data, callback) {
$.post("/Dashboard/GetChartContent/", data, function (datain) {
if (isFunction(callback))
callback(datain);
});
};
Run Code Online (Sandbox Code Playgroud)控制器操作,在另一个类中调用数据库方法
public ActionResult GetChartContent(int id, bool isDraft = false)
{
//do something
//...
var chartdata = _dataService.GetDataForChart(chart, isDraft, _user.Id); //long running query
//do something with chartdata
return View(chartdata);
}
Run Code Online (Sandbox Code Playgroud)数据类(_dataService),它使用SqlDataReader从数据库中获取数据,并使用该数据加载DataTable.
问题是虽然javascript是异步执行的,但是在DataService类返回结果之前,Controller-Actions似乎被阻塞了.我想启动对数据库的所有查询并异步等待结果,以便长时间运行的查询不会阻止较短的查询.(在SQL Server Profiler中,我将查询视为Begin-End,Begin-End,Begin-End =>但它应该是begin-begin-begin - end-end-end)
我应该在哪里使用async-await?是否足以将它(某种程度上)用于我的控制器动作,还是必须使整个"调用链"异步?
更新: 当我使用SQLConnection.OpenAsync和ExecuteReaderAsync时,代码永远不会完成......我不明白为什么?
public async Task<Query> GetSqlServerData(Query query)
{
var dt = new DataTable();
var con = …Run Code Online (Sandbox Code Playgroud) async-await ×2
asynchronous ×2
c# ×2
.net ×1
.net-4.5 ×1
ado.net ×1
asp.net ×1
asp.net-mvc ×1
io ×1
odp.net ×1
oracle ×1
sql-server ×1