- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个应用程序,其中包括将各种数据存储到数据库中。数据库可能是 ORACLE 或 SQL Server。 SQL 是根据配置和执行期间获取的值动态创建的。
通过使用 DbProviderFactory,我的数据库方法能够与 ORACLE 或 SQL Server 一起工作,而无需为任何数据库编写自定义代码,除了一件事;参数/绑定(bind)变量。对于 ORACLE,我需要使用 ":ParameterName"
,而对于 SQL Server,我需要使用 "@ParameterName"
。有什么方法可以使它通用吗?
示例代码:
public class DbOperations
{
private DbProviderFactory m_factory;
private DbConnection m_CN;
...
private void InsertToDb(ValueType[] values, ColumnType[] columns)
{
DbCommand Cmd = m_factory.CreateCommand();
Cmd.Connection = m_CN;
StringBuilder sql = new StringBuilder();
sql.Append("INSERT INTO ");
sql.Append(DestinationTable);
sql.Append(" (");
for (int i = 0; i < columns.Length; i++)
{
sql.Append(columns[i].ColumnName);
if (i < columns.Length - 1)
sql.Append(", ");
}
sql.Append(") VALUES (");
for (int i = 0; i < values.Length; i++)
{
//sql.Append(String.Format(":{0}", columns[i].ColumnName)); //ORACLE
sql.Append(String.Format("@{0}", columns[i].ColumnName)); // SQL Server
}
DbParameter param = m_factory.CreateParameter();
param.Direction = ParameterDirection.Input;
param.ParameterName = columns[i].ColumnName;
param.Value = values[i];
Cmd.Parameters.Add(param);
if (i < columns.Length - 1)
sql.Append(", ");
}
sql.Append(")");
Cmd.CommandText = sql.ToString();
Cmd.ExecuteNonQuery();
}
最佳答案
我很久以前就接受了这个问题的答案,但由于某种原因,答案不再在这里......所以我想我需要回答我自己的问题。
我所做的是创建一个 parambuilder 类:
class ParamBuilder
{
private DbProviderFactory m_factory;
private DbCommandBuilder m_builder;
private string m_parameterMarkerFormat;
public ParamBuilder(DbProviderFactory factory) : this(factory, null)
{
}
public ParamBuilder(DbProviderFactory factory, DbConnection source)
{
m_factory = factory;
m_builder = m_factory.CreateCommandBuilder();
if (source != null)
{
using (DataTable tbl =
source.GetSchema(DbMetaDataCollectionNames.DataSourceInformation))
{
m_parameterMarkerFormat =
tbl.Rows[0][DbMetaDataColumnNames.ParameterMarkerFormat] as string;
}
}
if (String.IsNullOrEmpty(m_parameterMarkerFormat))
m_parameterMarkerFormat = "{0}";
}
public DbParameter CreateParameter(string parameterName,
out string parameterMarker)
{
DbParameter param = m_factory.CreateParameter();
param.ParameterName =
(string)typeof(DbCommandBuilder).InvokeMember("GetParameterName",
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.InvokeMethod |
System.Reflection.BindingFlags.NonPublic, null, m_builder,
new object[] { parameterName });
parameterMarker =
String.Format(System.Globalization.CultureInfo.InvariantCulture,
m_parameterMarkerFormat, param.ParameterName);
return param;
}
}
我创建了一个 ParamBuilder 类型的成员变量:
private readonly ParamBuilder m_ParamBuilder;
然后在我使用参数的方法中,我是这样使用的:
...
string paramMarker;
DbParameter param = m_ParamBuilder.CreateParameter(destination[i].ColumnName,
out paramMarker);
sql.Append(paramMarker);
param.Direction = ParameterDirection.Input;
param.Value = source[i];
Cmd.Parameters.Add(param);
...
关于c# - DbCommand 和参数化 SQL,ORACLE 与 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5295699/
如何将 DbCommand 参数复制到另一个 DbCommand,我想要一个新的 DbCommand,其参数与我上一个 DbCommand 相同。但是现在使用不同的 sql 字符串。 最佳答案 //
我有一个文件集合,对于每个文件,我将在事务中使用 Dbcommand 调用一个 SP。 例如: DbCommand insert = db.GetStoredProcCommand("Insert
您好,我正在尝试为应该在 Visual Studio 2013 中使用的 DbCommand 对象创建自定义可视化工具。 我有以下代码 using VisualizerTest; using Micr
我们使用 Enterprise Library 3.0 访问 Oracle DB(Microsoft Oracle 客户端)。如果在调用存储过程或函数后不释放 DbCommand 实例,会发生什么情况
我正在开发一个使用 ASP.NET Core 2.1 和 EF Core 2.1 的项目。虽然大部分查询和命令使用EF,但有些单元需要直接调用存储过程。 我不能使用FromSql,因为它需要基于实体模
我似乎有两个选择: 让我的类(class)实现IDisposable .创建我的DbCommand实例为 private readonly字段,并在构造函数中添加它们使用的参数。每当我想写入数据库时
我想创建一个新的 DbCommand,但出现了一些错误: DbCommand insertcommand = new DbCommand("insert into persons(firstname,
我想创建一个新的 DbCommand,但出现了一些错误: DbCommand insertcommand = new DbCommand("insert into persons(firstname,
我在一些生成代码分析警告的遗留代码中看到了这一点: Database db = DatabaseFactory.CreateDatabase(strDBCon); DbCommand dbCo
在我试图理解的软件中,DataReader 类是通过 ExecuteReader() 从 IDbCommand 类型(继承的)接收的。 我对 C# 和数据库通信还很陌生,所以:DataReader 如
我有一个参数添加函数,如下所示: public static void AddParameter(DbCommand comm, string ParamName, Object objValue,
我正在尝试拦截所有 SQL 命令并将其记录到数据库中。我还需要参数及其值。但是 command.Parameters 没有 IEnumerable。我可以使用 for-statement,但感觉有点像
我有以下代码尝试从两个不同的表中获取记录,然后将它们添加到特定的组合框中。只有第一个查询有效,第二个查询被忽略。 Try sqlConn = New MySqlConnecti
我不明白为什么每次需要调用存储过程时都必须创建一个 DbCommand 对象。所以我试图想出一种方法来做到这一点。我已经测试了我的代码(见下文)。但我想与社区核实一下,以防我遗漏了什么。我会在 ASP
我需要一个带参数的更新命令,由于某些原因我不能使用存储过程,实际上我们生成更新命令依赖于数据库、表和列,我们使用以下形式: string conStr = "Provider=SQLN
我正在构建一个 sqlwrapper 来处理 MSsql 和 Sqlite,到目前为止,我使用通用 dbconnection、数据集和 dataadapter 没有问题,但是使用 dbcommand
如果我已经使用 ,我有以下 ado.net 代码使用 要包装我的 DBCommand,我是否必须明确关闭下面的连接? 谢谢, public static void ExecuteSQL(
我正在使用 DbCommand 来自:System.ComponentModel.Component 我正在构建一个带有参数的对象: DbCommand command = _webERPDB.Get
您好,我在使用 Devart 时遇到过这种异常情况。我在 MySql 中调用存储过程。存储过程函数,如果我通过数据库调用它。 using (dc = conn.GetContext())
我们有一个超过 13 年历史的 SQL 帮助程序库,所有应用程序都在使用它。我想更新它以使用 Enterprise Library DAAB。这样做的一个障碍是难以将 SqlCommand(由库和所有
我是一名优秀的程序员,十分优秀!