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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM