1、一般数据库之间的转换时这样实现的

         static void Main(string[] args){//必须引入System.Data程序集string connectionString = ConfigurationManager.ConnectionStrings["SqlConfigurationManager"].ConnectionString;string providerName = ConfigurationManager.ConnectionStrings["SqlConfigurationManager"].ProviderName;IDbConnection con;if (providerName == "Access"){con = new OleDbConnection(connectionString);}else if (providerName == "Sql"){con = new SqlConnection(connectionString);}else{throw new Exception("不存在!");}using (con){con.Open();using (IDbCommand cmd = con.CreateCommand()){cmd.CommandText = "insert into Person (age) values(@age) ";//Access占位符通常使用问号?,当多个占位符参数时,要注意个数,而如果使用的是@作为占位符的话,就必须要注意Command添加参数时的顺序,不然报错,而?问号不要在意这个顺序,所以推荐使用问号?作为占位符IDbDataParameter parameter = cmd.CreateParameter();parameter.ParameterName = "@age";parameter.DbType = DbType.Int32;parameter.Value = "110";cmd.Parameters.Add(parameter);cmd.ExecuteNonQuery();}}Console.WriteLine("插入成功!");Console.ReadKey();
}

App.config配置如下

<configuration><connectionStrings><add name="SqlConfigurationManager" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\db1.mdb"   providerName="Access"/><!--<add name="SqlConfigurationManager" connectionString="Server=.;Database=Person;Integrated Security=True;Pooling=False"providerName="MsSqlServer"/>--></connectionStrings>
</configuration>

 2、通过DbProviderFactories实现

一般providerName是有规范的命名的
在C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config里面的system.data节点下定义了

<system.data><DbProviderFactories>
     <add name="Odbc Data Provider" invariant="System.Data.Odbc" description=".Net Framework Data Provider for Odbc" type="System.Data.Odbc.OdbcFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
     <add name="OleDb Data Provider" invariant="System.Data.OleDb" description=".Net Framework Data Provider for OleDb" type="System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/><add name="OracleClient Data Provider" invariant="System.Data.OracleClient" description=".Net Framework Data Provider for Oracle" type="System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/><add name="SqlClient Data Provider" invariant="System.Data.SqlClient" description=".Net Framework Data Provider for SqlServer" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/><add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/><add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/></DbProviderFactories>
</system.data>

