/// <summary>
        /// 获取该数据库提供程序的名称。
        /// </summary>
        /// <param name="factory">表示一个 <see cref="System.Data.Common.DbProviderFactory"/> 对象。</param>
        /// <returns>该数据库提供程序的名称,例如 <see cref="System.Data.SqlClient.SqlClientFactory"/> 对象返回 "System.Data.SqlClient"。</returns>
        public static string GetProviderName(this DbProviderFactory factory)
        {
            Type   factoryType  = factory.GetType();
            string providerName = null;

            if (!_factoryMappings.Value.TryGetValue(factoryType, out providerName))
            {
                DbProviderFactoryClass factoryClass = DbProviderFactoryClasses.FirstOrDefault(item => Type.GetType(item.AssemblyQualifiedName) == factoryType);
                providerName = factoryClass == null ? factoryType.Namespace : factoryClass.InvariantName;
                _factoryMappings.Value.Add(factoryType, providerName);
            }
            return(providerName);
        }
        private static DbProviderFactoryClass[] GetDbProviderFactoryClasses()
        {
            List<DbProviderFactoryClass> list = DbProviderFactories.GetFactoryClasses().ToList<DbProviderFactoryClass>();

            var types = typeof(DbProviderFactory).GetSubClass().Where(t => !t.IsAbstract);
            foreach (Type type in types)
            {
                if (!list.Any(item => item.AssemblyQualifiedName == type.AssemblyQualifiedName || item.InvariantName == type.Namespace))
                {
                    DbProviderFactoryClass item = new DbProviderFactoryClass();
                    string name = type.Name.Replace("Factory", "");
                    item.Name = name + " Data Provider";
                    item.Description = ".NET Framework Data Provider for " + name;
                    item.InvariantName = type.Namespace;
                    item.AssemblyQualifiedName = type.AssemblyQualifiedName;
                    list.Add(item);
                }
            }

            DbProviderFactoryClass[] factories = list.Where(
                item =>
                {
                    Type type = null;
                    return Types.TryGetType(item.AssemblyQualifiedName, out type);
                }).ToArray();

            return factories;
        }
 /// <summary>
 /// 根据数据库提供程序的描述信息对象获取其 SQL 脚本环境下的查询参数名称前缀字符。
 /// </summary>
 /// <param name="providerFactory">数据库提供程序的描述信息对象 <see cref="DbProviderFactoryClass"/> 。</param>
 /// <returns>根据数据库提供程序的描述信息对象获取其 SQL 脚本环境下的查询参数名称前缀字符。</returns>
 public static string GetParameterToken(this DbProviderFactoryClass providerFactory)
 {
     return(GetParemeterToken(providerFactory.InvariantName));
 }