导读:在最近接手的项目(高效云平台)中,有一个需求是要当企业用户注册时,给其动态的新建一个库和表。刚开始接手的时候,是一点头绪都没有,然后查了一些资料,也问了问上一版本的师哥师姐,终于有了点头绪。目前是有两种方案,第一:应用SQL字符串拼接;第二,使用codeFirst。现在,总结第一种方案。

一、总体概述

既然是使用SQL字符串拼接,那么就涉及到我们操作SQL 创建数据库和表的逻辑了。当我们建库的时候,需要判断这个库是否存在,然后是不存在则创建。同理,建表也是如此。所以,在这里就涉及到了4个方法:1,判断欲建的数据库是否存在;2,判断欲建的表单是否存在;3,建库;4,建表。

在写好了这四个方法之后,就是对于方法的调用。

二、具体代码实例

2.1,判断数据库是否存在

<span style="font-family:KaiTi_GB2312;font-size:18px;">/// <summary>
/// 是否存在将要创建的数据库
/// </summary>
/// <param name="strDatabaseName">数据库名称</param>
/// <param name="strDbIP">数据库服务器连接地址</param>
/// <returns>存在返回true,不存在返回false</returns>
private bool isExsitDatabase(string strDatabaseName,string strDbIP)
{
SqlConnection conn = new SqlConnection(strDbIP);
conn.Open();
string strSql = " select * from master.dbo.sysdatabases where name " + "= '" + strDatabaseName + "'"; ;
SqlCommand cmd=new SqlCommand(strSql,conn);
SqlDataReader sdr = null;
DataTable dt = new DataTable();
using (sdr=cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
if (dt.Rows.Count > 0)
{
return true;
}
else {
return false;
}
}</span>

2.2,判断表单是否存在

<span style="font-family:KaiTi_GB2312;font-size:18px;">  /// <summary>
/// 是否存在欲要建立的表单
/// </summary>
/// <param name="StrDatabaseName">数据库名称</param>
/// <param name="strDbIP">数据库服务器连接地址</param>
/// <param name="strTableName">将要建立的表单名称</param>
/// <returns>存在返回true,不存在返回false</returns>
private bool isExsitTable(string StrDatabaseName, string strDbIP, string strTableName) {
SqlConnection conn = new SqlConnection(strDbIP);
conn.Open();
string strSQL = "use " + StrDatabaseName + " select 1 from sysobjects where id = object_id('" + strTableName + "') and type ='U'";
SqlCommand cmd = new SqlCommand(strSQL, conn);
int res = cmd.ExecuteNonQuery();
DataTable dt = new DataTable();
SqlDataReader sdr = null;
using (sdr=cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
if (dt.Rows.Count > 0)
{
return true;
}
else {
return false;
}
}</span>

2.3,建库

<span style="font-family:KaiTi_GB2312;font-size:18px;"> /// <summary>
/// 创建一个新库
/// </summary>
/// <param name="strDatabaseName">数据库名称</param>
/// <param name="strDbIP">数据库连接地址</param>
private void CreateDatabase(string strDatabaseName, string strDbIP) {
bool flag = isExsitDatabase(strDatabaseName, strDbIP);
if (flag == true)
{
throw new Exception("当前数据库已经存在,无法重复创建");
}
else
{
string strSQL = "Create database " + strDatabaseName;
SqlConnection conn = new SqlConnection(strDbIP);
conn.Open();
SqlCommand cmd = new SqlCommand(strSQL, conn);
cmd.ExecuteNonQuery();
conn.Close(); }
}</span>

2.4,建表

<span style="font-family:KaiTi_GB2312;font-size:18px;">/// <summary>
/// 在指定的数据库中创建表单
/// </summary>
/// <param name="strDatabaseName">数据库名称</param>
/// <param name="strDbIP">数据库连接地址</param>
/// <param name="strTableName">表单名称</param>
/// <param name="dic">表单内容</param>
private void CreateTable(string strDatabaseName, string strDbIP, string strTableName,Dictionary<string ,string >dic) {
bool flag = isExsitDatabase(strDatabaseName, strDbIP);
if (flag == false)
{
throw new Exception("当前数据库不存在存在,请先创建数据库");
}
if (isExsitTable(strDatabaseName,strDbIP,strTableName)==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 strSQL = "use " + strDatabaseName + " create table " + strTableName + "(" + content + ")";
SqlConnection conn = new SqlConnection(strDbIP);
conn.Open();
SqlCommand cmd = new SqlCommand(strSQL, conn);
cmd.ExecuteNonQuery();
conn.Close();
}
}</span>

2.4,具体应用

建表:

<span style="font-family:KaiTi_GB2312;font-size:18px;"> protected void btnCreateTable_Click(object sender, EventArgs e)
{
string strDefaultIP = TextBox1.Text;
string strMyIP = TextBox2.Text;
string strDatabaseName = "AngelTest";
string strConnMine = "data source=" + "**********" + "; initial catalog=" + strDatabaseName + " ;" + "persist security info=True;user id=sa;password=*******";
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("sex ", " varchar(2)");
dic.Add("name ", " varchar(8)");
string strTableName = "TestTable";
CreateTable(strDatabaseName,strConnMine,strTableName,dic); }</span>

建库:和建表差不多,就不展示了。

三、总结

如果说是用这种方式实现一个动态建库建表的话,这根本就不是什么新奇的东西。以前都学过这些,但是为什么自己一直还都不会熟练的应用,这是一个问题。接下来的博客,会介绍使用EF的codefirst方式,实现动态建库建表。

【ITOO 2】.NET 动态建库建表:使用SQL字符串拼接方式的更多相关文章

  1. 【ITOO 3】.NET 动态建库建表:实用EF框架提供的codeFirst实现动态建库

    导读:在上篇博客中,介绍了使用SQL字符拼接的方式,实现动态建库建表的方法.这样做虽然也能够实现效果,但是,太麻烦,而且,如果改动表结构,字段的话,会对代码修改很多.但是EF给我们提供了一种代码先行的 ...

  2. MySQL建库建表

    一直使用SQL SERVER 数据库:最近项目使用MY SQL感觉还是有一点不适应.不过熟悉之后就会好很多. MY SQL 安装之后会有一个管理工具MySQL Workbench 感觉不太好用,数据库 ...

  3. SQL Server建库-建表-建约束

    ----------------------------------------SQL Server建库-建表-建约束创建School数据库------------------------------ ...

  4. 使用T-sql建库建表建约束

    为什么要使用sql语句建库建表? 现在假设这样一个场景,公司的项目经过测试没问题后需要在客户的实际环境中进行演示,那就需要对数据进行移植,现在问题来了:客户的数据库版本和公司开发阶段使用的数据库不兼容 ...

  5. mysql那些事(4)建库建表编码的选择

    mysql建数据库或者建表的时候会遇到选择编码的问题,以前我们都是习惯性的选择utf8,但是在mysql在5.5.3版本后加了utf8mb4的编码,utf8mb4可以存4个字节Unicode,mb4就 ...

  6. C# 利用*.SQL文件自动建库建表等的类

    /// <summary> /// 自动建库建表 /// </summary> public class OperationSqlFile { SqlConnection sq ...

  7. Mysql建库建用户建表等常用命令

    格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输 ...

  8. oracle 11g 建库 建表 增 删 改 查 约束

    一.建库 1.(点击左上角带绿色+号的按钮) 2.(进入这个界面,passowrd为密码.填写完后点击下面一排的Test按钮进行测试,无异常就点击Connect) 二.建表 1-1. create t ...

  9. MySql 建库建表脚本

    1.建库 CREATE DATABASE test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 2.建表脚本 CREATE TABLE `c ...

随机推荐

  1. AJPFX辨析Java中运算符 ++ 和 += 的区别

    我们都知道Java中 ++ 和 +=1  都是把数字增加一后,把值赋给左边,那二者有什么区别呢? i+=1 运行的底层Heap申请一个区域存放i,在数据区域开劈一个区域存放1,2个内存段被数据被送入到 ...

  2. 【转】Iconfont

    Iconfont Iconfont 是指用字体文件取代图片文件,来展示图标.特殊字体等元素的一种方法.很多网站都会用它,比如手淘.新浪微博等. 在使用它之前,先来了解一下它的优缺点: 优点:(1)文件 ...

  3. 【学习笔记】彻底理解JS中的this

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  4. iOS 创建xcode插件

    苹果的"一个足以应付所有"策略使得它的产品越来越像一个难以下咽的药丸.尽管苹果已经将一些工作流带给了iOS/OS X的开发者,我们仍然希望通过插件来使得Xcode更加顺手! 虽然苹 ...

  5. C/C++ static

    C/C++中static关键字作用总结 1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全 ...

  6. 两个已排序数组的合并-C语言

    最近在纸上写一个已排序数组的合并时,花了超过预期的时间.仔细想想,这种要放到毕业找工作那会两下就出来了,原因还在于工作后对基础没有重视,疏于练习. 说开一点,现在搜索引擎的发达确实给问题的解决带来了便 ...

  7. qt sql多重条件查询简便方法

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7457312.html 程序设计过程中,经常要涉及到查询,并且有很多条件,且条件可为空,如果逐个判断,会有很多情 ...

  8. js里面Object的一些方法

    1.Object.freeze() 阻止修改现有属性的特性和值,并阻止添加新属性两种用法:Object.freeze( { } ) 和 Object.freeze( object ) <scri ...

  9. js生成随机的uuid

    function generateUUID() { var d = new Date().getTime(); if(window.performance && typeof wind ...

  10. Windows下使用ffmpeg与java实现截取视频缩略图

    [ffmpeg.exe可执行文件获取]: 网上搜索后得到编译好的ffmpeg文件,下载地址:http://download.csdn.net/source/453719 [安装]: 将下载的文件解压, ...