c# 下 根据Datatable的结构动态创建表
/// <summary>
/// 根据DataTable,生成建表语句
/// </summary>
/// <param name="table"></param>
/// <param name="tableName"></param>
/// <returns></returns>
private string GetCreateTableSql(DataTable table, string tableName)
{
var colList = new List<string>();
//遍历列,获取字段属性
foreach (DataColumn col in table.Columns)
{
var ty = TypeHelper.ConvertTypeToSqlDbType(col.DataType) + "";
var isautoIn = col.AutoIncrement ? $"IDENTITY({col.AutoIncrementSeed},{col.AutoIncrementStep})" : "";
var isnull = col.AllowDBNull ? "NULL" : "NOT NULL";
var colStr = $"[{col.ColumnName}] [{ty}] {isautoIn} {isnull} ";
colList.Add(colStr);
}
//拼接建表sql
var sql = string.Format(@" if object_id('{0}') is not null begin truncate table {0} drop table {0} end CREATE TABLE {0}(
{1}
) ON [PRIMARY];
", tableName, string.Join(",", colList));
return sql;
}
TypeHelper:
public class TypeHelper
{
public static SqlDbType ConvertTypeToSqlDbType(Type t)
{
//判断convertsionType类型是否为泛型,因为nullable是泛型类,
//判断convertsionType是否为nullable泛型类
if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
//如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
NullableConverter nullableConverter = new NullableConverter(t);
//将convertsionType转换为nullable对的基础基元类型
t = nullableConverter.UnderlyingType;
}
var code = Type.GetTypeCode(t);
switch (code)
{
case TypeCode.Boolean:
return SqlDbType.Bit;
case TypeCode.Byte:
return SqlDbType.TinyInt;
case TypeCode.DateTime:
return SqlDbType.DateTime;
//case TypeCode.DateTime:
// return SqlDbType.DateTime2;
case TypeCode.Decimal:
return SqlDbType.Decimal;
case TypeCode.Double:
return SqlDbType.Float;
case TypeCode.Int16:
return SqlDbType.SmallInt;
case TypeCode.Int32:
return SqlDbType.Int;
case TypeCode.Int64:
return SqlDbType.BigInt;
case TypeCode.SByte:
return SqlDbType.TinyInt;
case TypeCode.Single:
return SqlDbType.Real;
case TypeCode.String:
return SqlDbType.NVarChar;
case TypeCode.UInt16:
return SqlDbType.SmallInt;
case TypeCode.UInt32:
return SqlDbType.Int;
case TypeCode.UInt64:
return SqlDbType.BigInt;
case TypeCode.Object:
return SqlDbType.Variant;
default:
if (t == typeof(byte[]))
{
return SqlDbType.Binary;
}
return SqlDbType.Variant;
}
}
}
****************************************************************************************************************************************************************************************************************
任务很模糊,先做一个Demo,能实现就行。
1、提供数据库名,然后去创建。
2、指定数据库和数据表。当然还必须提供表字段和数据类型。去创建一张表。
在研究了一番之后,也就先用拼接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)
{
//创建一个名为testQuestion的库
CreateDataBase("questionType", "MSSql2012");
//用一个dictionary类型,来保存 数据库表的字段 和 数据类型
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("questionName", "varchar(20)");
dic.Add("content", "varchar(20)");
//在questionType库中创建一张名为xuanzeti的表
CreateDataTable("questionType", "xuanzeti", dic, "MSSql2012");
}