c# – IDbCommand MySQL和SQL Server的命名参数
发布时间:2020-12-15 22:00:24 所属栏目:百科 来源:网络整理
导读:我一直在尝试创建一些DB独立代码,如下所示: IDbCommand command = connection.CreateCommand();command.CommandText = "...";IDbDataParameter param1 = command.CreateParameter();param1.ParameterName = "param1";param1.Value = "value";command.Parame
我一直在尝试创建一些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 解决方法
不,我认为没有这样的方法.所以你必须提供自己的:
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"); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |