微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我一直在尝试创建一些DB独立代码,如下所示:

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类中的受保护方法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>)Delegate.CreateDelegate(typeof(Func<DbCommandBuilder,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");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