gpt4 book ai didi

c# - MySQL 和 SQL Server 的 IDbCommand 命名参数

转载 作者:可可西里 更新时间:2023-11-01 07:39:54 26 4
gpt4 key购买 nike

我一直在尝试创建一些独立于数据库的代码,如下所示:

IDbCommand command = connection.CreateCommand();
command.CommandText = "...";

IDbDataParameter param1 = command.CreateParameter();
param1.ParameterName = "param1";
param1.Value = "value";
command.Parameters.Add(param1);

适用于 mysql 的命令文本是:

select * from mytable where field1 = ?param1

适用于 sqlserver 的命令文本是:

select * from mytable where field1 = @param1

是否有某种形式对两者都适用?

编辑:

  • SQL Server 2008R2
  • MySQL 5.0.X

最佳答案

不,我认为没有这样的方法。所以你必须提供你自己的:

public static String GetProviderParameter(string paramName, IDbConnection con)
{
string prefix = "";
if(con is System.Data.SqlClient.SqlConnection)
prefix = "@";
else if(con is System.Data.OleDb.OleDbConnection)
prefix = "?";
else if(con is System.Data.Odbc.OdbcConnection)
prefix = "?";
else if(con is MySql.Data.MySqlClient.MySqlConnection)
prefix = "?";

return prefix + paramName;
}

用法:

param1.ParameterName = GetProviderParameter("param1", connection);

或者您可以使用 this使用反射来使用 DbCommandBuilder 类中的 protected 方法 GetParameterName 的扩展:

public static class Db
{
static readonly Func<DbConnection, DbProviderFactory> getDbProviderFactory =
(Func<DbConnection, DbProviderFactory>)Delegate.CreateDelegate(typeof(Func<DbConnection, DbProviderFactory>), typeof(DbConnection).GetProperty("DbProviderFactory", BindingFlags.Instance | BindingFlags.NonPublic).GetGetMethod(true));
static readonly Func<DbCommandBuilder, string, string> getParameterName =
(Func<DbCommandBuilder, string, string>)Delegate.CreateDelegate(typeof(Func<DbCommandBuilder, string, string>), typeof(DbCommandBuilder).GetMethod("GetParameterName", BindingFlags.Instance | BindingFlags.NonPublic, Type.DefaultBinder, new Type[] { typeof(string) }, null));

public static DbProviderFactory GetProviderFactory(this DbConnection connection)
{
return getDbProviderFactory(connection);
}

public static string GetParameterName(this DbConnection connection, string paramName)
{
DbCommandBuilder builder = GetProviderFactory(connection).CreateCommandBuilder();

return getParameterName(builder, paramName);
}
}

那么就很简单了:

param1.ParameterName = connection.GetParameterName("param1");

关于c# - MySQL 和 SQL Server 的 IDbCommand 命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21095941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com