[fix]Config创建默认配置文件的开关Runtime.CreateConfigOnMissing,仅需对自动创建生效,而不应该阻止用户主动Save
智能大石头 authored at 2024-08-09 00:30:41 石头 committed at 2024-08-10 14:22:24
11.74 KiB
X
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Reflection;
using System.Web.UI.WebControls;
using NewLife.Reflection;
using NewLife.Web;
using XCode.DataAccessLayer;

public partial class Admin_System_WebDb : MyEntityList
{
    protected void Page_Load(object sender, EventArgs e)
    {
        lbResult.Text = null;

        if (!IsPostBack)
        {
            if (DAL.ConnStrs != null && DAL.ConnStrs.Count > 0)
            {
                foreach (String item in DAL.ConnStrs.Keys)
                {
                    ddlConn.Items.Add(new ListItem(item, item));
                }
                ddlConn_SelectedIndexChanged(null, null);
            }
        }

        txtBak.Text = String.Format("..\\Backup\\{0}_{1:yyyyMMddHHmmss}.zip", ddlConn.SelectedItem, DateTime.Now);
    }

    DAL GetDAL()
    {
        if (String.IsNullOrEmpty(ddlConn.SelectedValue)) return null;

        try
        {
            return DAL.Create(ddlConn.SelectedValue);
        }
        catch (Exception ex)
        {
            WebHelper.Alert(ex.ToString());
            return null;
        }
    }

    protected void ddlConn_SelectedIndexChanged(object sender, EventArgs e)
    {
        DAL dal = GetDAL();
        if (dal == null) return;

        try
        {
            txtConnStr.Text = dal.ConnStr;

            // 数据表
            ddlTable.Items.Clear();
            IList<IDataTable> tables = dal.Tables;
            if (tables != null && tables.Count > 0)
            {
                foreach (IDataTable item in tables)
                {
                    String des = String.IsNullOrEmpty(item.Description) ? item.TableName : String.Format("{1}({0})", item.TableName, item.Description);
                    ddlTable.Items.Add(new ListItem(des, item.TableName));
                }

                ddlTable.Items.Insert(0, "--请选择--");
            }

            // 数据架构
            ddlSchema.Items.Clear();
            DataTable dt = dal.Session.GetSchema(null, null);
            if (dt != null)
            {
                foreach (DataRow dr in dt.Rows)
                {
                    ddlSchema.Items.Add(dr[0].ToString());
                }

                ddlSchema.Items.Insert(0, "--请选择--");
            }
        }
        catch (Exception ex)
        {
            WebHelper.Alert(ex.ToString());
        }
    }

    protected void ddlTable_SelectedIndexChanged(object sender, EventArgs e)
    {
        DAL dal = GetDAL();
        if (dal == null) return;

        IDataTable table = dal.Tables.Find(delegate(IDataTable item) { return item.TableName == ddlTable.SelectedValue; });
        if (table == null) return;

        gvTable.DataSource = table.Columns;
        gvTable.DataBind();

        txtSql.Text = String.Format("Select * From {0}", dal.Db.FormatName(table.TableName));
    }

    protected void ddlSchema_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (String.IsNullOrEmpty(ddlConn.SelectedValue)) return;

        DAL dal = GetDAL();
        if (dal == null) return;

        String name = ddlSchema.SelectedValue;
        if (String.IsNullOrEmpty(name)) return;

        // 计算约束条件
        String[] pms = null;
        DataTable rdt = null;
        try
        {
            // SQLite不支持该集合
            rdt = dal.Session.GetSchema(DbMetaDataCollectionNames.Restrictions, null);
        }
        catch { }

        if (rdt != null)
        {
            DataRow[] drs = rdt.Select(String.Format("{0}='{1}'", DbMetaDataColumnNames.CollectionName, name));
            if (drs != null && drs.Length > 0)
            {
                pms = new String[drs.Length];
                for (int i = 0; i < drs.Length; i++)
                {
                    TextBox txt = Panel1.FindControl("txt" + drs[i][1].ToString()) as TextBox;
                    if (txt != null && !String.IsNullOrEmpty(txt.Text)) pms[i] = txt.Text;
                }
            }
        }

