zoukankan      html  css  js  c++  java
  • 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");
    }

  • 相关阅读:
    软件工程——小学生的四则运算(java)
    软件工程——小学生的四则运算
    利用python实现微信小项目
    SQLite3数据库
    爬虫———python
    模拟足球训练
    文件的转换
    学习成绩雷达图
    <dvi>
    vue 锚点跳转防止路径变化后,刷新页面报错的问题
  • 原文地址:https://www.cnblogs.com/lhxsoft/p/14810411.html
Copyright © 2011-2022 走看看