Read from an Arbitrary Table
This scenario demonstrate how to read all of the rows/columns of a table when the table name is only known at run time.
Scenario Prototype
public interface IArbitraryTableReadScenario<T>
{
T GetAll(string schema, string tableName);
}
ADO.NET
Danger!
Verify that the schema and table name exist to avoid SQL injection attacks.
public class ArbitraryTableReadScenario : SqlServerScenarioBase, IArbitraryTableReadScenario<DataTable>
{
public ArbitraryTableReadScenario(string connectionString) : base(connectionString)
{ }
public DataTable GetAll(string schema, string tableName)
{
//WARNING: Verify that the schema and table name exist to avoid SQL injection attacks.
string sql = $"SELECT * FROM [{schema}].[{tableName}];";
var result = new DataTable();
using (var con = OpenConnection())
using (var cmd = new SqlCommand(sql, con))
using (var reader = cmd.ExecuteReader())
result.Load(reader);
return result;
}
}
Chain
Chain will verify the table exists before executing the query to ensure that SQL injection is not possible.
public class ArbitraryTableReadScenario : IArbitraryTableReadScenario<DataTable>
{
readonly SqlServerDataSource m_DataSource;
public ArbitraryTableReadScenario(SqlServerDataSource dataSource)
{
m_DataSource = dataSource;
}
public DataTable GetAll(string schemaName, string tableName)
{
return m_DataSource.From(schemaName + "." + tableName).ToDataTable().Execute();
}
}
public class ArbitraryTableReadScenario2 : IArbitraryTableReadScenario<IReadOnlyList<IReadOnlyDictionary<string, object?>>>
{
readonly SqlServerDataSource m_DataSource;
public ArbitraryTableReadScenario2(SqlServerDataSource dataSource)
{
m_DataSource = dataSource;
}
//This version returns a lightweight object known as a "Table". It is an alternative to .NET's DataTable.
public IReadOnlyList<IReadOnlyDictionary<string, object?>> GetAll(string schemaName, string tableName)
{
return m_DataSource.From(schemaName + "." + tableName).ToTable().Execute().Rows;
}
}
Dapper
Danger!
Verify that the schema and table name exist to avoid SQL injection attacks.
public class ArbitraryTableReadScenario : ScenarioBase, IArbitraryTableReadScenario<DataTable>
{
public ArbitraryTableReadScenario(string connectionString) : base(connectionString)
{ }
public DataTable GetAll(string schema, string tableName)
{
//WARNING: Verify that the schema and table name exist to avoid SQL injection attacks.
string sql = $"SELECT * FROM [{schema}].[{tableName}];";
var result = new DataTable();
using (var con = OpenConnection())
using (var reader = con.ExecuteReader(sql))
result.Load(reader);
return result;
}
}
DbConnector
TODO
Entity Framework 6
TODO
Entity Framework Core
Danger!
Verify that the schema and table name exist to avoid SQL injection attacks.
public class ArbitraryTableReadScenario : IArbitraryTableReadScenario<DataTable>
{
private readonly Func<OrmCookbookContext> CreateDbContext;
public ArbitraryTableReadScenario(Func<OrmCookbookContext> dBContextFactory)
{
CreateDbContext = dBContextFactory;
}
public DataTable GetAll(string schema, string tableName)
{
using OrmCookbookContext context = CreateDbContext();
using DbCommand commnd = context.Database.GetDbConnection().CreateCommand();
string sql = $"SELECT * FROM [{schema}].[{tableName}];";
commnd.CommandText = sql;
commnd.Connection!.Open();
using DbDataReader reader = commnd.ExecuteReader(CommandBehavior.CloseConnection);
var result = new DataTable();
result.Load(reader);
return result;
}
}
LINQ to DB
TODO
LLBLGen Pro
TODO
NHibernate
TODO
RepoDb
TODO
ServiceStack
TODO