• DbHelperSQL


    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    namespace System {
        [System.Diagnostics.DebuggerDisplay("connectionString={connectionString}")]
        public abstract class DbHelperSQL {
            public static string connectionString = AppConfig.connString.ToString();
            public DbHelperSQL() {
            }
            #region 公用方法
            public static bool ColumnExists(string tableName,string columnName) {
                string sql = "select count(1) from syscolumns where [id]=object_id('" + tableName + "') and [name]='" + columnName + "'";
                object res = GetSingle(sql);
                if(res == null) {
                    return false;
                }
                return Convert.ToInt32(res) > 0;
            }
            public static int GetMaxID(string FieldName,string TableName) {
                string strsql = "select max(" + FieldName + ")+1 from " + TableName;
                object obj = GetSingle(strsql);
                if(obj == null) {
                    return 1;
                } else {
                    return int.Parse(obj.ToString());
                }
            }
            public static bool Exists(string strSql) {
                object obj = GetSingle(strSql);
                int cmdresult;
                if((Object.Equals(obj,null)) || (Object.Equals(obj,System.DBNull.Value))) {
                    cmdresult = 0;
                } else {
                    cmdresult = int.Parse(obj.ToString());
                }
                if(cmdresult == 0) {
                    return false;
                } else {
                    return true;
                }
            }
            public static bool IsSysObjects(string TableName) {
                string strsql = "select count(*) from sysobjects where id = object_id(N'[" + TableName + "]') ";
                object obj = GetSingle(strsql);
                int cmdresult;
                if((Object.Equals(obj,null)) || (Object.Equals(obj,System.DBNull.Value))) {
                    cmdresult = 0;
                } else {
                    cmdresult = int.Parse(obj.ToString());
                }
                if(cmdresult == 0) {
                    return false;
                } else {
                    return true;
                }
            }
            public static bool Exists(string strSql,params SqlParameter[] cmdParms) {
                object obj = GetSingle(strSql,cmdParms);
                int cmdresult;
                if((Object.Equals(obj,null)) || (Object.Equals(obj,System.DBNull.Value))) {
                    cmdresult = 0;
                } else {
                    cmdresult = int.Parse(obj.ToString());
                }
                if(cmdresult == 0) {
                    return false;
                } else {
                    return true;
                }
            }
            #endregion
            #region  执行简单SQL语句
            public static int ExecuteSql(string SQLString) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    using(SqlCommand cmd = new SqlCommand(SQLString,connection)) {
                        connection.Open();
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    }
                }
            }
            public static int ExecuteSqlByTime(string SQLString,int Times) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    using(SqlCommand cmd = new SqlCommand(SQLString,connection)) {
                        connection.Open();
                        cmd.CommandTimeout = Times;
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    }
                }
            }
            public static int ExecuteSqlTran(List<String> SQLStringList) {
                using(SqlConnection conn = new SqlConnection(connectionString)) {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    SqlTransaction tx = conn.BeginTransaction();
                    cmd.Transaction = tx;
                    try {
                        int count = 0;
                        for(int n = 0;n < SQLStringList.Count;n++) {
                            string strsql = SQLStringList[n];
                            if(strsql.Trim().Length > 1) {
                                cmd.CommandText = strsql;
                                count += cmd.ExecuteNonQuery();
                            }
                        }
                        tx.Commit();
                        return count;
                    } catch {
                        tx.Rollback();
                        return 0;
                    }
                }
            }
            public static void Addbatches(List<String> SQLStringList) {
                //分批执行
                while(SQLStringList.Count > 0) {
                    var tempParam = SQLStringList.Take(50).ToList();
                    ExecuteSqlTran(tempParam);
                    SQLStringList.RemoveRange(0,tempParam.Count);
                }
            }
            public static void ExecuteSql(SQLParma parma) {
                ExecuteSql(parma.Sql,parma.Sp);
            }
            public static int ExecuteSql(string SQLString,string content) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    SqlCommand cmd = new SqlCommand(SQLString,connection);
                    System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content",SqlDbType.NText);
                    myParameter.Value = content;
                    cmd.Parameters.Add(myParameter);
                    try {
                        connection.Open();
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    } finally {
                        cmd.Dispose();
                        connection.Close();
                    }
                }
            }
            public static object ExecuteSqlGet(string SQLString,string content) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    SqlCommand cmd = new SqlCommand(SQLString,connection);
                    System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content",SqlDbType.NText);
                    myParameter.Value = content;
                    cmd.Parameters.Add(myParameter);
                    try {
                        connection.Open();
                        object obj = cmd.ExecuteScalar();
                        if((Object.Equals(obj,null)) || (Object.Equals(obj,System.DBNull.Value))) {
                            return null;
                        } else {
                            return obj;
                        }
                    } finally {
                        cmd.Dispose();
                        connection.Close();
                    }
                }
            }
            public static int ExecuteSqlInsertImg(string SQLString,byte[] fs) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    SqlCommand cmd = new SqlCommand(SQLString,connection);
                    System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@fs",SqlDbType.Image);
                    myParameter.Value = fs;
                    cmd.Parameters.Add(myParameter);
                    try {
                        connection.Open();
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    } finally {
                        cmd.Dispose();
                        connection.Close();
                    }
                }
            }
            public static object GetSingle(string SQLString) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    using(SqlCommand cmd = new SqlCommand(SQLString,connection)) {
                        connection.Open();
                        object obj = cmd.ExecuteScalar();
                        if((Object.Equals(obj,null)) || (Object.Equals(obj,System.DBNull.Value))) {
                            return null;
                        } else {
                            return obj;
                        }
                    }
                }
            }
            public static object GetSingle(string SQLString,int Times) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    using(SqlCommand cmd = new SqlCommand(SQLString,connection)) {
                        connection.Open();
                        cmd.CommandTimeout = Times;
                        object obj = cmd.ExecuteScalar();
                        if((Object.Equals(obj,null)) || (Object.Equals(obj,System.DBNull.Value))) {
                            return null;
                        } else {
                            return obj;
                        }
                    }
                }
            }
            public static SqlDataReader ExecuteReader(string SQLString) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    using(SqlCommand cmd = new SqlCommand(SQLString,connection)) {
                        connection.Open();
                        SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                        return myReader;
                    }
                }
            }
            public static DataSet Query(string SQLString) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    DataSet ds = new DataSet();
                    connection.Open();
                    SqlDataAdapter command = new SqlDataAdapter(SQLString,connection);
                    command.Fill(ds,"ds");
                    return ds;
                }
            }
            public static DataSet Query(string SQLString,int Times) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    DataSet ds = new DataSet();
                    connection.Open();
                    SqlDataAdapter command = new SqlDataAdapter(SQLString,connection);
                    command.SelectCommand.CommandTimeout = Times;
                    command.Fill(ds,"ds");
                    return ds;
                }
            }
            public static DataTable ExecuteTable(string SQLString) {
                var ds = Query(SQLString);
                if(ds != null && ds.Tables.Count > 0) {
                    return ds.Tables[0];
                } else {
                    return null;
                }
            }
            public static DataRow ExecuteRow(string SQLString) {
                var ds = Query(SQLString);
                if(ds != null && ds.Tables.Count > 0) {
                    if(ds.Tables[0].Rows.Count > 0) {
                        return ds.Tables[0].Rows[0];
                    } else {
                        return null;
                    }
                } else {
                    return null;
                }
            }
            #endregion
            #region 执行带参数的SQL语句
            public static int ExecuteSql(string SQLString,params SqlParameter[] cmdParms) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    using(SqlCommand cmd = new SqlCommand()) {
                        PrepareCommand(cmd,connection,null,SQLString,cmdParms);
                        int rows = cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                        return rows;
                    }
                }
            }
            public static void ExecuteSqlTran(Hashtable SQLStringList) {
                using(SqlConnection conn = new SqlConnection(connectionString)) {
                    conn.Open();
                    using(SqlTransaction trans = conn.BeginTransaction()) {
                        SqlCommand cmd = new SqlCommand();
                        try {
                            foreach(DictionaryEntry myDE in SQLStringList) {
                                string cmdText = myDE.Key.ToString();
                                SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
                                PrepareCommand(cmd,conn,trans,cmdText,cmdParms);
                                int val = cmd.ExecuteNonQuery();
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                        } catch(System.Data.SqlClient.SqlException ex) {
                            Logger.LogError("DbHelperSQL ExecuteSqlTran connectionString=" + connectionString,ex);
                            trans.Rollback();
                        }
                    }
                }
            }
            public static void ExecuteSqlTranWithIndentity(Hashtable SQLStringList) {
                using(SqlConnection conn = new SqlConnection(connectionString)) {
                    conn.Open();
                    using(SqlTransaction trans = conn.BeginTransaction()) {
                        SqlCommand cmd = new SqlCommand();
                        try {
                            int indentity = 0;
                            foreach(DictionaryEntry myDE in SQLStringList) {
                                string cmdText = myDE.Key.ToString();
                                SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
                                foreach(SqlParameter q in cmdParms) {
                                    if(q.Direction == ParameterDirection.InputOutput) {
                                        q.Value = indentity;
                                    }
                                }
                                PrepareCommand(cmd,conn,trans,cmdText,cmdParms);
                                int val = cmd.ExecuteNonQuery();
                                foreach(SqlParameter q in cmdParms) {
                                    if(q.Direction == ParameterDirection.Output) {
                                        indentity = Convert.ToInt32(q.Value);
                                    }
                                }
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                        } catch {
                            trans.Rollback();
                            throw;
                        }
                    }
                }
            }
            public static object GetSingle(string SQLString,params SqlParameter[] cmdParms) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    using(SqlCommand cmd = new SqlCommand()) {
                        PrepareCommand(cmd,connection,null,SQLString,cmdParms);
                        object obj = cmd.ExecuteScalar();
                        cmd.Parameters.Clear();
                        if((Object.Equals(obj,null)) || (Object.Equals(obj,System.DBNull.Value))) {
                            return null;
                        } else {
                            return obj;
                        }
                    }
                }
            }
            public static SqlDataReader ExecuteReader(string SQLString,params SqlParameter[] cmdParms) {
                SqlConnection connection = new SqlConnection(connectionString);
                SqlCommand cmd = new SqlCommand();
                PrepareCommand(cmd,connection,null,SQLString,cmdParms);
                SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return myReader;
            }
            public static DataSet Query(string SQLString,params SqlParameter[] cmdParms) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    SqlCommand cmd = new SqlCommand();
                    PrepareCommand(cmd,connection,null,SQLString,cmdParms);
                    using(SqlDataAdapter da = new SqlDataAdapter(cmd)) {
                        DataSet ds = new DataSet();
                        da.Fill(ds,"ds");
                        cmd.Parameters.Clear();
                        return ds;
                    }
                }
            }
            private static void PrepareCommand(SqlCommand cmd,SqlConnection conn,SqlTransaction trans,string cmdText,SqlParameter[] cmdParms) {
                if(conn.State != ConnectionState.Open)
                    conn.Open();
                cmd.Connection = conn;
                cmd.CommandText = cmdText;
                if(trans != null)
                    cmd.Transaction = trans;
                cmd.CommandType = CommandType.Text;
                if(cmdParms != null) {
                    foreach(SqlParameter parameter in cmdParms) {
                        if((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                            (parameter.Value == null)) {
                            parameter.Value = DBNull.Value;
                        }
                        cmd.Parameters.Add(parameter);
                    }
                }
            }
            #endregion
            #region 存储过程操作
            public static SqlDataReader RunProcedure(string storedProcName,IDataParameter[] parameters) {
                SqlConnection connection = new SqlConnection(connectionString);
                SqlDataReader returnReader;
                connection.Open();
                SqlCommand command = BuildQueryCommand(connection,storedProcName,parameters);
                command.CommandType = CommandType.StoredProcedure;
                returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);
                return returnReader;
            }
            public static DataSet RunProcedure(string storedProcName,IDataParameter[] parameters,string tableName) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    DataSet dataSet = new DataSet();
                    connection.Open();
                    SqlDataAdapter sqlDA = new SqlDataAdapter();
                    sqlDA.SelectCommand = BuildQueryCommand(connection,storedProcName,parameters);
                    sqlDA.Fill(dataSet,tableName);
                    connection.Close();
                    return dataSet;
                }
            }
            public static DataSet RunProcedure(string storedProcName,IDataParameter[] parameters,string tableName,int Times) {
                using(SqlConnection connection = new SqlConnection(connectionString)) {
                    DataSet dataSet = new DataSet();
                    connection.Open();
                    SqlDataAdapter sqlDA = new SqlDataAdapter();
                    sqlDA.SelectCommand = BuildQueryCommand(connection,storedProcName,parameters);
                    sqlDA.SelectCommand.CommandTimeout = Times;
                    sqlDA.Fill(dataSet,tableName);
                    connection.Close();
                    return dataSet;
                }
            }
            private static SqlCommand BuildQueryCommand(SqlConnection connection,string storedProcName,IDataParameter[] parameters) {
                SqlCommand command = new SqlCommand(storedProcName,connection);
                command.CommandType = CommandType.StoredProcedure;
                foreach(SqlParameter parameter in parameters) {
                    if(parameter != null) {
                        if((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                            (parameter.Value == null)) {
                            parameter.Value = DBNull.Value;
                        }
                        command.Parameters.Add(parameter);
                    }
                }
                return command;
            }
            #endregion
            #region  MethodEx
            public static bool OpenDb(string connectionString) {
                try {
                    using(SqlConnection connection = new SqlConnection(connectionString)) {
                        using(SqlCommand cmd = new SqlCommand("select GETDATE()",connection)) {
                            connection.Open();
                            object obj = cmd.ExecuteScalar();
                            if((Object.Equals(obj,null)) || (Object.Equals(obj,System.DBNull.Value))) {
                                return false;
                            } else {
                                return true;
                            }
                        }
                    }
                } catch(Exception ex) {
                    return false;
                }
            }
            public static void SqlBulkCopyInsert(DataTable dtData) {
                using(SqlBulkCopy sqlRevdBulkCopy = new SqlBulkCopy(connectionString)) {
                    sqlRevdBulkCopy.DestinationTableName = string.IsNullOrWhiteSpace(dtData.TableName) ? "tempdatatable_admin_" + DateTime.Now.ToShortDateString() : dtData.TableName;
                    sqlRevdBulkCopy.NotifyAfter = dtData.Rows.Count;
                    sqlRevdBulkCopy.WriteToServer(dtData);
                    sqlRevdBulkCopy.Close();
                }
            }
            public static string Exec(string sql) {
                string show = "";
                using(SqlConnection con = new SqlConnection(connectionString)) {
                    try {
                        con.Open();
                        SqlCommand Com = new SqlCommand(sql,con);
                        show = Com.ExecuteScalar().ToString();
                    } catch {
                        show = "";
                    }
                    return show.ToString();
                }
            }
            public static SqlParameter[] GetSqlParameter(List<SqlParam> sqlParams) {
                List<SqlParameter> L_pars = new List<SqlParameter>();
                foreach(var item in sqlParams) {
                    L_pars.Add(new SqlParameter(item.ParamName,item.ParamValue));
                }
                return L_pars.ToArray();
            }
            public static DataTable ExecuteTable(string SQLString,params SqlParameter[] cmdParms) {
                var ds = Query(SQLString,cmdParms);
                if(ds != null && ds.Tables.Count > 0) {
                    return ds.Tables[0];
                } else {
                    return null;
                }
            }
            public static T GetSingle<T>(string commandText,params SqlParameter[] parms) {
                object result = GetSingle(commandText,parms);
                if(result != null) {
                    return (T)Convert.ChangeType(result,typeof(T));
                    ;
                }
                return default(T);
            }
            public static string GetFieldValue(string fieldName,string tableName,string strWhere) {
                StringBuilder strSql = new StringBuilder();
                strSql.Append("SELECT " + fieldName + " FROM " + tableName + " ");
                if(!string.IsNullOrWhiteSpace(strWhere)) {
                    strSql.Append(" WHERE " + strWhere);
                }
                return DbHelperSQL.GetSingle<string>(strSql.ToString());
            }
            public static DataTable Get_PagingTable(string where,string ls_tablesql,string column,string sort,int page,int pageCount,SqlParameter[] parms) {
                string sql = @"select top (" + pageCount + ") * from (" + ls_tablesql + where + " ) as aaa   where aaa.RowId between ((" + page + "-1)*" + pageCount + "+1) and (" + page + "*" + pageCount + ") " + "order by  " + column + " " + sort + "";
                return ExecuteTable(sql,parms);
            }
            public static DataTable GetListByPage(string strWhere,string orderby,int startIndex,int endIndex,string tableName,params SqlParameter[] cmdParms) {
                int i_inde, i_end;
                i_end = startIndex * endIndex;
                i_inde = (startIndex - 1) * endIndex + 1;
                StringBuilder strSql = new StringBuilder();
                strSql.Append("SELECT * FROM ( ");
                strSql.Append(" SELECT ROW_NUMBER() OVER (");
                if(!string.IsNullOrWhiteSpace(orderby)) {
                    strSql.Append("order by T." + orderby);
                } else {
                    strSql.Append("order by T.Id desc");
                }
                strSql.Append(")AS Row, T.*  from " + tableName + " T ");
                if(!string.IsNullOrWhiteSpace(strWhere)) {
                    strSql.Append(" WHERE " + strWhere);
                }
                strSql.Append(" ) TT");
                strSql.AppendFormat(" WHERE TT.Row between {0} and {1}",i_inde,i_end);
                return ExecuteTable(strSql.ToString(),cmdParms);
            }
            #endregion
            #region DataTable转换到List
            public static IList<T> ExecuteList<T>(string SQLString) {
                var ds = Query(SQLString);
                if(ds != null && ds.Tables.Count > 0) {
                    return ToList<T>(ds.Tables[0]);
                } else {
                    return null;
                }
            }
            public static DataTable ToDataTable<T>(IEnumerable<T> collection) {
                var props = typeof(T).GetProperties();
                var dt = new DataTable();
                dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name,p.PropertyType)).ToArray());
                if(collection.Count() > 0) {
                    for(int i = 0;i < collection.Count();i++) {
                        ArrayList tempList = new ArrayList();
                        foreach(PropertyInfo pi in props) {
                            object obj = pi.GetValue(collection.ElementAt(i),null);
                            tempList.Add(obj);
                        }
                        object[] array = tempList.ToArray();
                        dt.LoadDataRow(array,true);
                    }
                }
                return dt;
            }
            public static IList<T> ToList<T>(DataTable table) {
                if(table == null) {
                    return null;
                }
                List<DataRow> rows = new List<DataRow>();
                foreach(DataRow row in table.Rows) {
                    rows.Add(row);
                }
                return ToList<T>(rows);
            }
            public static IList<T> ToList<T>(IList<DataRow> rows) {
                IList<T> list = null;
                if(rows != null) {
                    list = new List<T>();
                    foreach(DataRow row in rows) {
                        T item = ToModel<T>(row);
                        list.Add(item);
                    }
                }
                return list;
            }
            public static T ToModel<T>(DataRow row) {
                T obj = default(T);
                if(row != null) {
                    obj = Activator.CreateInstance<T>();
                    foreach(DataColumn column in row.Table.Columns) {
                        PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName);
                        try {
                            if(!prop.CanWrite) {
                                continue;
                            }
                            object value = row[column.ColumnName];
                            if(value != DBNull.Value) {
                                prop.SetValue(obj,value,null);
                            }
                        } catch(Exception ex) {
                            Logger.LogError(column.ColumnName + "字段类型与实体类型不匹配 " + ex.Message);
                        }
                    }
                }
                return obj;
            }
            #endregion
            #region DbBackuper
            public Result BackupDatabase(string databaseName,string filename,bool isErase) {
                var result = DealFile(filename,isErase);
                if(result.Success) {
                    try {
                        string strCmd = "BACKUP DATABASE " + databaseName + " TO DISK = " + filename + "";
                        ExecuteSql(strCmd);
                    } catch(Exception ex) {
                        return new Result(ex);
                    }
                    return new Result(true);
                }
                return result;
            }
            /// <summary>
            /// 处理文件
            /// </summary>
            /// <param name="filename">文件名</param>
            /// <param name="isErase">是否擦除</param>
            /// <returns></returns>
            private static Result DealFile(string filename,bool isErase) {
                try {
                    if(File.Exists(filename)) {
                        if(!isErase) {
                            return new Result("文件已经存在!");
                        } else {
                            File.Delete(filename);
                        }
                    }
                    string directory = Path.GetDirectoryName(filename);
                    string file = Path.GetFileName(filename);
                    if(!Directory.Exists(directory)) {
                        Directory.CreateDirectory(directory);
                    }
                    return new Result(true);
                } catch(Exception ex) {
                    return new Result(ex);
                }
            }
            #endregion
            #region DbScriptBuilder
    
            #endregion
            #region DbObject
            public void ExtendedProperty(bool addbyupdate,string describe,string tableName,string columnName = null) {
                string sql_propertyInfo = @"EXEC sys.{0} N'MS_Description',N'{1}',N'SCHEMA',N'dbo',N'TABLE',N'{2}',N'COLUMN',N'{3}'";//字段说明
                string sql_propertyInfo1 = @"EXEC sys.{0} N'MS_Description',N'{1}',N'SCHEMA',N'dbo',N'TABLE',N'{2}'";//表说明
                string sql = "";
                if(addbyupdate) {
                    if(columnName == null || columnName.Length == 0) {
                        sql = string.Format(sql_propertyInfo1,"sp_updateextendedproperty",describe,tableName);
                    } else {
                        sql = string.Format(sql_propertyInfo,"sp_updateextendedproperty",describe,tableName,columnName);
                    }
                } else {
                    if(columnName == null || columnName.Length == 0) {
                        sql = string.Format(sql_propertyInfo1,"sp_addextendedproperty",describe,tableName);
                    } else {
                        sql = string.Format(sql_propertyInfo,"sp_addextendedproperty",describe,tableName,columnName);
                    }
                }
                ExecuteSql(sql);
            }
            public List<TableColumn> GetColumnInfoList(string tableName) {
                if(string.IsNullOrWhiteSpace(tableName)) return null;
                return Utils.GetOrAddCache(tableName,() => {
                    string sql = @"SELECT 
    d.name  AS 表名, 
    isnull(f.value, '') AS 表说明, 
    a.colorder AS 字段序号, 
    a.name AS 字段名,ISNULL(g.[value], '') AS 字段说明, 
    CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 THEN '√' ELSE '' END AS 标识, 
    CASE WHEN EXISTS(SELECT 1  FROM dbo.sysindexes si INNER JOIN 
    dbo.sysindexkeys sik ON si.id = sik.id AND si.indid = sik.indid INNER JOIN dbo.syscolumns sc 
    ON sc.id = sik.id AND sc.colid = sik.colid INNER JOIN  dbo.sysobjects so 
    ON so.name = si.name AND so.xtype = 'PK' WHERE sc.id = a.id AND sc.colid = a.colid) THEN '√' ELSE '' END AS 主键, 
    b.name AS 类型, a.length AS 长度, COLUMNPROPERTY(a.id, a.name, 'PRECISION')AS 精度, 
    ISNULL(COLUMNPROPERTY(a.id, a.name, 'Scale'), 0) AS 小数位数,CASE WHEN a.isnullable = 1 THEN '√' ELSE '' END AS 允许空, 
    ISNULL(e.text, '') AS 默认值 FROM dbo.syscolumns a LEFT OUTER JOIN   
    dbo.systypes b ON a.xtype = b.xusertype INNER JOIN dbo.sysobjects d ON a.id = d.id AND d.xtype = 'U' AND  
    d.status >= 0 LEFT OUTER JOIN   dbo.syscomments e ON a.cdefault = e.id LEFT OUTER JOIN sys.extended_properties g 
    ON a.id = g.major_id AND a.colid = g.minor_id AND  g.name = 'MS_Description' LEFT OUTER JOIN  
    sys.extended_properties f ON d.id = f.major_id AND f.minor_id = 0 AND f.name = 'MS_Description'  ";
                    if(!string.IsNullOrWhiteSpace(tableName)) {
                        sql = sql + " where d.name='" + tableName + "'";
                    }
                    var list = new List<TableColumn>();
                    var dt = ExecuteTable(string.Format(sql));
                    foreach(DataRow row in dt.Rows) {
                        var tc = new TableColumn();
                        tc.TableName = row["表名"].ToString();
                        tc.ColumnName = row["字段名"].ToString();
                        tc.ColumnRemark = row["字段说明"].ToString();
                        tc.ColumnType = row["类型"].ToString();
                        tc.DefaultValue = row["默认值"].ToString();
                        tc.MaxLength = Utils.GetObjTranNull<int>(row["长度"].ToString());
                        tc.ColumnOrder = Utils.GetObjTranNull<int>(row["字段序号"]);
                        if(row["标识"].ToString().Length > 0) {
                            tc.IsIdentity = true;
                        }
                        if(row["主键"].ToString() == "") {
                            tc.IsPrimaryKey = true;
                        }
                        if(row["允许空"].ToString() == "") {
                            tc.IsNullable = true;
                        }
                        list.Add(tc);
                    }
                    return list;
                });
            }
            #endregion
        }
    }

    作者:罗敏贵
    邮箱:minguiluo@163.com
    QQ群:34178394 建群 主要是寻找志同道合的人士一起学习和讨论自己的所学所思
    出处:http://luomingui.cnblogs.com/
    说明:专注于微软平台项目架构、熟悉设计模式、架构设计、敏捷个人和项目管理。现主要从事WinForm、ASP.NET、等方面的项目开发、架构、管理工作。文章为作者平时里的思考和练习,可能有不当之处,请博客园的园友们多提宝贵意见。
    知识共享许可协议本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

  • 相关阅读:
    Django基础
    MySQL(索引)
    MySQL(进阶部分)
    MySQL(Python+ORM)
    JavaScript的对象
    abc
    Let's Encrypt,免费好用的 HTTPS 证书
    Java调试那点事
    Memcache mutex 设计模式
    从 Nginx 默认不压缩 HTTP/1.0 说起
  • 原文地址:https://www.cnblogs.com/luomingui/p/12564645.html
Copyright © 2020-2023  润新知