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");
    }

  • 相关阅读:
    7月15日考试 题解(链表+状压DP+思维题)
    暑假集训日记
    C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
    JavaSE 基础 第42节 局部内部类
    JavaSE 基础 第41节 匿名内部类
    JavaSE 基础 第40节 内部类概述
    JavaSE 基础 第39节 接口的应用
    JavaSE 基础 第38节 接口的实现
    JavaSE 基础 第37节 接口概述
    JavaSE 基础 第36节 抽象类概述与使用
  • 原文地址:https://www.cnblogs.com/lhxsoft/p/14810411.html
Copyright © 2011-2022 走看看