[置顶] C#解决 动态创建库、动态创建表

    在1110号。我们开始着手做高校平台这个项目,这个项目里面,有很多的子系统。权限系统、基础系统、考试系统……

   既然是高校平台,固然不只是1个学校用的,可以很多的学校公用。既然如此,每一个学校所要保存的数据固然不可能寄存在1个库中。1个学校1个库,那末有几个学校用呢?未知。库的数量得视情况而定。动态创建库可以解决这类问题。

 

   固然,系统有很多。但是个人只是参与子系统的开发。在之前1直在考试系统里面打杂。这个项目分配下来了以后,我也就开始由打杂换了1种方式去打杂.

   在做项目的进程中,任务的分配是非常明确的。甚么时间干甚么事情,每天的任务等等。加上模块的划分,各系统之间的耦合要低等原则。这就要求底层的东西要封装的特别好,重用性很高。

   由于之前1直都是在做题型和题库
这几个模块。相对其他的模块来讲,题型这里更加抽象。由于每一个题型都有不同的特点。需要保存的方式也不同。至于题库,那更是得需要题型提供支持啦。

   总不能每一个题型写1遍。那还不得累死。

   在做需求的时候,就已知道,题型的这1部份是活的。这就需要1种新的方法――动态创建表。

 

动态生成库,生成表。只知道用这些能解决以上的问题。

 

   在没有接触这些东西之前,画题型的原型……不会画。画题型的类图……把每一个题型都画出来?累死不说,还不能扩大。

   这样做出来的系统,要想添加题型,改代码那是肯定的了。

 

   碰巧,前1阵子被组长调出去了,所要做的任务,也非常的合适。就是要把创建数据库的方法和创建数据库表的方法封装起来。

   这东西做完,对理解题型需求是非常有用的。

 

任务很模糊,先做1个Demo,能实现就行。

1、提供数据库名,然后去创建。

2、指定数据库和数据表。固然还必须提供表字段和数据类型。去创建1张表。

 

 

在研究了1番以后,也就先用拼接sql语句的方法来做吧。有其他方法的请指出。

 

这些东西都被封装在底层了。所以动态创建库的方法
都需要用到SqlHelper。这里就不写了。如果需要的话,文章末尾有下载地址。

 

#region 判断数据库是不是存在
/// <summary>
/// 判断数据库是不是存在
/// </summary>
/// <param name="db">数据库的名称</param>
/// <param name="connKey">数据库的连接Key</param>
/// <returns>true:表示数据库已存在;false,表示数据库不存在</returns>
public Boolean IsDBExist(string db,string connKey)
{
SQLHelper helper = SQLHelper.GetInstance();

string connToMaster = ConfigurationManager.ConnectionStrings[connKey].ToString();
string createDbStr = " select * from master.dbo.sysdatabases where name " + "= '" + db + "'";

DataTable dt= helper.ExecuteQuery(createDbStr, CommandType.Text);
if (dt.Rows.Count==0)
{
return false;
}
else
{
return true;
}
}
#endregion

#region 判断数据库中,指定表是不是存在
/// <summary>
/// 判断数据库表是不是存在
/// </summary>
/// <param name="db">数据库</param>
/// <param name="tb">数据表名</param>
/// <param name="connKey">连接数据库的key</param>
/// <returns>true:表示数据表已存在;false,表示数据表不存在</returns>
public Boolean IsTableExist(string db,string tb, string connKey)
{
SQLHelper helper = SQLHelper.GetInstance();

string connToMaster = ConfigurationManager.ConnectionStrings[connKey].ToString();
string createDbStr = "use " + db + " select 1 from sysobjects where id = object_id('" + tb + "') and type = 'U'";

//在指定的数据库中 查找 该表是不是存在
DataTable dt = helper.ExecuteQuery(createDbStr, CommandType.Text);
if (dt.Rows.Count == 0)
{
return false;
}
else
{
return true;
}

}
#endregion

#region 创建数据库
/// <summary>
/// 创建数据库
/// </summary>
/// <param name="db">数据库名称</param>
/// <param name="connKey">连接数据库的key</param>
public void CreateDataBase(string db, string connKey)
{
SQLHelper helper = SQLHelper.GetInstance();
//符号变量,判断数据库是不是存在
Boolean flag = IsDBExist(db, connKey);

//如果数据库存在,则抛出
if (flag == true)
{
throw new Exception("数据库已存在!");
}
else
{
//数据库不存在,创建数据库
string connToMaster = ConfigurationManager.ConnectionStrings[connKey].ToString();
string createDbStr = "Create database " + db;
helper.ExecuteNonQuery(createDbStr, CommandType.Text);
}

}
#endregion

#region 创建数据库表
/// <summary>
/// 在指定的数据库中,创建数据表
/// </summary>
/// <param name="db">指定的数据库</param>
/// <param name="dt">要创建的数据表</param>
/// <param name="dic">数据表中的字段及其数据类型</param>
/// <param name="connKey">数据库的连接Key</param>
public void CreateDataTable(string db, string dt, Dictionary<string, string> dic, string connKey)
{
SQLHelper helper = SQLHelper.GetInstance();

string connToMaster = ConfigurationManager.ConnectionStrings[connKey].ToString();

//判断数据库是不是存在
if (IsDBExist(db, connKey) == false)
{
throw new Exception("数据库不存在!");
}

//如果数据库表存在,则抛出毛病
if (IsTableExist(db, dt, connKey) == true)
{
throw new Exception("数据库表已存在!");
}
else//数据表不存在,创建数据表
{
//拼接字符串,(该串为创建内容)
string content = "serial int identity(1,1) primary key ";
//取出dic中的内容,进行拼接
List<string> test = new List<string>(dic.Keys);
for (int i = 0; i < dic.Count(); i++)
{
content = content + " , " + test[i] + " " + dic[test[i]];
}

//其后判断数据表是不是存在,然后创建数据表
string createTableStr = "use " + db + " create table " + dt + " (" + content + ")";

helper.ExecuteNonQuery(createTableStr, CommandType.Text);
}
}
#endregion

以上就是与动态创建库,创建表相干的函数。

下面这里是调用

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//创建1个名为testQuestion的库
CreateDataBase("questionType", "MSSql2012");

//用1个dictionary类型,来保存 数据库表的字段 和 数据类型
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("questionName", "varchar(20)");
dic.Add("content", "varchar(20)");

//在questionType库中创建1张名为xuanzeti的表
CreateDataTable("questionType", "xuanzeti", dic, "MSSql2012");
}
}

下面是履行前后的效果:

 

 

    用拼接Sql语句的方式封装非常容易理解。作为底层的东西,重用性是非常高的。所以这1块也就作为初版了。

    如果有更好的方式,请联系我。

    Demo下载地址:http://download.csdn.net/detail/zc474235918/8207857

 

 

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » [置顶] C#解决 动态创建库、动态创建表

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