GetSchema 方法可以异步工作吗?

Posted

技术标签:

【中文标题】GetSchema 方法可以异步工作吗?【英文标题】:Can GetSchema method work asynchronously? 【发布时间】:2014-02-11 15:14:25 【问题描述】:

SqlConnection 类的GetSchema 方法如何工作? 它运行查询吗?可以异步调用吗?

【问题讨论】:

【参考方案1】:

你能委托调用“GetSchema”的方法吗?因为 SQL 是事务系统,所以我们在 c# 中处理的并行任务非常不同,甚至可能在 sql 中不存在。这篇文章中排名最高的答案很好地解释了这一点。

SQL Server (TSQL) - Is it possible to EXEC statements in parallel?

如果您不能异步运行 GetSchema 方法,因为该方法只返回一个数据表,您也可以对返回相同内容的数据库执行查询。

这篇文章显示 getSchema 返回一个数据表:http://msdn.microsoft.com/en-us/library/ms136365(v=vs.110).aspx

阅读本帖备注:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.getschema(v=vs.110).aspx

如果您多次调用 getSchema,最后一次调用可能会覆盖第一个响应。

如果可以,您可以在 SQL 中创建一个服务队列来处理“异步执行”,但这非常复杂:http://rusanu.com/2009/08/05/asynchronous-procedure-execution/

希望这会有所帮助!

【讨论】:

【参考方案2】:

假设您想要 c# 答案,因为它在您的标签中,请参阅: Use SqlConnection.GetSchema to get Tables Only (No Views)

    using System.Data.SqlClient;

    SqlConnection.GetSchema("Tables");

    SQLCon.Open();
    DataTable tables = SQLCon.GetSchema("Tables");
    SQLCon.Close();

我猜这实际上是在打开连接时对 sys 表或 SQL 中的 information_schema.tables 运行查询。 类似:

   SELECT * FROM information_schema.tables 

    SELECT * FROM [database].sys.tables

类中其他方法的等效调用。

对于异步调用,您可以使用

    Asynchronous Processing=True; 

在你的连接字符串中

    string connectionString = "Data Source=yourDataSource;Initial Catalog=yourCat;Integrated Security=true;Asynchronous Processing=True;";

这是否回答了您的问题?

【讨论】:

是不是所有的连接方法都会异步执行? 我不知道细节,但我认为是的。你可以试试看msdn.microsoft.com/en-us/library/windows/desktop/… 但这并不意味着你的代码会因为这个设置而异步生成连接,它只是意味着它是允许的。如果不允许,那么它将保持连接直到前一个连接关闭,或者如果您尝试调用打开的连接则抛出错误(我没有尝试过,所以我不知道。)如果您的代码一次开始和结束一个,那么它仍然是一个线性过程所以你问如何建立一个并行处理的线程池?或者只是它允许异步? 我想确保 GetScheme 将异步执行。如果没有,我将编写异步等待以执行查询【参考方案3】:

我猜它从 sys 表中获取数据。看http://msdn.microsoft.com/en-us/library/ms188348.aspx

GetSchema 没有异步实现。 如果您需要该方法的具体细节,请尝试使用 ILSPY。

【讨论】:

以上是关于GetSchema 方法可以异步工作吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以从构造函数中调用异步方法吗? [复制]

conn.GetSchema 查找表的主键 - MsAccess

如何使用 SqlConnection.GetSchema 获取同义词信息?

Azure WebJobs - 我可以使用异步方法吗?

有啥方法可以强制异步 NSURLConnection 在后台调用 connectionDidFinishLoading 吗?

有啥方法可以使用旧的 .net 框架版本异步写入 FileStream 吗?