Hug*_*hgo 16 c# datatable .net-core
我有一个简单的.Net Framework例程,它运行一个查询并返回一个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;
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议我如何使用支持的内容重新实现此代码?谢谢
Joe*_*aly 20
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;
}
Run Code Online (Sandbox Code Playgroud)
更新:这个答案对应于.NET Core 1.x(这是我写这篇文章时最新的).如果您使用的是.NET Core 2.x(截至2017年7月的测试版),请查看Joe的回答.
原始答案:
推荐阅读:移植到.NET Core
我引用:
- System.Data.虽然基础层已经是.NET Core的一部分,即提供者模型和SQL客户端,但目前还没有一些功能,例如架构支持和DataTable/DataSet.
您可以使用SqlDataReader但不能使用SqlAdapter或DataTable.
首先添加System.Data.SqlClientNuGet包.
然后你可以...
var con = new SqlConnection("...");
var cmd = con.CreateCommand();
cmd.CommandText = "...";
var reader = cmd.ExecuteReader();
// populate your custom data structure
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
所以现在你可以阅读 results[0]["FirstName"].ToString()
除非您想切换到Entity Framework Core,否则本教程非常方便.
您可以使用现有的用于.NET Core的DAL库来代替DataAdapter/DataTable,以支持通过低级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>>();
Run Code Online (Sandbox Code Playgroud)
复杂的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();
Run Code Online (Sandbox Code Playgroud)
NReco.Data不会尝试用自己的Query 替换 SQL(就像LINQ一样); 相反,它允许您从业务逻辑中创建简单的独立于数据库的查询,并使用特殊的应用程序级数据视图封装复杂的SQL语法,这些数据视图可以像只读表一样访问.
也可以使用Select方法重载直接指定原始SQL查询(如EF Core中的FromSql):
var userModels = dbAdapter.Select("select * from users where id={0}", 5).ToList<User>();
Run Code Online (Sandbox Code Playgroud)