        DataTable dt = dal.Session.GetSchema(name, pms);
        if (dt != null)
        {
            gvTable.DataSource = dt;
            gvTable.DataBind();
        }
    }

    void CreateRestrictions()
    {
        if (String.IsNullOrEmpty(ddlConn.SelectedValue)) return;

        DAL dal = GetDAL();
        if (dal == null) return;

        String name = ddlSchema.SelectedValue;
        if (String.IsNullOrEmpty(name)) return;

        // 计算约束条件
        DataTable rdt = null;
        try
        {
            rdt = dal.Session.GetSchema(DbMetaDataCollectionNames.Restrictions, null);
        }
        catch { }

        if (rdt != null)
        {
            DataRow[] drs = rdt.Select(String.Format("{0}='{1}'", DbMetaDataColumnNames.CollectionName, name));
            if (drs != null && drs.Length > 0)
            {
                foreach (DataRow dr in drs)
                {
                    String rname = dr[1].ToString();

                    Literal lt = new Literal();
                    lt.Text = "&nbsp;";
                    Panel1.Controls.Add(lt);

                    Label lb = new Label();
                    lb.Text = dr[1].ToString() + ":";
                    Panel1.Controls.Add(lb);

                    TextBox txt = new TextBox();
                    txt.ID = "txt" + rname;
                    txt.AutoPostBack = true;
                    txt.TextChanged += new EventHandler(ddlSchema_SelectedIndexChanged);
                    Panel1.Controls.Add(txt);
                }
            }
        }
    }

    protected override void OnPreLoad(EventArgs e)
    {
        base.OnPreLoad(e);

        //ddlSchema_SelectedIndexChanged(this, e);
        CreateRestrictions();
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        String sql = txtSql.Text;
        if (String.IsNullOrEmpty(sql)) return;

        sql = sql.Trim();
        if (String.IsNullOrEmpty(sql)) return;

        DAL dal = GetDAL();
        if (dal == null) return;

        lbResult.Text = null;
        gvResult.DataSource = null;
        gvResult.DataBind();

        try
        {
            if (sql.StartsWith("select", StringComparison.OrdinalIgnoreCase))
            {
                Search(0);
            }
            else
            {
                // 执行
                Int32 count = dal.Execute(sql, "");
                lbResult.Text = String.Format("影响行数:{0}", count);
            }

            //WebHelper.Alert("完成!");
        }
        catch (Exception ex)
        {
            //lbResult.Text = ex.Message;
            WebHelper.Alert(ex.ToString());
        }
    }

    void Search(Int32 index)
    {
        String sql = txtSql.Text;
        if (String.IsNullOrEmpty(sql)) return;

        sql = sql.Trim();
        if (String.IsNullOrEmpty(sql)) return;

        DAL dal = GetDAL();
        if (dal == null) return;

        // 总行数
        SelectBuilder sb = new SelectBuilder();
        sb.Parse(sql);
        Int32 count = dal.SelectCount(sb, "");
        DataPager1.TotalRowCount = count;
        lbResult.Text = String.Format("总记录数:{0}", count);

        //String tableName = ddlTable.SelectedValue;
        //String fsql = String.Format("Select * From {0}", dal.Db.FormatKeyWord(tableName));
        //if (sql.ToLower().StartsWith(fsql.ToLower()))
        //{
        //    IEntityOperate factory = dal.CreateOperate(tableName);
        //    if (factory != null)
        //    {
        //        gvResult.DataSource = factory.FindAll(sql.Substring(fsql.Length), null, null, index * gvResult.PageSize, gvResult.PageSize);
        //        gvResult.DataBind();
        //        return;
        //    }
        //}

        String key = txtKey.Text;
        if (String.IsNullOrEmpty(key)) key = "ID";

        sb.Key = key;
        sql = dal.PageSplit(sb, index * gvResult.PageSize, gvResult.PageSize);

        DataSet ds = dal.Select(sb, "");
        gvResult.DataSource = ds;
        gvResult.DataBind();
    }

    protected void DataPager2_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        Search(e.NewPageIndex);
    }

    protected void gvTable_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        {
            GridView gv = sender as GridView;
            Type type = null;

            if (gv.DataSource is DataSet || gv.DataSource is DataTable)
            {
                String sql = txtSql.Text;
                if (String.IsNullOrEmpty(sql)) return;

                sql = sql.Trim();
                if (String.IsNullOrEmpty(sql)) return;

                DAL dal = GetDAL();
                if (dal == null) return;

                String tableName = ddlTable.SelectedValue;
                String fsql = String.Format("Select * From {0}", dal.Db.FormatName(tableName));
                if (!sql.ToLower().StartsWith(fsql.ToLower())) return;

                IDataTable table = dal.Tables.Find(delegate(IDataTable item) { return item.TableName == ddlTable.SelectedValue; });
                if (table == null) return;

                // 更新表头
                foreach (TableCell item in e.Row.Cells)
                {
                    String name = item.Text;
                    if (String.IsNullOrEmpty(name)) continue;

                    //XField field = table.Fields.Find(delegate(XField elm) { return elm.Name == name; });
                    //if (field == null) continue;
                    IDataColumn field = null;
                    foreach (IDataColumn elm in table.Columns)
                    {
                        if (elm.ColumnName == name)
                        {
                            field = elm;
                            break;
                        }
                    }
                    if (field == null) continue;

                    if (!String.IsNullOrEmpty(field.Description)) item.Text = field.Description;
                }
            }
            else
            {
                IEnumerable ie = gv.DataSource as IEnumerable;
                if (ie == null) return;
                IEnumerator iet = ie.GetEnumerator();
                if (!iet.MoveNext()) return;

                type = iet.Current.GetType();

                // 更新表头
                foreach (TableCell item in e.Row.Cells)
                {
                    String name = item.Text;
                    if (String.IsNullOrEmpty(name)) continue;
                    PropertyInfo pi = type.GetProperty(name);
                    if (pi == null) continue;

                    DescriptionAttribute att = AttributeX.GetCustomAttribute<DescriptionAttribute>(pi, false);
                    if (att == null) continue;

                    if (!String.IsNullOrEmpty(att.Description)) item.Text = att.Description;
                }
            }
        }
    }

    protected void btnBak_Click(object sender, EventArgs e)
    {
        String bak = txtBak.Text;
        if (String.IsNullOrEmpty(bak)) return;

        DAL dal = GetDAL();
        if (dal.DbType != DatabaseType.SQLite)
        {
            WebHelper.Alert("仅支持SQLite备份!");
            return;
        }

        try
        {
            IMetaData md = dal.Db.CreateMetaData();
            Reflect.Invoke(md, "Backup", bak);

            WebHelper.Alert("完成!");
        }
        catch (Exception ex)
        {
            WebHelper.Alert(ex.ToString());
        }
    }
}