引言
前几天在要把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框架中,结果碰了钉子,所以,我们有时候需要从最简单的开始做,当我们想清楚其中的原理的时候,我们就可以继续往下做了。凡是都要从简单的入手,这个还是很好用的。