如果providerName为System.Data.Odbc,那么可以用于所有数据库配置
如果为System.Data.OleDb,可用于Access数据库配置
如果为System.Data.OracleClient,可用于Oracle数据库配置
如果为System.Data.SqlClient,可用于MsSqlServer数据库配置

        static void Main(string[] args){string connectionString = ConfigurationManager.ConnectionStrings["SqlConfigurationManager"].ConnectionString;string providerName = ConfigurationManager.ConnectionStrings["SqlConfigurationManager"].ProviderName;//必须引入System.Data程序集DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);using (DbConnection con = factory.CreateConnection()){con.ConnectionString = connectionString;con.Open();using (DbCommand cmd = factory.CreateCommand()){cmd.CommandText = "insert into Person (age) values(@age)";cmd.Connection = con;DbParameter parameter = cmd.CreateParameter();parameter.ParameterName = "@age";//Access不用此占位符(?)也能顺利插入parameter.DbType = DbType.Int32;parameter.Value = "1010";cmd.Parameters.Add(parameter);cmd.ExecuteNonQuery();}}Console.WriteLine("插入成功!");Console.ReadKey();}

注意ProviderName的配置

<configuration><connectionStrings><add name="SqlConfigurationManager" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\db1.mdb"providerName="System.Data.OleDb"/><!--<add name="SqlConfigurationManager" connectionString="Server=.;Database=Person;Integrated Security=True;Pooling=False"providerName="System.Data.SqlClient"/>--></connectionStrings>
</configuration>

转载于:https://www.cnblogs.com/MrZivChu/p/ChangeDataBase.html

使用多态来实现数据库之间的切换相关推荐

  1. 如何做到在虚拟数据库和真实数据库之间自由切换?【低调赠送:QQ高仿版GG 4.4 最新源码】...

    记得以前在公司上班时,有时候白天的活没干完,我就会把工作带回家晚上加班继续做.但是,我们开发用的数据库是部署在公司局网内部的一台服务器上的,在家里是肯定连不上这台机器的.在家里没有数据库,服务端就跑不 ...

  2. mysql 迭代更新_MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)

    MySQL.MongoDB.Redis 数据库之间的区别与使用 MySQL.MongoDB.Redis 数据库之间的区别与使用(本章迭代更新) update:2019年2月20日 15:21:19(本 ...

  3. 比较和同步两个SQL Server数据库之间的图像

    介绍 (Introduction) Sometimes we lose data by mistake and we want to compare the data with older backu ...

  4. SQL 利用merge 同步数据库之间表的数据

    同步两个数据库之间两表的数据也许的数据库管理员偶尔需要做的一件事情,下面来记录一下常用的两种方法: 方法一:使用delete.truncate 方法二:使用 merge into  ,Merge是在S ...

  5. unity中的UI状态机,用于各界面之间的切换和跳转

    首先感谢姜雪松先生,大家可以去他的博客查看注释以及代码等,http://jxwgame.blog.51cto.com/943299/1613585 言归正传: 1.在开发项目的过程中,总是会遇到这样的 ...

  6. SAP 物料在启用序列号管理或者不启用序列号管理之间快速切换?

    SAP 物料在启用序列号管理或者不启用序列号管理之间快速切换? 如下物料号 74000043,在HKCS工厂下启用了序列号管理,其序列号参数文件字段值是Z002, Z002这个序列号参数文件的配置, ...

  7. [转载]在SQL Server数据库之间进行数据导入导出,OPENDATASOURCE

    需要在c盘下先建立一个data.txt文件,然后在文件的第一行写上你要导出的列,不如说要导出id和name这两列,就在第一行写上 id,name 然后保存,使用下列SQL就可以了,你如果要保持原有的I ...

  8. AI:几张图理清人工智能与机器学习、知识发现、数据挖掘、统计学、模式识别、神经计算学、数据库之间的暧昧关系

    AI:几张图理清人工智能与机器学习.知识发现.数据挖掘.统计学.模式识别.神经计算学.数据库之间的暧昧关系 目录 几张图理清人工智能与机器学习.知识发现.数据挖掘.统计学.模式识别.神经计算学.数据库 ...

  9. 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!...

    今天讲下在Surfaceview中如何实现两个或者多个Activity之间的切换与数据交互,为了更形象一些我做了一个游戏登录界面的demo,其中对于输入界面的布局这些我也是随意写了下,主要是实现功能并 ...

最新文章

  1. reactjs大列表大表格渲染组件:react-virtualized
  2. Technical User Stories – What, When, and How?
  3. requests 分类多级页面_scrapy框架爬取多级页面
  4. 2019年Q4中国云市场报告:阿里腾讯百度位居前三
  5. extjs mysql_ExtJS与PHP、MySQL实现存储
  6. 使用 OpCache 提升 PHP 5.5+ 程序性能
  7. python变量赋值给数组_python 变量,数组,字符串
  8. maven 部署及使用
  9. 用友nc很慢跟java_大家觉得用友NC的性能如何?
  10. Syong :静态代理模式
  11. ps多种去水印方法与技巧-适合各种水印
  12. android 手机网络可以连上,wifi连上后访问不了服务器,Nexus连接WiFi成功,但提示“已连接 但无法访问互联网”...
  13. 硕士论文——页眉页脚设置
  14. 实用防火与防爆技术培训---第十一讲 可燃固体燃爆特性
  15. 芯片常见的三种封装形式
  16. 三、任务切换之PendSV异常
  17. Unity编辑器扩展-生成prefab的预览图并保存为图片
  18. 数据结构的一些基本术语概念-严蔚敏老师
  19. webview里面的页面不能往下下拉(下拉卡死)解决
  20. 高性能Java代码的最佳实践

热门文章

  1. pandas 常用操作
  2. 关于函数的调用是否加括号的问题
  3. mysql之distinct
  4. 当别人不听我们的话的时候
  5. Mysql索引会失效的几种情况分析
  6. (一)MVC5干货篇,目录和路由
  7. 成都Uber优步司机奖励政策(4月8日)
  8. A winner is a dreamer who never gives up
  9. android栈和队列
  10. 云计算背后的秘密(1)-MapReduce