使用DbProviderFactories可以实现与提供者无关的数据库访问。
var factory = DbProviderFactories.GetFactory("ProviderInvariantName");
using (var connection = factory.CreateConnection())
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT * FROM TableName";
...
}
}
但是如果我想参数化我的查询怎么办?参数的格式在提供者之间有所不同(@ param,:param,?,...)。框架中是否有对此的支持?或者我是否必须自己编写代码,将我的CommandText中的泛型参数替换为提供者特定的表单?
澄清: 对于OleDbCommand,我的CommandText看起来像这样:
SELECT * FROM TableName WHERE ColumName = ?
对于SqlCommand,我的CommandText看起来像这样:
SELECT * FROM TableName WHERE ColumName = @paramName
对于OracleCommand,我的CommandText看起来像这样:
SELECT * FROM TableName WHERE ColumName = :paramName
这是我正在讨论的CommandText中参数占位符的格式,而不是DbParameter对象。
答案 0 :(得分:0)
我同意Rikalous。 You can use the Enterprise Library Data Access Block.
参数不是特定于db的类型。例如,以下内容适用于Oracle和Sql。您的数据库和连接也是通用的。
Db = DatabaseFactory.CreateDatabase(ConnString);
Connection = Db.CreateConnection();
var dbCommand = Db.GetStoredProcCommand("sp_xxx");
Db.AddInParameter(dbCommand, "lob", DbType.Int32, 200);
Db.AddInParameter(dbCommand, "attr", DbType.String, "whatever");
我唯一没有采用过这种方法的东西是用于当前版本中尚未实现的东西,例如TVP params或其他东西,但你可以简单地为此投射。
((SqlDatabase)Db).AddInParameter(dbCommand, "location_codes", SqlDbType.Structured, dataTable);