.Net Core如何实现SQLAdapter ./DataTable函数

问题描述:

我有一个简单的.Net框架例程,它运行查询并返回一个DataTable对象。我需要这个端口来对.NET核心,但我推断SQLAdapter和DataTable不支持.Net Core如何实现SQLAdapter ./DataTable函数

SqlConnection con = new SqlConnection(m_ConnectString); 
SqlCommand cmd = new SqlCommand(strQuery); 
SqlDataAdapter sda = new SqlDataAdapter(); 
// assign the transaction and connection to the command object 
cmd.Connection = con; 
sda.SelectCommand = cmd; 
DataTable dt = new DataTable(); 
// execute query and soak up results 
sda.Fill(dt); 
return dt; 

任何人都可以建议我怎么可以重新实现这个代码,使用的是什么支持? 谢谢

+0

嗯,你可以通过查看[SqlDataAdapter的]参考源开始(http://referencesource.microsoft.com/#System.Data/System/Data/SqlClient/SqlDataAdapter.cs)和[数据表](http://referencesource.microsoft.com/#System.Data/System/Data/DataTable.cs)并重新实现你实际需要的部分...另外:祝你好运。 – Corak

+0

感谢您的回复,但不知道这是多么有帮助。我曾假设其他许多人会遇到这个问题,并且他们并不都是通过实施框架的某些部分来解决问题的。 – Hughgo

+2

那么,一个问题是,如果.Net Core不知道'DataTable',那么你就不能'返回dt',并且其他所有可以与'DataTable'一起工作的东西都不能工作了。所以问题是,你真的需要什么'DataTable'的功能,并且你可以使用例如一个'DataReader'来代替(如果'DataReader'在.Net Core中可用;从来没有用过)。 – Corak

更新:这个答案对应于.NET Core 1.x(这是我写这篇文章时的最新版本)。 如果您使用的是.NET Core 2.x(截至2017年7月的测试版),请检查Joe的答案。

原来的答复:

推荐阅读:Porting to .NET Core

我引述:

  • System.Data。尽管基础层已经是.NET Core的一部分,即提供者模型和SQL客户端,但某些功能目前不可用,例如模式支持和DataTable/DataSet。

您可以使用SqlDataReader,但不能使用SqlAdapter或DataTable。

首先加入System.Data.SqlClient NuGet Package。

然后你可以...

var con = new SqlConnection("..."); 
var cmd = con.CreateCommand(); 
cmd.CommandText = "..."; 
var reader = cmd.ExecuteReader(); 
// populate your custom data structure 

是否IList<Dictionary<string, object>>作品吗?

var results = new List<Dictionary<string, object>>(); 

while (reader.Read()) 
{ 
    results.Add(Enumerable.Range(0, reader.FieldCount).ToDictionary(reader.GetName, reader.GetValue)); 
} 
return results; 

所以现在你可以读取使用results[0]["FirstName"].ToString()

除非你想切换到实体框架的核心,在这种情况下,这tutorial是得心应手。

+0

关闭但没有雪茄。 – ProfK

+0

日期的答案。不再正确。 –

+0

谢谢,我更新了答案。很高兴知道它现在受到支持。 –

而不是DataAdapter/DataTable,您可以使用.NET Core的现有DAL库之一支持低级别ADO.NET接口上的CRUD操作。最近我发布了NReco.Data:独立于提供程序的DAL,支持自动SQL语句生成,抽象查询和简单记录CRUD操作。

例如,从问题的代码段可以通过以下方式重新实现:

var con = new SqlConnection(m_ConnectString); 
var dbFactory = new NReco.Data.DbFactory(
    System.Data.SqlClient.SqlClientFactory.Instance); 
var dbCmdBuilder = new NReco.Data.DbCommandBuilder(dbFactory); 
var dbAdapter = new NReco.Data.DbDataAdapter(con, dbCmdBuilder); 

var selectRecordsList = dbAdapter.Select( 
    new Query("some_table")).ToList<Dictionary<string,object>>(); 

复杂的SQL查询可以被执行为应用级数据的观点:

dbCmdBuilder.Views["some_view"] = new DbDataView(
    @"SELECT @columns FROM Employee emp 
     LEFT JOIN Company c ON (c.Id=emp.CompanyId) 
     @where[ WHERE {0}] @orderby[ ORDER BY {0}] 
    ") { 
     FieldMapping = new Dictionary<string,string>() { 
     {"Id", "emp.Id"}, 
     {"*", "emp.*, c.Title as CompanyTitle"} 
     } 
    }; 
var someViewRS = dbAdapter.Select(new Query("some_view")).ToRecordSet(); 

NReco.Data不要试图用代替用自己的查询语句(就像LINQ一样);而不是它允许您从业务逻辑 中进行简单的与数据库无关的查询,并使用像只读表一样访问的特殊应用程序级数据视图封装复杂的SQL语法。

此外,也可以直接与(在EF核心像FromSql)Select方法重载指定原始SQL查询:

var userModels = dbAdapter.Select("select * from users where id={0}", 5).ToList<User>(); 
+0

感谢所有的回应。我已经使用DataReader和一个轻量级的数据表(基本上是一个列表清单) – Hughgo

+0

@Hughgo使用DataReader是当然最简单的(也是最好的)解决方案:)我希望你偶尔会尝试NReco.Data库。如有任何疑问或问题,请随时与我联系。 –

+0

当你的查询对象被限制在一个命名表中时,你到底是如何得到这样一个项目的?那些数据源查询可能是动态SQL或连接等的数以百万计的情况下呢? – ProfK

SqlDBAdapterDataTable现在支持。

您必须使用VS2017预览版15.3,目标.net核心2.0,并添加NuGet软件包System.Data.Common以及System.Data.SqlClient。下面的代码。

有关更多信息,请参阅https://blogs.msdn.microsoft.com/devfish/2017/05/15/exploring-datatable-and-sqldbadapter-in-asp-net-core-2-0/

public static DataTable ExecuteDataTable(SqlConnection conn, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) 
{ 
    DataTable dt = new DataTable(); 
    dt.Columns.Add("CustomerID"); 
    dt.Columns.Add("CustomerName"); 
    SqlDataReader dr = ExecuteReader(conn, cmdType, cmdText, cmdParms); 
    while (dr.Read()) 
    { 
     dt.Rows.Add(dr[0], dr[1]); 
    } 
    return dt; 
} 

public static DataTable ExecuteDataTableSqlDA(SqlConnection conn, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) 
{ 
    System.Data.DataTable dt = new DataTable(); 
    System.Data.SqlClient.SqlDataAdapter da = new SqlDataAdapter(cmdText, conn); 
    da.Fill(dt); 
    return dt; 
} 
+0

我还没有使用VS2017 Preview 15.3,所以我不知道这个发展。 – Fabulous

+0

很高兴这可以帮助你。 –

+0

从VS2017 Preview 15.4开始,这仍然需要预发布版本的'System.Data.SqlClient' – user3074376