前几天在要把ITOO放在云上,那么实现动态建库和切库就很重要了。第一个我们想到的方法就是用ODBC,动态创建数据库和创建表,其实这种方式就是最简单,也是比较好想到的实现方式。所有的事情,都从简单的开始,就会比较好实现了。
开放数据库互连(Open Database Connectivity,ODBC),分为三步,第一步:拼接Connectionstring字符串,第二步:拼接DML或DDL语句,第三步:执行。
其实这里最重要的实现动态的效果就是用字符串拼接,或者将字符串作为参数传递,我们才能实现动态的效果。
创建一个CreateDb类:
<span style="font-size:18px;">using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { public class CreateDb { //SqlConnection myConn = new SqlConnection("Server=192.168.24.233;Integrated security=SSPI;data source=CutDb1;user id=sa;password=123456"); SqlConnection myConn = new SqlConnection("Data Source=192.168.24.233;Initial Catalog=CutDb1;User ID=sa;Password=123456"); //data source={0};initial catalog={1};user id={2};password={3}; public bool CreatDatabase(string DatabaseName) { string strDataBase; strDataBase = "CREATE DATABASE " + DatabaseName; SqlCommand myCommand = new SqlCommand(strDataBase, myConn); try { myConn.Open(); myCommand.ExecuteNonQuery(); Console.Write("DataBase is Created Successfully ", "MyProgram "); return true; } catch (System.Exception ex) { Console.WriteLine(ex.ToString(), "MyProgram"); return false; } finally { if (myConn.State == ConnectionState.Open) { myConn.Close(); } } } public bool CreateTable(string DatabaseName, string TableName) { if (myConn.State == ConnectionState.Open) { myConn.Close(); } string strTable; strTable = "use "+DatabaseName+" create table " + TableName + "(myId Integer CONSTRAINT PKeyMyId PRIMARY KEY," + "myName CHAR(50), myAddress CHAR(255), myBalance FLOAT)"; SqlCommand myCommand = new SqlCommand(strTable, myConn); try { myConn.Open(); myCommand.ExecuteNonQuery(); Console.Write("DataBase is Created Successfully ", "MyProgram "); return true; } catch (System.Exception ex) { Console.WriteLine(ex.ToString(), "MyProgram"); return false; } finally { if (myConn.State == ConnectionState.Open) { myConn.Close(); } } } public static void ChangeConfiguration() { //读取程序集的配置文件 string assemblyConfigFile = Assembly.GetEntryAssembly().Location; string appDomainConfigFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); //获取appSettings节点 AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings"); //删除name,然后添加新值 appSettings.Settings.Remove("ConnStr"); appSettings.Settings.Add("ConnStr", "123456"); //保存配置文件 config.Save(); } } }</span>
创建控制台程序调用类:
<span style="font-size:18px;">using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; using WebDemo.Models; namespace ConsoleApplication1 { public class Program { static void Main(string[] args) { CreateDb a = new CreateDb(); String strDataBaseName = "qmx"; String table = "Student"; a.CreatDatabase(strDataBaseName); a.CreateTable(strDataBaseName, table); Console.Read(); } } }</span>
在这里我们一定要记住一点就是我们不要用配置文件,尤其是Web.config文件,它不能再你修改过后,进行重新加载(到目前为止,能实现修改web文件,但是不能让其重新加载一次),为了避免,我们用到的拼接string和将string类型作为参数进行传递,就很好的解决了这个问题,当我们想要切库只需要加一个sqlhelper类,就可以实现了。
总结:
第一开始,我们就想要将动态切库建库放在我们的EF框架中,结果碰了钉子,所以,我们有时候需要从最简单的开始做,当我们想清楚其中的原理的时候,我们就可以继续往下做了。凡是都要从简单的入手,这个还是很好用的。
原文地址:http://blog.csdn.net/qiumuxia0921/article/details/45955437