.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;
任何人都可以建议我怎么可以重新实现这个代码,使用的是什么支持? 谢谢
更新:这个答案对应于.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是得心应手。
而不是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>();
SqlDBAdapter
和DataTable
现在支持。
您必须使用VS2017预览版15.3,目标.net核心2.0,并添加NuGet软件包System.Data.Common
以及System.Data.SqlClient
。下面的代码。
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;
}
我还没有使用VS2017 Preview 15.3,所以我不知道这个发展。 – Fabulous
很高兴这可以帮助你。 –
从VS2017 Preview 15.4开始,这仍然需要预发布版本的'System.Data.SqlClient' – user3074376
嗯,你可以通过查看[SqlDataAdapter的]参考源开始(http://referencesource.microsoft.com/#System.Data/System/Data/SqlClient/SqlDataAdapter.cs)和[数据表](http://referencesource.microsoft.com/#System.Data/System/Data/DataTable.cs)并重新实现你实际需要的部分...另外:祝你好运。 – Corak
感谢您的回复,但不知道这是多么有帮助。我曾假设其他许多人会遇到这个问题,并且他们并不都是通过实施框架的某些部分来解决问题的。 – Hughgo
那么,一个问题是,如果.Net Core不知道'DataTable',那么你就不能'返回dt',并且其他所有可以与'DataTable'一起工作的东西都不能工作了。所以问题是,你真的需要什么'DataTable'的功能,并且你可以使用例如一个'DataReader'来代替(如果'DataReader'在.Net Core中可用;从来没有用过)。 – Corak