示例#1
0
        private static void AttemptCompilation(string csProjFile, ref GenResult result, ReadOnlyDictionary <string, string> genText)
        {
            if (string.IsNullOrWhiteSpace(csProjFile) == false && File.Exists(csProjFile))
            {
                result.Info($"Using proj file {csProjFile} to determine references");


                var assemblyName = Path.GetRandomFileName();
                var references   = CompilationHelpers.GetMetadataReferences(csProjFile).ToArray();
                result.Debug($"Found {references.Length} references");

                foreach (var genCode in genText)
                {
                    result.Info($"Compiling {genCode.Key}...");
                    var reTree  = CSharpSyntaxTree.ParseText(genCode.Value);
                    var options = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
                                  .WithPlatform(Platform.AnyCpu) //get from proj file
                                  .WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default);
                    var compilation = CSharpCompilation.Create(assemblyName, new[] { reTree }, references, options);
                    var diags       = compilation.GetDiagnostics();
                    result.Debug($"Compilation complete, found {diags.Length} Diagnostics");

                    result.AddDiags(diags);
                }
            }
            else
            {
                result.Info($"{nameof(csProjFile)} was either not specified or does not exist at path given. Skipping compilation");
            }
        }
示例#2
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];

            List <Column> pkcs = Utils.GetPrimaryKeyColumns(t);

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            string sn = Utils.GetEscapeSqlObjectName(t.Schema);
            string tn = "udtt_" + Utils.GetEscapeSqlObjectName(t.Name);

            sb.Append(@"
CREATE TYPE [" + sn + @"].[" + tn + @"] AS TABLE(");
            for (int i = 0; i < t.Columns.Count; i++)
            {
                Column c  = t.Columns[i];
                string cn = Utils.GetEscapeSqlObjectName(c.Name);
                string dn = Utils.GetParmDeclareStr(c);
                sb.Append(@"
	["     + cn + @"] " + dn + @" NOT NULL" + (i < t.Columns.Count - 1 ? "," : ""));
            }

            if (pkcs.Count > 0)
            {
                sb.Append(@"
	PRIMARY KEY CLUSTERED 
    (");
                for (int i = 0; i < pkcs.Count; i++)
                {
                    Column c  = pkcs[i];
                    string cn = Utils.GetEscapeSqlObjectName(c.Name);
                    sb.Append(@"
        [" + cn + @"] ASC" + (i < pkcs.Count - 1 ? "," : ""));
                }
                sb.Append(@"
    ) WITH ( IGNORE_DUP_KEY = OFF )");
            }
            sb.Append(@"
)
");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
        public GenResult Gen(params object[] sqlElements)
        {
            GenResult gr;



            gr      = new GenResult(GenResultTypes.File);
            gr.File = new KeyValuePair <string, byte[]>("OB_Partial.cs", Encoding.UTF8.GetBytes(Gen()));
            return(gr);
        }
示例#4
0
 /// <summary>
 /// Constructor<br>
 /// [Description]<br>
 /// none<br>
 /// [Notes]<br>
 /// </summary>
 public FaceResult(HVC_RES parent)
     : base(parent)
 {
     this.Parent = parent;
     Dir         = new DirResult(this);
     Age         = new AgeResult(this);
     Gen         = new GenResult(this);
     Gaze        = new GazeResult(this);
     Blink       = new BlinkResult(this);
     Exp         = new ExpResult(this);
 }
示例#5
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            View      t = (View)sqlElements[0];

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            sb.Append(@"
-- 针对 视图 " + t.ToString() + @"
-- 返回所有数据
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll] (
) AS
BEGIN
    SET NOCOUNT ON;

    SELECT ");
            for (int i = 0; i < t.Columns.Count; i++)
            {
                Column c = t.Columns[i];
                sb.Append((i > 0 ? @"
         , " : "") + @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
            }
            sb.Append(@"
      FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]

    RETURN 0
END


-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 视图 " + t.ToString() + @"
返回所有数据' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll'
EXEC sys.sp_addextendedproperty @name=N'CodeGenSettings_ResultType', @value=N'" + t.ToString() + @"' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll'

");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#6
0
文件: FMain.cs 项目: denghe/spgen
        /// <summary>
        /// 输出生成结果
        /// </summary>
        public void Output(GenResult result)
        {
            if (result == null)
            {
                // do nothing
            }
            else if (result.GenResultType == GenResultTypes.Message)
            {
                if (result.Message == null)
                {
                    return;
                }
                using (FOutputText f = new FOutputText(result.Message))
                {
                    f.ShowDialog();
                }
            }
            else if (result.GenResultType == GenResultTypes.CodeSegment)
            {
                using (FOutputCode f = new FOutputCode(result.CodeSegment))
                {
                    f.ShowDialog();
                }
            }
            else if (result.GenResultType == GenResultTypes.CodeSegments)
            {
                using (FOutputCodes f = new FOutputCodes(result.CodeSegments))
                {
                    f.ShowDialog();
                }
            }
            else if (result.GenResultType == GenResultTypes.File)
            {
                CleanOutput();

                Output(result.File.Key, result.File.Value);

                PopupOutput();
            }
            else if (result.GenResultType == GenResultTypes.Files)
            {
                CleanOutput();

                foreach (KeyValuePair <string, byte[]> file in result.Files)
                {
                    Output(file.Key, file.Value);
                }

                PopupOutput();
            }
        }
示例#7
0
        public GenResult Gen(params object[] sqlElements)
        {
            GenResult gr;

            gr       = new GenResult(GenResultTypes.Files);
            gr.Files = new List <KeyValuePair <string, byte[]> >();

            string       ns;
            DialogResult dr;

            using (FGen_Database_Config fgs = new FGen_Database_Config(_db))
            {
                dr = fgs.ShowDialog();
            }

            if (dr != DialogResult.OK)
            {
                //gr = new GenResult(GenResultTypes.Message);
                //gr.Message = null;
                //return gr;
            }

            ns = Utils._CurrrentDALGenSetting_CurrentScheme.Namespace;
            //isSupportWCF = Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportWCF;
            Utils.SchemaSplitter = Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportSchema ? "_" : null;

            gr       = new GenResult(GenResultTypes.Files);
            gr.Files = new List <KeyValuePair <string, byte[]> >();

            using (FOutputText fw = new FOutputText("代码生成中,请稍后...", "", 350, 500, true))
            {
                fw.Show();
                fw.Activate();

                foreach (KeyValuePair <string, byte[]> key in Gen_Database_Default_XAML.Gen(_db, ns))
                {
                    gr.Files.Add(key);
                }

                foreach (KeyValuePair <string, byte[]> keyvalue in Gen_Database_Default_CS.Gen(_db, ns))
                {
                    gr.Files.Add(keyvalue);
                }
            }

            return(gr);
        }
示例#8
0
        public GenResult Gen(params object[] sqlElements)
        {
            Utils.LoadDatabaseDALGenSettingDS(_db);
            var ns            = Utils._CurrrentDALGenSetting_CurrentScheme.Namespace;
            var selectedNames = new List <string>();

            if (this.TargetSqlElementType == SqlElementTypes.Database)
            {
                selectedNames.Add(_db.Name);
            }
            if (this.TargetSqlElementType == SqlElementTypes.Tables)
            {
                List <Table> uts = Utils.GetUserTables(_db);
                uts.ForEach(item => selectedNames.Add(item.Name));
            }
            if (this.TargetSqlElementType == SqlElementTypes.Views)
            {
                List <View> uvs = Utils.GetUserViews(_db);
                uvs.ForEach(item => selectedNames.Add(item.Name));
            }
            if (this.TargetSqlElementType == SqlElementTypes.Table || this.TargetSqlElementType == SqlElementTypes.View)
            {
                if (sqlElements == null || sqlElements.Length == 1)
                {
                    if (this.TargetSqlElementType == SqlElementTypes.Table)
                    {
                        selectedNames.Add(((Table)sqlElements[0]).Name);
                        foreach (Column c in ((Table)sqlElements[0]).Columns)
                        {
                            if (!Utils.GetDescription(c, Utils.EP_IsDisplay).ToLower().Equals("false") || c.InPrimaryKey)
                            {
                                selectedColumns.Add(c.Name);
                            }
                        }
                    }
                    if (this.TargetSqlElementType == SqlElementTypes.View)
                    {
                        selectedNames.Add(((View)sqlElements[0]).Name);
                    }
                }
            }
            var gr    = new GenResult(GenResultTypes.Files);
            var files = GenT4(selectedNames);

            gr.Files = files.ToList();
            return(gr);
        }
示例#9
0
        /// <summary>
        /// 输出生成结果
        /// </summary>
        public static void Output(GenResult result)
        {
            if (result == null)
            {
                // do nothing
            }
            else if (result.GenResultType == GenResultTypes.Message)
            {
                if (result.Message == null)
                {
                    return;
                }
                new WOutputText(result.Message).ShowDialog();
            }
            else if (result.GenResultType == GenResultTypes.CodeSegment)
            {
                new WOutputText(result.CodeSegment).ShowDialog();
            }
            else if (result.GenResultType == GenResultTypes.CodeSegments)
            {
                new WOutputTexts(result.CodeSegments).ShowDialog();
            }
            else if (result.GenResultType == GenResultTypes.File)
            {
                CleanOutput();

                Output(result.File.first, result.File.second);

                PopupOutput();
            }
            else if (result.GenResultType == GenResultTypes.Files)
            {
                CleanOutput();

                foreach (GenericPair <string, byte[]> file in result.Files)
                {
                    Output(file.first, file.second);
                }

                PopupOutput();
            }
        }
示例#10
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];

            if (!Utils.CheckIsTree(t))
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为非树表生成该过程!";
                return(gr);
            }

            List <Column> pks = Utils.GetPrimaryKeyColumns(t);

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            foreach (ForeignKey fk in t.ForeignKeys)
            {
                if (fk.ReferencedTable != t.Name || fk.ReferencedTableSchema != t.Schema)
                {
                    continue;
                }
                int equaled = 0;
                foreach (ForeignKeyColumn fkc in fk.Columns)        //判断是否一个外键约束所有字段都是在当前表
                {
                    if (fkc.Parent.Parent == t)
                    {
                        equaled++;
                    }
                }
                if (equaled == fk.Columns.Count)                    //当前表为树表
                {
                    sb.Append(@"
-- 针对 表 " + t.ToString() + @"
-- 根据主键值返回一个节点的多行数据
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectNode] (");
                    for (int i = 0; i < pks.Count; i++)
                    {
                        Column c  = pks[i];
                        string cn = Utils.GetEscapeName(c);
                        sb.Append(@"
    " + (i > 0 ? ", " : "  ") + Utils.FormatString("@" + cn, Utils.GetParmDeclareStr(c), "= NULL", 40, 40));
                    }
                    sb.Append(@"
) AS
BEGIN
    SET NOCOUNT ON;
");
                    for (int i = 0; i < pks.Count; i++)
                    {
                        Column c  = pks[i];
                        string cn = Utils.GetEscapeName(c);
                        sb.Append(@"
    IF @" + cn + @" IS NULL
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".SelectNode|Required." + c.Name + @" " + cn + @" 不能为空', 11, 1); RETURN -1;
    END;");
                    }
                    sb.Append(@"
    WITH Node(");
                    for (int i = 0; i < fk.Columns.Count; i++)
                    {
                        ForeignKeyColumn fkc = fk.Columns[i];
                        if (i > 0)
                        {
                            sb.Append(@", ");
                        }
                        sb.Append(@"[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"]");
                    }
                    sb.Append(@")
    AS
    (
        SELECT ");
                    for (int i = 0; i < fk.Columns.Count; i++)
                    {
                        ForeignKeyColumn fkc = fk.Columns[i];
                        sb.Append((i > 0 ? @"
             , " : "") + @"[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"]");
                    }
                    sb.Append(@"
          FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]
         WHERE ");
                    for (int i = 0; i < pks.Count; i++)
                    {
                        Column c  = pks[i];
                        string cn = Utils.GetEscapeName(c);
                        if (i > 0)
                        {
                            sb.Append(" AND ");
                        }
                        sb.Append(@"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @" + cn);
                    }
                    sb.Append(@"
         UNION ALL
        SELECT ");
                    for (int i = 0; i < fk.Columns.Count; i++)
                    {
                        ForeignKeyColumn fkc = fk.Columns[i];
                        sb.Append((i > 0 ? @"
             , " : "") + @"a.[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"]");
                    }
                    sb.Append(@"
          FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"] a
          JOIN Node ON ");
                    for (int i = 0; i < fk.Columns.Count; i++)
                    {
                        ForeignKeyColumn fkc = fk.Columns[i];
                        if (i > 0)
                        {
                            sb.Append(@" AND ");
                        }
                        sb.Append(@"a.[" + Utils.GetEscapeSqlObjectName(fkc.Name) + @"] = Node.[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"]");
                    }
                    sb.Append(@"
    )
    SELECT ");
                    for (int i = 0; i < t.Columns.Count; i++)
                    {
                        Column c = t.Columns[i];
                        sb.Append((i > 0 ? @"
         , " : "") + @"a.[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
                    }
                    sb.Append(@"
      FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"] a
      JOIN Node ON ");
                    for (int i = 0; i < fk.Columns.Count; i++)
                    {
                        ForeignKeyColumn fkc = fk.Columns[i];
                        if (i > 0)
                        {
                            sb.Append(@" AND ");
                        }
                        sb.Append(@"a.[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"] = Node.[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"]");
                    }
                    sb.Append(@"
END


-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 表 " + t.ToString() + @"
根据主键值返回一个节点的多行数据' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectNode'
EXEC sys.sp_addextendedproperty @name=N'SPGenSettings_ResultType', @value=N'" + t.ToString() + @"' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectNode'

");
                    break;
                }
            }

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#11
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen
            string strLen = (_db.CompatibilityLevel >= CompatibilityLevel.Version90) ? "MAX" : "4000";
            sb.Append(@"
-- 针对 表 " + t.ToString() + @"
-- 根据填写的查询字串返回数行数据
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll_Custom] (
    @WhereString            NVARCHAR(" + strLen + @")        = NULL
) AS
BEGIN
    SET NOCOUNT ON;
    
    DECLARE @SqlStr NVARCHAR(" + strLen + @")

    IF @WhereString IS NULL SET @WhereString = '';
    ELSE IF @WhereString <> '' SET @WhereString = ' WHERE ' + @WhereString;

    SET @SqlStr = '
    SELECT ");
            for (int i = 0; i < t.Columns.Count; i++)
            {
                Column c = t.Columns[i];
                sb.Append((i > 0 ? @"
         , " : "") + @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
            }
            sb.Append(@"
      FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"] ' + @WhereString;
    EXEC sp_executesql @SqlStr;
    
    RETURN 0
END


-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 表 " + t.ToString() + @"
根据填写的查询字串返回数行数据' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll_Custom'
EXEC sys.sp_addextendedproperty @name=N'SPGenSettings_ResultType', @value=N'" + t.ToString() + @"' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll_Custom'

");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#12
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];

            if (!Utils.CheckIsTree(t))
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为非树表生成该过程!";
                return(gr);
            }

            List <Column> pks = Utils.GetPrimaryKeyColumns(t);

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            foreach (ForeignKey fk in t.ForeignKeys)
            {
                if (fk.ReferencedTable != t.Name || fk.ReferencedTableSchema != t.Schema)
                {
                    continue;
                }
                int equaled = 0;
                foreach (ForeignKeyColumn fkc in fk.Columns)        //判断是否一个外键约束所有字段都是在当前表
                {
                    if (fkc.Parent.Parent == t)
                    {
                        equaled++;
                    }
                }
                if (equaled == fk.Columns.Count)                    //当前表为树表
                {
                    sb.Append(@"
-- 针对 表 " + t.ToString() + @"
-- 根据主键值删除一个节点的多行数据
-- 操作成功返回 受影响行数,失败返回
-- -1: 主键为空
-- -2: 主键未找到
-- -3: 删除失败
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_DeleteNode] (");
                    for (int i = 0; i < pks.Count; i++)
                    {
                        Column c  = pks[i];
                        string cn = Utils.GetEscapeName(c);
                        sb.Append(@"
    " + (i > 0 ? ", " : "  ") + Utils.FormatString("@" + cn, Utils.GetParmDeclareStr(c), "= NULL", 40, 40));
                    }
                    sb.Append(@"
) AS
BEGIN
    SET NOCOUNT ON;
");
                    for (int i = 0; i < pks.Count; i++)
                    {
                        Column c  = pks[i];
                        string cn = Utils.GetEscapeName(c);
                        sb.Append(@"
    IF @" + cn + @" IS NULL RETURN -1;");
                    }
                    sb.Append(@"

    -- 获取欲删除的主键列表
    DECLARE @Result TABLE (");
                    for (int i = 0; i < pks.Count; i++)
                    {
                        Column c = pks[i];
                        sb.Append(@"
          " + (i > 0 ? ", " : "  ") + @"[" + Utils.GetEscapeSqlObjectName(c.Name) + "] " + Utils.GetParmDeclareStr(c) + " NOT NULL");
                    }
                    sb.Append(@"
          , [__DeepLevel__] INT NOT NULL
    );
    DECLARE @__DeepLevel__ INT;
    SET @__DeepLevel__ = 1;

    INSERT INTO @Result
         SELECT ");
                    for (int i = 0; i < pks.Count; i++)
                    {
                        Column c = pks[i];
                        sb.Append((i > 0 ? @"
              , " : "") + @"[" + Utils.GetEscapeName(c) + "]");
                    }
                    sb.Append(@"
              , @__DeepLevel__
           FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]
--         WITH (UPDLOCK)
          WHERE ");
                    for (int i = 0; i < pks.Count; i++)
                    {
                        Column c  = pks[i];
                        string cn = Utils.GetEscapeSqlObjectName(c.Name);
                        sb.Append((i > 0 ? @"
            AND " : "") + @"[" + cn + "] = @" + cn);
                    }
                    sb.Append(@";
    WHILE @@ROWCOUNT > 0 BEGIN
        SET @__DeepLevel__ = @__DeepLevel__ + 1;
        INSERT INTO @Result
             SELECT ");
                    for (int i = 0; i < pks.Count; i++)
                    {
                        Column c = pks[i];
                        sb.Append((i > 0 ? @"
                  , " : "") + @"a.[" + Utils.GetEscapeName(c) + "]");
                    }
                    sb.Append(@"
                  , @__DeepLevel__
               FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"] a
--             WITH (UPDLOCK)
               JOIN @Result b ON ");
                    for (int i = 0; i < fk.Columns.Count; i++)
                    {
                        ForeignKeyColumn fkc = fk.Columns[i];
                        if (i > 0)
                        {
                            sb.Append(@" AND ");
                        }
                        sb.Append(@"a.[" + Utils.GetEscapeSqlObjectName(fkc.Name) + @"] = b.[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"]");
                    }
                    sb.Append(@"
              WHERE b.[__DeepLevel__] = @__DeepLevel__ - 1;
    END;

    DELETE FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]
      FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"] a
      JOIN @Result b ON ");
                    for (int i = 0; i < fk.Columns.Count; i++)
                    {
                        ForeignKeyColumn fkc = fk.Columns[i];
                        if (i > 0)
                        {
                            sb.Append(@" AND ");
                        }
                        sb.Append(@"a.[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"] = b.[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"]");
                    }
                    sb.Append(@";

    RETURN @@ROWCOUNT;
END


-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 表 " + t.ToString() + @"
根据主键值删除一个节点的多行数据
操作成功返回 受影响行数,失败返回
-1: 主键为空
-2: 主键未找到
-3: 删除失败' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_DeleteNode'

");
                    break;
                }
            }

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#13
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];


            List <Column> pks  = Utils.GetPrimaryKeyColumns(t);
            List <Column> wcs  = Utils.GetWriteableColumns(t);
            List <Column> mwcs = Utils.GetMustWriteColumns(t);

            if (wcs.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有可写入字段的表生成该过程!";
                return(gr);
            }
            if (pks.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有主键字段的表生成该过程!";
                return(gr);
            }

            StringBuilder sb = new StringBuilder();
            string        s  = "";

            #endregion

            #region Gen

            sb.Append(@"
-- 针对 表 " + t.ToString() + @"
-- 添加或更新一行数据并返回
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Merge] (");
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c  = wcs[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
    " + (i > 0 ? ", " : "  ") + Utils.FormatString("@" + cn, Utils.GetParmDeclareStr(c), "= NULL", 40, 40));
            }
            sb.Append(@"
) AS
BEGIN

    SET NOCOUNT ON;
");
            //判断必填字段是否填写了空值
            foreach (Column c in wcs)
            {
                if (c.Nullable)
                {
                    continue;
                }
                string cn = Utils.GetEscapeName(c);
                string cc = Utils.GetCaption(c);
                if (mwcs.Contains(c))
                {
                    sb.Append(@"
    IF @" + cn + @" IS NULL
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Merge|Required." + c.Name + @" 必须填写 " + cc + @"', 11, 1); RETURN -1;
    END;
");
                }
                else
                {
                    sb.Append(@"
    IF @" + cn + @" IS NULL SET @" + cn + @" = " + c.DefaultConstraint.Text + @";
");
                }
            }


            //判断外键字段是否在外键表中存在
            foreach (ForeignKey fk in t.ForeignKeys)
            {
                Table ft = t.Parent.Tables[fk.ReferencedTable, fk.ReferencedTableSchema];
                sb.Append(@"
    IF NOT EXISTS (
        SELECT 1 FROM [" + Utils.GetEscapeSqlObjectName(ft.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(ft.Name) + @"]
         WHERE ");
                string s1 = "";
                for (int i = 0; i < fk.Columns.Count; i++)
                {
                    ForeignKeyColumn fkc = fk.Columns[i];
                    Column           c   = t.Columns[fkc.Name];
                    string           cn  = Utils.GetEscapeName(c);
                    string           cc  = Utils.GetCaption(c);

                    if (i > 0)
                    {
                        sb.Append(@" AND ");
                    }
                    sb.Append("(" + (c.Nullable ? (" @" + cn + @" IS NULL OR ") : "") + @"[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"] = @" + cn + @")");
                    if (i > 0)
                    {
                        s1 += ",";
                    }
                    s1 += Utils.GetCaption(t.Columns[fkc.Name]);
                }
                sb.Append(@"
    )
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Update|NotFound." + s1 + @" " + s1 + @" 的值在表:" + Utils.GetCaption(ft) + @" 中未找到', 11, 1); RETURN -1;
    END;
");
            }

            sb.Append(@"
/*
    --prepare trans & error
    DECLARE @TranStarted bit; SET @TranStarted = 0; IF @@TRANCOUNT = 0 BEGIN BEGIN TRANSACTION; SET @TranStarted = 1 END;
*/

");

            //判断主键重复
            //判断是否存在自增主键
            bool hasIdentityCol = false;
            foreach (Column c in pks)
            {
                if (c.Identity)
                {
                    hasIdentityCol = true;
                    break;
                }
            }
            if (!hasIdentityCol)
            {
                sb.Append(@"
    IF EXISTS (
        SELECT 1 FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]
         WHERE ");
                for (int i = 0; i < pks.Count; i++)
                {
                    Column c  = pks[i];
                    string cn = Utils.GetEscapeName(c);
                    string cc = Utils.GetCaption(c);
                    if (i > 0)
                    {
                        sb.Append(@" AND ");
                    }
                    sb.Append(@"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @" + cn);
                }
                sb.Append(@"
    ) 
    BEGIN
        UPDATE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]
           SET ");
                for (int i = 0; i < wcs.Count; i++)
                {
                    Column c  = wcs[i];
                    string cn = Utils.GetEscapeName(c);
                    sb.Append((i > 0 ? @"
             , " : "") + Utils.FormatString("[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]", "= @" + cn, 40));
                }
                s = "";
                for (int i = 0; i < pks.Count; i++)
                {
                    Column c  = pks[i];
                    string cn = Utils.GetEscapeName(c);
                    if (i > 0)
                    {
                        s += " AND ";
                    }
                    s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @" + cn;
                }
                if (s.Length > 0)
                {
                    sb.Append(@"
         WHERE " + s);
                }
                sb.Append(@";
        IF @@ERROR <> 0 OR @@ROWCOUNT = 0
        BEGIN
            RAISERROR ('" + t.Schema + @"." + t.Name + @".Merge|Failed 数据合并失败', 11, 1); RETURN -1;  -- GOTO Cleanup;
        END

        GOTO TheEnd
    END;
");
            }



            sb.Append(@"


    INSERT INTO [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"] (");
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c = wcs[i];
                sb.Append(@"
        " + (i > 0 ? ", " : "  ") + "[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
            }
            sb.Append(@"
    ) VALUES (");
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c  = wcs[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
        " + (i > 0 ? ", " : "  ") + "@" + cn);
            }
            sb.Append(@"
    );
    IF @@ERROR <> 0 OR @@ROWCOUNT = 0
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Merge|Failed 数据合并失败', 11, 1); RETURN -1;  -- GOTO Cleanup;
    END


TheEnd:




    -- 也可以不先行判断是否存在而选择性的 INSERT , UPDATE
/*
    BEGIN TRY
        INSERT INTO ......(上面那段INSERT移至此处)
    END TRY
    BEGIN CATCH
        UPDATE .......(上面那段UPDATE移至此处)
        IF @@ERROR <> 0 OR @@ROWCOUNT = 0
        BEGIN
            RAISERROR ('" + t.Schema + @"." + t.Name + @".Merge|Failed 数据合并失败', 11, 1); RETURN -1;  -- GOTO Cleanup;
        END
    END CATCH
*/

");
            sb.Append(@"
    SELECT ");
            for (int i = 0; i < t.Columns.Count; i++)
            {
                Column c = t.Columns[i];
                sb.Append((i > 0 ? @"
         , " : "") + @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
            }
            sb.Append(@"
      FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]");
            s = "";
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                if (i > 0)
                {
                    s += " AND ";
                }
                if (c.Identity)
                {
                    s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = SCOPE_IDENTITY()";
                }
                else
                {
                    s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @" + cn;
                }
            }
            if (s.Length > 0)
            {
                sb.Append(@"
     WHERE " + s);
            }

            sb.Append(@";


/*
    --cleanup trans
    IF @TranStarted = 1 COMMIT TRANSACTION; RETURN 0;
Cleanup:
    IF @TranStarted = 1 ROLLBACK TRANSACTION; RETURN -1;
*/

    RETURN 0;

END



-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 表 " + t.ToString() + @"
添加或更新一行数据并返回' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Merge'
EXEC sys.sp_addextendedproperty @name=N'CodeGenSettings_IsSingleLineResult', @value=N'True' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Merge'
EXEC sys.sp_addextendedproperty @name=N'CodeGenSettings_ResultType', @value=N'" + t.ToString() + @"' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Merge'

");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#14
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];

            List <Column> pks = Utils.GetPrimaryKeyColumns(t);

            if (pks.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有主键字段的表生成该UI代码!";
                return(gr);
            }

            List <Column> wcs  = Utils.GetWriteableColumns(t);
            List <Column> socs = Utils.GetSortableColumns(t);
            List <Column> sacs = Utils.GetSearchableColumns(t);

            List <Column> ocs = new List <Column>();                      // 实际输出的字段集
            foreach (Column c in t.Columns)
            {
                if (Utils.CheckIsBinaryType(c))
                {
                    continue;
                }
                else
                {
                    ocs.Add(c);                                                                             // 过滤掉不输出的字段
                }
            }
            // find pk's index
            int pkcidx = 0;
            for (int i = 0; i < ocs.Count; i++)
            {
                if (ocs[i].InPrimaryKey)
                {
                    pkcidx = i; break;
                }
            }
            Column pkc  = ocs[pkcidx];
            string pkcn = Utils.GetEscapeName(pkc);


            #endregion

            #region Gen

            string tn = Utils.GetEscapeName(t);


            StringBuilder sb_js = new StringBuilder();
            sb_js.Append(@"
<script type=""text/javascript"">
    $().ready(function() {
        

        $(""#table"").jqGrid({
            pager       : $(""#pager""),

            url         : ""query.ashx"",
            caption     : ""JSON Mapping"",
            sortname    : """ + JsEscape(pkc.Name) + @""",
            sortorder   : ""desc"",
            rowNum      : 10,
            imgpath     : ""css/images"",


            colModel    : [");


            for (int i = 0; i < ocs.Count; i++)
            {
                Column c = ocs[i];

                string caption  = Utils.GetCaption(c);
                string cn       = JsEscape(c.Name);
                string width    = "80";                                            // todo: 根据各种数据类型及其长度来推断出显示宽度
                string align    = Utils.CheckIsNumericType(c) ? "center" : "left"; // todo: 视情况判断显示位置 right
                string sortable = socs.Contains(c).ToString().ToLower();

                // todo: 格式化日期,货币显示

                sb_js.Append(@"
	            { label: """     + caption + @""", name: """ + cn + @""", index: """ + cn + @""", width: " + width + @", align: """ + align + @""", sortable: " + sortable + @" }");

                if (i < ocs.Count - 1)
                {
                    sb_js.Append(@",");
                }
            }

            sb_js.Append(@"
            ],
            viewrecords : true,
            datatype    : ""json"",
            jsonReader  : {
	            repeatitems : false,
	            id          : """     + pkcidx.ToString() + @"""
            },
            rowList     : [10, 20, 30],
            height      : ""100%"",
            autowidth   : true

        }).navGrid(""#pager"", {edit: false, add: false, del: false});
    });
</script>








<table id=""table"" class=""scroll"" cellpadding=""0"" cellspacing=""0""></table>
<div id=""pager"" class=""scroll"" style=""text-align:center;""></div>
");
            StringBuilder sb_cs = new StringBuilder();
            sb_cs.Append(@"
var response = context.Response;
var request = context.Request;
response.ContentType = ""text/plain"";


// JQGrid 的固有字段

var pageIndex = int.Parse(request[""page""] ?? ""1"");
var pageSize = int.Parse(request[""rows""] ?? ""10"");
var sortColumn = request[""sidx""] ?? @""" + CsEscape(pkc.Name) + @""";
var sortDirection = request[""sord""];


// 当前表相关字段的过滤查询

var exps = new List<OE." + tn + @">();
var s = """";

");

            foreach (Column c in sacs)
            {
                string cn = Utils.GetEscapeName(c);
                sb_cs.Append(@"
s = request[""" + CsEscape(c.Name) + @"""] ?? """";
if (s != """") exps.Add(OE." + tn + @"." + cn + @".Like(s));
");
            }

            sb_cs.Append(@"

// 拼接表达式

OE." + tn + @" exp = null;
if (exps.Count > 0)
{
    exp = exps[0];
    for (int i = 1; i < exps.Count; i++) exp.And(exps[i]);
}

// 取符合条件的记录数

var rowCount = OB." + tn + @".GetCount_Custom(exp);

// 算页码啥的

var pageCount = 0;
if (rowCount > 0) pageCount = (int)Math.Ceiling((double)rowCount / (double)pageSize);
if (pageIndex > pageCount) pageIndex = pageCount;
var rowIndex = pageSize * pageIndex - pageSize;// +1;

// 取符合条件的,当前需要显示的页的数据

var rows = OB." + tn + @".SelectAllPage_Custom(
    exp,
    (DI." + tn + @")Enum.Parse(typeof(DI." + tn + @"),
    sortColumn),
    sortDirection == ""asc"",
    rowIndex,
    pageSize
);

// 输出 JQGrid 需要的 JSON

response.Write(rows.ToJson(pageIndex, pageCount, rowCount, DI." + tn + @"." + pkcn + @".ToString(), jqGridHelper.DataType.Enhancement));
");



            #region JQGridHelper

            StringBuilder sb_helper = new StringBuilder();
            sb_helper.Append(@"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Data;
using System.Collections;

/// <summary>
/// 辅助生成 jqgrid 所需的 json 输出格式字串
/// todo: 指定输出字段列表部分输出
/// </summary>
public static class jqGridHelper
{
    /*
            
生成物样式: (不需要空格和换行. 这里只为好看)
         
Basic:(固定主键位置,不支持字段调整显示先后顺序)
{
""page"":""1"",""total"":4,""records"":""22"",""rows"":[
    [""1"",null,""Marc Forster"",""2008"",""Daniel Craig"",""200""],
    [""2"",""Casino Royale"",""Martin Campbell"",""2006"",""Daniel Craig"",""150""],
    [""3"",""Die Another Day"",""Lee Tamahori"",""2002"",""Pierce Brosnan"",""142""],
]
}
         
Standard: (不支持字段调整显示先后顺序)
{
""page"":""1"",""total"":4,""records"":""22"",""rows"":[
    {""id"":1,""cell"":[""1"",null,""Marc Forster"",""2008"",""Daniel Craig"",""200""]},
    {""id"":2,""cell"":[""2"",""Casino Royale"",""Martin Campbell"",""2006"",""Daniel Craig"",""150""]},
    {""id"":3,""cell"":[""3"",""Die Another Day"",""Lee Tamahori"",""2002"",""Pierce Brosnan"",""142""]},
]
}

Enhancement: (固定主键位置,支持字段调整显示先后顺序)
{
""page"":""1"",""total"":2,""records"":""13"",""rows"":[
    {""id"":""1"",""invdate"":null,""name"":""Client 1"",""amount"":""100.00"",""tax"":""20.00"",""total"":""120.00"",""note"":""note 1""},
    {""id"":""2"",""invdate"":""2007-10-03"",""name"":""Client 1"",""amount"":""200.00"",""tax"":""40.00"",""total"":""240.00"",""note"":""note 2""},
    {""id"":""10"",""invdate"":""2007-10-06"",""name"":""Client 2"",""amount"":""100.00"",""tax"":""20.00"",""total"":""120.00"",""note"":null}
]
}

上述生成物中: page 从 1 开始, 表示当前页码; total 表示 一共有多少页; records 表示一共有多少条数据; rows 为数据集
精简版中: 数据格式固定为 id + cell, id 为主键值. cell 为字段值列表.
完整版中: 数据格式为 column name 与 value 形成的键值对. (尚不确定 主键字段  是否必须排第一个)

*/
    /// <summary>
    /// json for jqgrid 的数据输出类型
    /// </summary>
    public enum DataType
    {
        /// <summary>
        /// 基础版数据输出,对应的 jsonReader: { repeatitems : true, cell:"""", id: ""0"" }     id 应该是用来说明 主键 位于第几个字段上
        /// </summary>
        Basic,
        /// <summary>
        /// 标准版数据输出,对应的 jsonReader: 无
        /// </summary>
        Standard,
        /// <summary>
        /// 增强版数据输出,支持 jsonMap (调整字段显示先后顺序)  对应的 jsonReader: { repeatitems : false, id: ""0"" }    id 应该是用来说明 主键 位于第几个字段上
        /// </summary>
        Enhancement
    }

    private static string JsonEscape(object o)
    {
        if (o == null) return string.Empty;
        return o.ToString().Replace(""<"", ""&lt;"").Replace("">"", ""&gt;"").Replace(""\"""", ""&quot;"").Replace(""'"", ""’"").Replace(""/"", ""&#47;"").Replace(""\\"", ""&#92;"");
    }


    private static object GetPropertiesAndFieldsValue(object o, MemberInfo mi)
    {
        if (mi.MemberType == MemberTypes.Property)
        {
            return (mi as PropertyInfo).GetValue(o, null);
        }
        else if (mi.MemberType == MemberTypes.Field)
        {
            return (mi as FieldInfo).GetValue(o);
        }
        return null;
    }

    private static List<MemberInfo> GetPropertiesAndFields(Type t)
    {
        var mis = t.GetMembers(BindingFlags.Public | BindingFlags.Instance);
        return (from mi in mis
                where mi.MemberType == MemberTypes.Property || mi.MemberType == MemberTypes.Field
                select mi).ToList();
    }

    /// <summary>
    /// 将 DataTable 转为 jqgrid 所需 json 字串
    /// </summary>
    public static string ToJson(this DataTable dt, int pageIndex, int pageCount, int rowCount, DataType datatype)
    {
        var pk = dt.Columns[0];
        if (dt.PrimaryKey != null && dt.PrimaryKey.Length > 0) pk = dt.PrimaryKey[0];       // todo: 多主键支持

        var sb = new StringBuilder();
        sb.Append(@""{""""page"""":"""""" + pageIndex + @"""""",""""total"""":"" + pageCount + @"",""""records"""":"""""" + rowCount + @"""""",""""rows"""":["");
        var b1 = false;

        foreach (DataRow row in dt.Rows)
        {
            if (b1) sb.Append("","");

            if (datatype == DataType.Basic)
            {
                sb.Append(@""["");
                var b2 = false;
                foreach (DataColumn col in dt.Columns)
                {
                    if (b2) sb.Append(@"","");
                    var value = row.IsNull(col) ? @""""""null"""""" : (@"""""""" + JsonEscape(row[col]) + @"""""""");
                    sb.Append(value);
                    b2 = true;
                }
                sb.Append(@""]"");
            }
            else if (datatype == DataType.Standard)
            {
                var value = row.IsNull(pk) ? @""""""null"""""" : (@"""""""" + JsonEscape(row[pk]) + @"""""""");
                sb.Append(@""{"""""" + JsonEscape(pk.ColumnName) + @"""""":"" + value + @"",""""cell"""":["");
                var b2 = false;
                foreach (DataColumn col in dt.Columns)
                {
                    if (b2) sb.Append(@"","");
                    value = row.IsNull(col) ? @""""""null"""""" : (@"""""""" + JsonEscape(row[col]) + @"""""""");
                    sb.Append(value);
                    b2 = true;
                }
                sb.Append(@""]}"");
            }
            else if (datatype == DataType.Enhancement)
            {
                sb.Append(@""{"");
                var b2 = false;
                foreach (DataColumn col in dt.Columns)
                {
                    if (b2) sb.Append(@"","");
                    var value = row.IsNull(col) ? @""""""null"""""" : (@"""""""" + JsonEscape(row[col]) + @"""""""");
                    sb.Append(@"""""""" + JsonEscape(col.ColumnName) + @"""""":"" + value);
                    b2 = true;
                }
                sb.Append(@""}"");
            }

            b1 = true;
        }
        sb.Append(@""]}"");
        return sb.ToString();
    }

    /// <summary>
    /// 将 数据集合 转为 jqgrid 所需 json 字串
    /// </summary>
    public static string ToJson(this IEnumerable list, int pageIndex, int pageCount, int rowCount, string pkcol, DataType datatype)
    {
        var sb = new StringBuilder();
        sb.Append(@""{""""page"""":"""""" + pageIndex + @"""""",""""total"""":"" + pageCount + @"",""""records"""":"""""" + rowCount + @"""""",""""rows"""":["");

        List<MemberInfo> mis = null;
        MemberInfo pk = null;
        foreach (var o in list)
        {
            if (mis == null)
            {
                mis = GetPropertiesAndFields(o.GetType());
                if (string.IsNullOrEmpty(pkcol)) pk = mis[0];
                pk = mis.Find(m => { return m.Name == pkcol; });
            }
            else
                sb.Append(@"","");

            if (datatype == DataType.Basic)
            {
                sb.Append(@""["");
                var b2 = false;
                foreach (var mi in mis)
                {
                    if (b2) sb.Append(@"","");
                    var val = GetPropertiesAndFieldsValue(o, mi);
                    var value = val == null ? ""null"" : (@"""""""" + JsonEscape(val) + @"""""""");
                    sb.Append(value);
                    b2 = true;
                }
                sb.Append(@""]"");
            }
            else if (datatype == DataType.Standard)
            {
                var val = GetPropertiesAndFieldsValue(o, pk);
                var value = val == null ? ""null"" : (@"""""""" + JsonEscape(val) + @"""""""");
                sb.Append(@""{"""""" + JsonEscape(pk.Name) + @"""""":"" + value + @"",""""cell"""":["");
                var b2 = false;
                foreach (var mi in mis)
                {
                    if (b2) sb.Append(@"","");
                    val = GetPropertiesAndFieldsValue(o, mi);
                    value = val == null ? ""null"" : (@"""""""" + JsonEscape(val) + @"""""""");
                    sb.Append(value);
                    b2 = true;
                }
                sb.Append(@""]}"");
            }
            else if (datatype == DataType.Enhancement)
            {
                sb.Append(@""{"");
                var b2 = false;
                foreach (var mi in mis)
                {
                    if (b2) sb.Append(@"","");
                    var val = GetPropertiesAndFieldsValue(o, mi);
                    var value = val == null ? ""null"" : (@"""""""" + JsonEscape(val) + @"""""""");
                    sb.Append(@"""""""" + JsonEscape(mi.Name) + @"""""":"" + value);
                    b2 = true;
                }
                sb.Append(@""}"");
            }
        }
        sb.Append(@""]}"");
        return sb.ToString();
    }

}
");
            #endregion



            #endregion

            #region return

            gr = new GenResult(GenResultTypes.CodeSegments);
            gr.CodeSegments = new List <KeyValuePair <string, string> >();
            gr.CodeSegments.Add(new KeyValuePair <string, string>("JS & HTML", sb_js.ToString()));
            gr.CodeSegments.Add(new KeyValuePair <string, string>("ASHX C# Code", sb_cs.ToString()));
            gr.CodeSegments.Add(new KeyValuePair <string, string>("JQGrid Helper C# Code", sb_helper.ToString()));
            return(gr);

            #endregion
        }
示例#15
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];
            if (t.Parent.CompatibilityLevel < CompatibilityLevel.Version100)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为SQL2005 或更早期的版本生成含有 Merge 语法的存储过程!";
                return(gr);
            }

            List <Column> pks  = Utils.GetPrimaryKeyColumns(t);
            List <Column> wcs  = Utils.GetWriteableColumns(t);
            List <Column> mwcs = Utils.GetMustWriteColumns(t);

            if (wcs.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有可写入字段的表生成该过程!";
                return(gr);
            }
            if (pks.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有主键字段的表生成该过程!";
                return(gr);
            }

            StringBuilder sb = new StringBuilder();
            string        s  = "";

            #endregion

            #region Gen

            sb.Append(@"
-- 针对 表 " + t.ToString() + @"
-- 添加或更新一行数据并返回
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Merge] (");
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c  = wcs[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
    " + (i > 0 ? ", " : "  ") + Utils.FormatString("@" + cn, Utils.GetParmDeclareStr(c), "= NULL", 40, 40));
            }
            sb.Append(@"
) AS
BEGIN

    SET NOCOUNT ON;
");
            //判断必填字段是否填写了空值
            foreach (Column c in wcs)
            {
                if (c.Nullable)
                {
                    continue;
                }
                string cn = Utils.GetEscapeName(c);
                string cc = Utils.GetCaption(c);
                if (mwcs.Contains(c))
                {
                    sb.Append(@"
    IF @" + cn + @" IS NULL
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Merge|Required." + c.Name + @" 必须填写 " + cc + @"', 11, 1); RETURN -1;
    END;
");
                }
                else
                {
                    sb.Append(@"
    IF @" + cn + @" IS NULL SET @" + cn + @" = " + c.DefaultConstraint.Text + @";
");
                }
            }


            //判断外键字段是否在外键表中存在
            foreach (ForeignKey fk in t.ForeignKeys)
            {
                Table ft = t.Parent.Tables[fk.ReferencedTable, fk.ReferencedTableSchema];
                sb.Append(@"
    IF NOT EXISTS (
        SELECT 1 FROM [" + Utils.GetEscapeSqlObjectName(ft.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(ft.Name) + @"]
         WHERE ");
                string s1 = "";
                for (int i = 0; i < fk.Columns.Count; i++)
                {
                    ForeignKeyColumn fkc = fk.Columns[i];
                    Column           c   = t.Columns[fkc.Name];
                    string           cn  = Utils.GetEscapeName(c);
                    string           cc  = Utils.GetCaption(c);

                    if (i > 0)
                    {
                        sb.Append(@" AND ");
                    }
                    sb.Append("(" + (c.Nullable ? (" @" + cn + @" IS NULL OR ") : "") + @"[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"] = @" + cn + @")");
                    if (i > 0)
                    {
                        s1 += ",";
                    }
                    s1 += Utils.GetCaption(t.Columns[fkc.Name]);
                }
                sb.Append(@"
    )
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Update|NotFound." + s1 + @" " + s1 + @" 的值在表:" + Utils.GetCaption(ft) + @" 中未找到', 11, 1); RETURN -1;
    END;
");
            }



            sb.Append(@"
/*
    --prepare trans & error
    DECLARE @TranStarted bit; SET @TranStarted = 0; IF @@TRANCOUNT = 0 BEGIN BEGIN TRANSACTION; SET @TranStarted = 1 END;
*/


    MERGE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"] AS target
    USING (SELECT ");   // @xxx as 'xxx', @xxx as 'xxx', @xxx as 'xxx', ...
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c  = wcs[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
        " + (i > 0 ? ", " : "") + "@" + cn + " AS '" + c.Name + @"'");
            }
            sb.Append(@") AS source
    ON ");
            for (int i = 0; i < pks.Count; i++)
            {
                Column c = pks[i];
                sb.Append(@"
        " + (i > 0 ? " AND " : "") + @"target.[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = source.[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
            }
            sb.Append(@"
    WHEN matched");             // AND (target.c1 <> source.c1 OR target.c2 <> source.c2 OR ...)
            bool isFirst = true;
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c = wcs[i];
                if (c.InPrimaryKey)
                {
                    continue;
                }
                sb.Append(@"
        " + (isFirst ? " AND (" : " OR ") + @"target.[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] <> source.[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
                if (i == wcs.Count - 1)
                {
                    sb.Append(")");
                }
                isFirst = false;
            }
            sb.Append(@" THEN
    UPDATE SET ");              // target.c1 = source.c1, target.c2 = source.c2, ...
            isFirst = true;
            foreach (Column c in wcs)
            {
                if (c.InPrimaryKey)
                {
                    continue;
                }
                sb.Append(@"
        " + (isFirst ? "" : ", ") + @"target.[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = source.[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
                isFirst = false;
            }
            sb.Append(@"
    WHEN NOT matched THEN
    INSERT (");
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c = wcs[i];
                sb.Append(@"
        " + (i > 0 ? ", " : "") + "[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
            }
            sb.Append(@") VALUES (");
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c = wcs[i];
                sb.Append(@"
        " + (i > 0 ? ", " : "") + "source.[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
            }
            sb.Append(@")
--    OUTPUT $action, Inserted.*, Deleted.*;


/*
    --cleanup trans
    IF @TranStarted = 1 COMMIT TRANSACTION; RETURN 0;
Cleanup:
    IF @TranStarted = 1 ROLLBACK TRANSACTION; RETURN -1;
*/

    RETURN 0;

END



-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 表 " + t.ToString() + @"
添加或更新一行数据并返回' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Merge'
EXEC sys.sp_addextendedproperty @name=N'CodeGenSettings_IsSingleLineResult', @value=N'True' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Merge'
EXEC sys.sp_addextendedproperty @name=N'CodeGenSettings_ResultType', @value=N'" + t.ToString() + @"' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Merge'

");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#16
0
        public GenResult Gen(params object[] sqlElements)
        {
            GenResult gr;

            // gr = new GenResult(GenResultTypes.Files);
            //gr.Files = new List<KeyValuePair<string, byte[]>>();

            Table t = (Table)sqlElements[0];

            #region

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen NameSpace

            sb.Remove(0, sb.Length);

            sb.Append(@"<UserControl x:Name =""" + t.Name + @"""
            x:Class=""" + @"Test" + @"." + t.Name + @"""
            xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
            xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" 
            xmlns:data=""clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data""
	        xmlns:primitives=""clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data""
            xmlns:d=""http://schemas.microsoft.com/expression/blend/2008""
            xmlns:mc=""http://schemas.openxmlformats.org/markup-compatibility/2006""
            xmlns:theming=""clr-namespace:Microsoft.Windows.Controls.Theming;assembly=Microsoft.Windows.Controls.Theming""
            xmlns:basics=""clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls""
            xmlns:telerik=""clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls.Navigation""
            mc:Ignorable=""d"">");

            #endregion

            #region Gen XAML

            #region Root Grid Start
            sb.Append(@"
           <Grid Margin=""0,0,0,0"" x:Name=""Root"" Height=""Auto"" Width=""Auto"">
            <Grid.RowDefinitions>
              <RowDefinition Height =""Auto""/>
              <RowDefinition Height=""Auto"" />
            </Grid.RowDefinitions>");
            #endregion

            #region Bord DataGrid
            sb.Append(@"
            <!--DataGrid Bord--> 
            <Border Grid.Row=""0"" x:Name =""_border_Grid"">
            </Border>");
            #endregion

            #region Bord Detail
            sb.Append(@"
            <!--Detail Bord -->
            <Border Grid.Row=""1"">
               <Grid>
                 <Grid.ColumnDefinitions>
                    <ColumnDefinition Width=""*"" />
                    <ColumnDefinition Width=""auto"" />
                 </Grid.ColumnDefinitions>
                 <Grid.RowDefinitions>");
            int count = t.Columns.Count / 2 + 1;
            for (int i = 0; i < count; i++)
            {
                sb.Append(@"
                  <RowDefinition Height =""Auto""/> ");
            }
            sb.Append(@"
                </Grid.RowDefinitions>");
            int rowindex = 0;
            foreach (Column c in t.Columns)
            {
                string cn      = Utils.GetEscapeName(c);
                string caption = Utils.GetCaption(c);
                if (Utils.CheckIsStringType(c) || Utils.CheckIsNumericType(c) || Utils.CheckIsDateTimeType(c) || Utils.CheckIsGuidType(c))
                {
                    sb.Append(@"
                       <StackPanel Margin=""0,5,5,0"" Orientation=""Horizontal"" Grid.ColumnSpan=""1"" Grid.RowSpan=""1"" Grid.Row=""" + rowindex / 2 + @""" Grid.Column=""" + rowindex % 2 + @""" HorizontalAlignment=""Center"">");
                    sb.Append(@"    
					      <TextBlock Height=""Auto"" Width=""60"" Margin=""0,0,5,0"" Text="""                     + caption + @":""/>
                          <TextBox Height=""Auto"" Width=""150"" x:Name=""" + cn + @""" TextWrapping=""Wrap""/>
                       </StackPanel>");
                }
                else if (Utils.CheckIsBooleanType(c))
                {
                    sb.Append(@"
                       <StackPanel Orientation=""Horizontal"" Grid.ColumnSpan=""1"" Grid.RowSpan=""1"" Grid.Row=""" + rowindex / 2 + @""" Grid.Column=""" + rowindex % 2 + @""" HorizontalAlignment=""Center"">");
                    sb.Append(@"    
					     <TextBlock Height=""Auto"" Width=""60"" Margin=""0,0,5,0"" Text="""                     + caption + @":""/>
                         <CheckBox Height=""Auto"" Width=""Auto"" x:Name=""" + cn + @"""/>
                       </StackPanel>");
                }
                else if (Utils.CheckIsBinaryType(c))
                {
                    // todo
                }
                rowindex++;
            }
            sb.Append(@"</Grid>
             </Border>");
            #endregion

            #region Root Grid End
            sb.Append(@"
            </Grid>
     </UserControl>");
            #endregion

            #endregion

            #region Gen CS
            StringBuilder sb_cs = new StringBuilder(@"
            using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Net;
            using System.Windows;
            using System.Windows.Controls;
            using System.Windows.Documents;
            using System.Windows.Input;
            using System.Windows.Media;
            using System.Windows.Media.Animation;
            using System.Windows.Shapes;
            using Management.Controls;
            using Management.Controls.Windows;
            using Microsoft.Windows.Controls.Theming;

            namespace " + ns + @"
            {");
            #region 构超函数
            sb.Append(@" 
            public partial class " + ns + @":" + t.Name + @"
            {
               public" + t.Name + @"()
               {
                  InitializeComponent();   
               }"
                      );
            #endregion

            #region 事件
            sb.Append(@" 
            #region Event
            

            #endregion 
             ");
            #region 方法
            sb.Append(@"

            ");
            #endregion
            #region
            sb.Append(@"
             
       }
    }"
                      );
            #endregion

            #endregion

            #region 方法
            sb.Append(@"
            public void ChageStyleManager(string url)
            {
              Uri uri = new Uri(url, UriKind.Relative);
              ImplicitStyleManager.SetResourceDictionaryUri(this.Root, uri);
              ImplicitStyleManager.SetApplyMode(Root, ImplicitStylesApplyMode.Auto);
              ImplicitStyleManager.Apply(Root);
            }
            ");
            #endregion
            #endregion

            #region return

            gr = new GenResult(GenResultTypes.CodeSegments);
            gr.CodeSegments = new List <KeyValuePair <string, string> >();
            //gr.CodeSegments.Add(new KeyValuePair<string, string>("SL DataGrid XAML Import:", ));
            //gr.CodeSegments.Add(new KeyValuePair<string, string>("SL DataGrid Style:", result_style));
            gr.CodeSegments.Add(new KeyValuePair <string, string>("SL DataGrid XAML:", sb.ToString()));
            //gr.CodeSegments.Add(new KeyValuePair<string, string>("SL DataGrid CS:", result_cs));
            return(gr);

            #endregion
        }
示例#17
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            View      t = (View)sqlElements[0];

            List <Column> pks = Utils.GetPrimaryKeyColumns(t);

            if (pks == null || pks.Count == 0)        //没有主键?
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有主键的视图生成该过程!";
                return(gr);
            }

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            sb.Append(@"
-- 针对 视图 " + t.ToString() + @"
-- 根据主键值返回一行数据
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Select] (");
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
    " + (i > 0 ? "," : "") + Utils.FormatString("@" + cn, Utils.GetParmDeclareStr(c), 40));
            }
            sb.Append(@"
) AS
BEGIN
    SET NOCOUNT ON;
");
            foreach (Column c in pks)
            {
                string cn = Utils.GetEscapeName(c);
                string cc = Utils.GetCaption(c);
                sb.Append(@"
    IF @" + cn + @" IS NULL
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Select|Required." + c.Name + @" 必须填写 " + cc + @"', 11, 1); RETURN -1;
    END;
");
            }
            sb.Append(@"

    SELECT ");
            for (int i = 0; i < t.Columns.Count; i++)
            {
                Column c = t.Columns[i];
                sb.Append((i > 0 ? @"
         , " : "") + @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
            }
            sb.Append(@"
      FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]");
            string s = "";
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                if (i > 0)
                {
                    s += " AND ";
                }
                s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @" + cn;
            }
            if (s.Length > 0)
            {
                sb.Append(@"
     WHERE " + s);
            }
            sb.Append(@"

    RETURN 0
END


-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 视图 " + t.ToString() + @"
根据主键值返回一行数据' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Select'
EXEC sys.sp_addextendedproperty @name=N'CodeGenSettings_IsSingleLineResult', @value=N'True' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Select'
EXEC sys.sp_addextendedproperty @name=N'CodeGenSettings_ResultType', @value=N'" + t.ToString() + @"' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Select'

");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#18
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];


            List <Column> pks  = Utils.GetPrimaryKeyColumns(t);
            List <Column> wcs  = Utils.GetWriteableColumns(t);
            List <Column> mwcs = Utils.GetMustWriteColumns(t);

            if (wcs == null || wcs.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有可写入字段的表生成该过程!";
                return(gr);
            }
            if (pks == null || pks.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有主键字段的表生成该过程!";
                return(gr);
            }

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen
            sb.Append(@"
-- 针对 表 " + t.ToString() + @"
-- 根据主键的值定位一行数据并修改(为SqlDataSource服务,无法修改主键的值)
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Update_For_SqlDataSource] (");
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c  = wcs[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
    " + (i > 0 ? ", " : "  ") + Utils.FormatString("@" + cn, Utils.GetParmDeclareStr(c), "= NULL", 40, 40));
            }
            sb.Append(@"
) AS
BEGIN
    SET NOCOUNT ON;
");
            //判断原始主键必填
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                string cc = Utils.GetCaption(c);
                sb.Append(@"
    IF @" + cn + @" IS NULL
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Update|Required." + c.Name + @" 必须填写 " + cc + @"值', 11, 1); RETURN -1;
    END;
");
            }
            //判断原始主键必存在
            sb.Append(@"
    -- 这里也可以先不判断原记录是否存在,直接取值,并任意判断一个非空值是否取到
    IF NOT EXISTS (
        SELECT 1 FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]
--          WITH (UPDLOCK)
         WHERE ");
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                string cc = Utils.GetCaption(c);
                if (i > 0)
                {
                    sb.Append(@" AND ");
                }
                sb.Append(@"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @" + cn);
            }
            sb.Append(@"
    )
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Update|NotFound.PrimaryKeys 原主键值对应的数据未找到', 11, 1); RETURN -1;
    END;
");
            //判断必填字段是否填写了空值
            foreach (Column c in wcs)
            {
                if (c.Nullable || c.InPrimaryKey)
                {
                    continue;
                }
                string cn = Utils.GetEscapeName(c);
                string cc = Utils.GetCaption(c);
                if (mwcs.Contains(c))
                {
                    sb.Append(@"
    IF @" + cn + @" IS NULL
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Update|Required." + c.Name + @" 必须填写 " + cc + @"', 11, 1); RETURN -1;
    END;
");
                }
                else
                {
                    sb.Append(@"
    IF @" + cn + @" IS NULL SET @" + cn + @" = " + c.DefaultConstraint.Text + @";
");
                }
            }

            //判断外键字段是否在外键表中存在
            foreach (ForeignKey fk in t.ForeignKeys)
            {
                Table ft = t.Parent.Tables[fk.ReferencedTable, fk.ReferencedTableSchema];
                sb.Append(@"
    IF NOT EXISTS (
        SELECT 1 FROM [" + Utils.GetEscapeSqlObjectName(ft.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(ft.Name) + @"]
         WHERE ");
                string s1 = "";
                for (int i = 0; i < fk.Columns.Count; i++)
                {
                    ForeignKeyColumn fkc = fk.Columns[i];
                    Column           c   = t.Columns[fkc.Name];
                    string           cn  = Utils.GetEscapeName(c);
                    string           cc  = Utils.GetCaption(c);

                    if (i > 0)
                    {
                        sb.Append(@" AND ");
                    }
                    sb.Append("(" + (c.Nullable ? (" @" + cn + @" IS NULL OR ") : "") + @"[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"] = @" + cn + @")");
                    if (i > 0)
                    {
                        s1 += ",";
                    }
                    s1 += Utils.GetCaption(t.Columns[fkc.Name]);
                }
                sb.Append(@"
    )
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Update|NotFound." + s1 + @" " + s1 + @" 的值在表:" + Utils.GetCaption(ft) + @" 中未找到', 11, 1); RETURN -1;
    END;
");
            }

            sb.Append(@"
/*
    --prepare trans & error
    DECLARE @TranStarted bit; SET @TranStarted = 0; IF @@TRANCOUNT = 0 BEGIN BEGIN TRANSACTION; SET @TranStarted = 1 END;
*/

    UPDATE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]
       SET ");
            bool isFirst = true;
            foreach (Column c in wcs)
            {
                if (c.InPrimaryKey)
                {
                    continue;
                }
                string cn = Utils.GetEscapeName(c);
                sb.Append((!isFirst ? @"
         , " : "") + Utils.FormatString("[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]", "= @" + cn, 40));
                isFirst = false;
            }
            string s = "";
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                if (i > 0)
                {
                    s += " AND ";
                }
                s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @" + cn;
            }
            if (s.Length > 0)
            {
                sb.Append(@"
     WHERE " + s);
            }
            sb.Append(@";
    IF @@ERROR <> 0 OR @@ROWCOUNT = 0
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Update|Failed 数据更新失败', 11, 1); RETURN -1;  -- GOTO Cleanup;
    END

/*
    --cleanup trans
    IF @TranStarted = 1 COMMIT TRANSACTION; RETURN 0;
Cleanup:
    IF @TranStarted = 1 ROLLBACK TRANSACTION; RETURN -1;
*/
    RETURN 0;

END


-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 表 " + t.ToString() + @"
根据主键的值定位一行数据并修改(为SqlDataSource服务,无法修改主键的值)' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Update_For_SqlDataSource'

");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            View      t = (View)sqlElements[0];

            List <Column> scs  = Utils.GetSearchableColumns(t);
            List <Column> socs = Utils.GetSortableColumns(t);

            if (socs.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有可排序字段的视图生成该过程!";
                return(gr);
            }
            if (scs.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有字符串类型字段的视图生成模糊查询过程!";
                return(gr);
            }

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            sb.Append(@"
-- 针对 视图 " + t.ToString() + @"
-- 根据关键字返回数行数据(带分页排序)
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll_Page_Blur] (
    @Keyword                    NVARCHAR(MAX)    = NULL,
    @SortExpression             NVARCHAR(MAX)    = NULL,            -- column name
    @SortDirection              INT              = NULL,            -- 0 : asc  1: desc
    @PageSize                   INT              = NULL,            -- page size
    @StartRowIndex              INT              = NULL,            -- current page first row index
    @Count                      INT              = NULL    OUTPUT   -- rows count
) AS
BEGIN
    SET NOCOUNT ON;
    
    DECLARE @EndRowIndex INT;

    IF @Keyword IS NULL SET @Keyword = '%';
    IF @SortExpression IS NULL OR @SortExpression = '' SET @SortExpression = '" + socs[0].Name + @"';
    IF @SortDirection IS NULL SET @SortDirection = 0;

    IF @PageSize IS NULL OR @PageSize < 1 SET @PageSize = 20;
    IF @StartRowIndex IS NULL OR @StartRowIndex < 0 SET @StartRowIndex = 0;
    SET @StartRowIndex = @StartRowIndex + 1;
    SET @EndRowIndex = @StartRowIndex + @PageSize - 1;

    SELECT @Count = COUNT(*)
      FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]");
            string s = "";
            for (int i = 0; i < scs.Count; i++)
            {
                Column c = scs[i];
                if (i > 0)
                {
                    s += " OR ";
                }
                s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] LIKE @Keyword";
            }
            if (s.Length > 0)
            {
                sb.Append(@"
     WHERE " + s);
            }

            for (int j = 0; j < scs.Count; j++)
            {
                Column sc = scs[j];
                sb.Append(@"
    " + (j > 0 ? "ELSE " : "") + @"IF @SortExpression = '" + sc.Name + @"'
    BEGIN
        IF @SortDirection = 0
        BEGIN
            WITH T AS
            (
                SELECT ");
                for (int i = 0; i < t.Columns.Count; i++)
                {
                    Column c = t.Columns[i];
                    sb.Append((i > 0 ? @"
                     , " : "") + @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
                }
                sb.Append(@"
                     , ROW_NUMBER() OVER (ORDER BY [" + Utils.GetEscapeSqlObjectName(sc.Name) + @"]) AS 'RowNumber'
                  FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]");
                s = "";
                for (int i = 0; i < scs.Count; i++)
                {
                    Column c = scs[i];
                    if (i > 0)
                    {
                        s += " OR ";
                    }
                    s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] LIKE @Keyword";
                }
                if (s.Length > 0)
                {
                    sb.Append(@"
                 WHERE " + s);
                }
                sb.Append(@"
            )
            SELECT ");
                for (int i = 0; i < t.Columns.Count; i++)
                {
                    Column c = t.Columns[i];
                    sb.Append((i > 0 ? @"
                 , " : "") + @"T.[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
                }
                sb.Append(@"
              FROM T
             WHERE T.RowNumber BETWEEN @StartRowIndex AND @EndRowIndex
        END
        ELSE
        BEGIN
            WITH T AS
            (
                SELECT ");
                for (int i = 0; i < t.Columns.Count; i++)
                {
                    Column c = t.Columns[i];
                    sb.Append((i > 0 ? @"
                     , " : "") + @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
                }
                sb.Append(@"
                     , ROW_NUMBER() OVER (ORDER BY [" + Utils.GetEscapeSqlObjectName(sc.Name) + @"] DESC) AS 'RowNumber'
                  FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]");
                s = "";
                for (int i = 0; i < scs.Count; i++)
                {
                    Column c = scs[i];
                    if (i > 0)
                    {
                        s += " OR ";
                    }
                    s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] LIKE @Keyword";
                }
                if (s.Length > 0)
                {
                    sb.Append(@"
                 WHERE " + s);
                }
                sb.Append(@"
            )
            SELECT ");
                for (int i = 0; i < t.Columns.Count; i++)
                {
                    Column c = t.Columns[i];
                    sb.Append((i > 0 ? @"
                 , " : "") + @"T.[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
                }
                sb.Append(@"
              FROM T
             WHERE T.RowNumber BETWEEN @StartRowIndex AND @EndRowIndex
        END
    END
");
            }
            sb.Append(@"

    RETURN 0
END


-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 视图 " + t.ToString() + @"
根据关键字返回数行数据(带分页排序)' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll_Page_Blur'
EXEC sys.sp_addextendedproperty @name=N'CodeGenSettings_ResultType', @value=N'" + t.ToString() + @"' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll_Page_Blur'

");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#20
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];

            List <Column> pks  = Utils.GetPrimaryKeyColumns(t);
            List <Column> wcs  = Utils.GetWriteableColumns(t);
            List <Column> mwcs = Utils.GetMustWriteColumns(t);

            if (wcs == null || wcs.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有可写入字段的表生成该过程!";
                return(gr);
            }
            if (pks == null || pks.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有主键字段的表生成该过程!";
                return(gr);
            }

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            sb.Append(@"
-- 针对 表 " + t.ToString() + @"
-- 添加一行数据(空值参数将被跳过)并返回
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_InsertPart] (");
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c  = wcs[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
    " + (i > 0 ? ", " : "  ") + Utils.FormatString("@" + cn, Utils.GetParmDeclareStr(c), "= NULL", 40, 40));
            }
            sb.Append(@"
) AS
BEGIN
    SET NOCOUNT ON;

");
            //判断必填字段是否填写了空值
            foreach (Column c in mwcs)
            {
                string cn = Utils.GetEscapeName(c);
                string cc = Utils.GetCaption(c);
                sb.Append(@"
    IF @" + cn + @" IS NULL
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".InsertPart|Required." + c.Name + @" 必须填写 " + cc + @"', 11, 1); RETURN -1;
    END;
");
            }

            //判断主键重复
            //判断是否存在自增主键
            bool hasIdentityCol = false;
            foreach (Column c in pks)
            {
                if (c.Identity)
                {
                    hasIdentityCol = true;
                    break;
                }
            }
            if (!hasIdentityCol)
            {
                sb.Append(@"
    IF EXISTS (
        SELECT 1 FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]
         WHERE ");
                for (int i = 0; i < pks.Count; i++)
                {
                    Column c  = pks[i];
                    string cn = Utils.GetEscapeName(c);
                    string cc = Utils.GetCaption(c);
                    if (i > 0)
                    {
                        sb.Append(@" AND ");
                    }
                    sb.Append(@"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @" + cn);
                }
                sb.Append(@"
    ) 
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Update|Exists.PrimaryKeys 欲插入的主键值已存在', 11, 1); RETURN -1;
    END;
");
            }

            //判断外键字段是否在外键表中存在
            foreach (ForeignKey fk in t.ForeignKeys)
            {
                Table ft = t.Parent.Tables[fk.ReferencedTable, fk.ReferencedTableSchema];
                sb.Append(@"
    IF NOT EXISTS (
        SELECT 1 FROM [" + Utils.GetEscapeSqlObjectName(ft.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(ft.Name) + @"]
         WHERE ");
                string s1 = "";
                for (int i = 0; i < fk.Columns.Count; i++)
                {
                    ForeignKeyColumn fkc = fk.Columns[i];
                    Column           c   = t.Columns[fkc.Name];
                    string           cn  = Utils.GetEscapeName(c);
                    string           cc  = Utils.GetCaption(c);

                    if (i > 0)
                    {
                        sb.Append(@" AND ");
                    }
                    sb.Append("(" + (c.Nullable ? (" @" + cn + @" IS NULL OR ") : "") + @"[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"] = @" + cn + @")");
                    if (i > 0)
                    {
                        s1 += ",";
                    }
                    s1 += Utils.GetCaption(t.Columns[fkc.Name]);
                }
                sb.Append(@"
    )
    BEGIN
        RAISERROR (" + t.Schema + @"." + t.Name + @".InsertPart|NotFound." + s1 + @" '" + s1 + @" 的值在表:" + Utils.GetCaption(ft) + @" 中未找到', 11, 1); RETURN -1;
    END;
");
            }

            sb.Append(@"

    DECLARE @SqlStr nvarchar(max);
    DECLARE @SqlParm nvarchar(max);

    DECLARE @InsParms1 nvarchar(max);
    DECLARE @InsParms2 nvarchar(max);

    SET @InsParms1 = '';
    SET @InsParms2 = '';
");
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c  = wcs[i];
                string cn = Utils.GetEscapeName(c);
                string cc = Utils.GetCaption(c);
                if (c.Nullable || c.DefaultConstraint == null)
                {
                }
                else
                {
                    sb.Append(@"
    IF @" + cn + @" IS NOT NULL");
                }
                sb.Append(@"
    BEGIN
        IF LEN(@InsParms1) > 0 SET @InsParms1 = @InsParms1 + ', ';
        SET @InsParms1 = @InsParms1 + '[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]';
        IF len(@InsParms2) > 0 SET @InsParms2 = @InsParms2 + ', ';
        SET @InsParms2 = @InsParms2 + '@" + cn + @"';
    END
");
            }
            sb.Append(@"

    SET @SqlStr = 'INSERT INTO [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"] ('+ @InsParms1 + ') VALUES ('+ @InsParms2 + ');';
    SET @SqlParm = '");
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c  = wcs[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append((i > 0 ? ", " : "") + @"@" + cn + @" " + Utils.GetParmDeclareStr(c));
            }
            sb.Append(@"';
/*
    --prepare trans & error
    DECLARE @TranStarted bit; SET @TranStarted = 0; IF @@TRANCOUNT = 0 BEGIN BEGIN TRANSACTION; SET @TranStarted = 1 END;
*/

    EXEC sp_executesql @SqlStr, @SqlParm, ");
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c  = wcs[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append((i > 0 ? ", " : "") + @"@" + cn);
            }
            sb.Append(@";

    SELECT ");
            for (int i = 0; i < t.Columns.Count; i++)
            {
                Column c = t.Columns[i];
                sb.Append((i > 0 ? @"
         , " : "") + @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
            }
            sb.Append(@"
      FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]");
            string s = "";
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                if (i > 0)
                {
                    s += " AND ";
                }
                if (c.Identity)
                {
                    s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = SCOPE_IDENTITY()";
                }
                else
                {
                    s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @" + cn;
                }
            }
            if (s.Length > 0)
            {
                sb.Append(@"
     WHERE " + s);
            }
            sb.Append(@";
    IF @@ERROR <> 0 OR @@ROWCOUNT = 0
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".InsertPart|Failed 数据更新失败', 11, 1); RETURN -1;  -- GOTO Cleanup;
    END

/*
    --cleanup trans
    IF @TranStarted = 1 COMMIT TRANSACTION; RETURN 0;
Cleanup:
    IF @TranStarted = 1 ROLLBACK TRANSACTION; RETURN -1;
*/

    RETURN 0;

END


-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 表 " + t.ToString() + @"
添加一行数据(空值参数将被跳过)并返回' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_InsertPart'
EXEC sys.sp_addextendedproperty @name=N'SPGenSettings_IsSingleLineResult', @value=N'True' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_InsertPart'
EXEC sys.sp_addextendedproperty @name=N'SPGenSettings_ResultType', @value=N'" + t.ToString() + @"' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_InsertPart'

");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#21
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            View      t = (View)sqlElements[0];

            List <Column> scs = Utils.GetSearchableColumns(t);

            if (scs.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有字符串类型字段的视图生成模糊查询过程!";
                return(gr);
            }

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen
            string strLen = (_db.CompatibilityLevel >= CompatibilityLevel.Version90) ? "MAX" : "4000";
            sb.Append(@"
-- 针对 视图 " + t.ToString() + @"
-- 根据关键字返回数行数据
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll_Blur] (
       @Keyword             NVARCHAR(" + strLen + @")        = NULL
) AS
BEGIN
    SET NOCOUNT ON;

    IF @Keyword IS NULL OR @Keyword = '' SET @Keyword = '%';
    ELSE SET @Keyword = '%' + @Keyword + '%';

    SELECT ");
            for (int i = 0; i < t.Columns.Count; i++)
            {
                Column c = t.Columns[i];
                sb.Append((i > 0 ? @"
         , " : "") + @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
            }
            sb.Append(@"
      FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]");
            string s = "";
            for (int i = 0; i < scs.Count; i++)
            {
                Column c = scs[i];
                if (i > 0)
                {
                    s += " OR ";
                }
                s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] LIKE @Keyword";
            }
            if (s.Length > 0)
            {
                sb.Append(@"
     WHERE " + s);
            }
            sb.Append(@"
    RETURN 0
END


-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 视图 " + t.ToString() + @"
根据关键字返回数行数据' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll_Blur'
EXEC sys.sp_addextendedproperty @name=N'SPGenSettings_ResultType', @value=N'" + t.ToString() + @"' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll_Blur'

");


            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#22
0
        public GenResult Generate(params Oe.NodeBase[] targetElements)
        {
            #region Init

            var gr    = new GenResult(GenResultTypes.CodeSegment);
            var oe_t  = (Oe.Table)targetElements[0];
            var t     = WMain.Instance.MySmoProvider.GetTable(oe_t);
            var t_fts = from ForeignKey fk in t.ForeignKeys
                        select WMain.Instance.MySmoProvider.GetTable(
                new Oe.Table {
                Parent = oe_t.Parent, Name = fk.ReferencedTable, Schema = fk.ReferencedTableSchema
            }
                );

            var sb = new StringBuilder();

            #endregion

            #region Gen

            var pks  = t.GetPrimaryKeyColumns();            // 主键集
            var wcs  = t.GetWriteableColumns();             // 可填字段集
            var mwcs = t.GetMustWriteColumns();             // 必填字段集

            var tn  = t.Name.EscapeToSqlName();             // 表名
            var ts  = t.Schema.EscapeToSqlName();           // 表架构名
            var spn = "[" + ts + @"].[" + tn + @"_Insert]"; // 存储过程名

            // 头生成
            sb.Append(@"
-- 表    :[" + ts + @"].[" + tn + @"]
-- 功能  :添加一行数据
-- 返回值:INT (成功:受影响行数; 失败:负数)
-- -1: 某些必填字段为空
-- -2: 主键冲突
-- -3: 外键无效
-- -4: 添加失败
CREATE PROCEDURE " + spn + @" (");

            // 参数生成
            for (int i = 0; i < wcs.Count; i++)
            {
                var c  = wcs[i];
                var pn = c.Name.EscapeToParmName();

                /*
                 * @xxx                             nvarchar(max)                      = NULL
                 * , @xxxx                            .......                            .....
                 */
                sb.Append(@"
    " + (i > 0 ? ", " : "  ") + ("@" + pn).FillSpace(30) + c.GetParmDeclareStr().FillSpace(30) + "= NULL");
            }

            // 身体生成
            sb.Append(@"
) AS
BEGIN
    SET NOCOUNT ON;
");
            // 前置判断生成
            //判断必填字段是否填写了空值
            foreach (var c in wcs)
            {
                if (c.Nullable)
                {
                    continue;
                }
                var pn = c.Name.EscapeToParmName();
                if (mwcs.Contains(c))
                {
                    sb.Append(@"
    IF @" + pn + @" IS NULL" + (c.DataType.CheckIsStringType() ? ("-- OR LEN(@" + pn + @") = 0") : ("")) + @"
        RETURN -1;
");
                }
                else
                {
                    sb.Append(@"
    IF @" + pn + @" IS NULL SET @" + pn + @" = " + c.DefaultConstraint.Text + @";
");
                }
            }

            //判断主键重复
            //判断是否存在自增主键
            var hasIdentityCol = false;
            foreach (var c in pks)
            {
                if (c.Identity)
                {
                    hasIdentityCol = true;
                    break;
                }
            }
            if (!hasIdentityCol)
            {
                sb.Append(@"
    IF EXISTS (
       SELECT 1 FROM [" + ts + @"].[" + tn + @"]
--         WITH (TABLOCK, HOLDLOCK)
        WHERE ");
                for (int i = 0; i < pks.Count; i++)
                {
                    var c  = pks[i];
                    var cn = c.Name.EscapeToSqlName();
                    var pn = c.Name.EscapeToParmName();
                    if (i > 0)
                    {
                        sb.Append(@" AND ");
                    }
                    sb.Append(@"[" + cn + @"] = @" + pn);
                }
                sb.Append(@"
    ) RETURN -2;
");
            }

            //判断外键字段是否在外键表中存在
            foreach (var fk in t.ForeignKeys)
            {
                var ft  = t_fts.Find(fk.ReferencedTable, fk.ReferencedTableSchema);
                var fts = ft.Schema.EscapeToSqlName();
                var ftn = ft.Name.EscapeToSqlName();
                sb.Append(@"
    IF NOT EXISTS (
        SELECT 1 FROM [" + fts + @"].[" + ftn + @"]
         WHERE ");
                for (int i = 0; i < fk.Columns.Count; i++)
                {
                    var fkc   = fk.Columns[i];
                    var fkcrn = fkc.ReferencedColumn.EscapeToSqlName();

                    var c  = t.Columns.Find(fkc.Name);
                    var cn = c.Name.EscapeToSqlName();
                    var pn = c.Name.EscapeToSqlName();

                    if (i > 0)
                    {
                        sb.Append(@" AND ");
                    }
                    sb.Append("(" + (c.Nullable ? (" @" + cn + @" IS NULL OR ") : "") + @"[" + fkcrn + @"] = @" + pn + @")");
                }
                sb.Append(@"
    ) RETURN -3;
");
            }

            // 具体插入操作生成
            sb.Append(@"

/*
    --prepare trans & error
    DECLARE @TranStarted bit, @ReturnValue int;
    SELECT @TranStarted = 0, @ReturnValue = 0;
    IF @@TRANCOUNT = 0 
    BEGIN
        BEGIN TRANSACTION;
        SET @TranStarted = 1
    END;
*/

    DECLARE @ERROR INT, @ROWCOUNT INT;

    INSERT INTO [" + ts + @"].[" + tn + @"] (");
            var opts = "";
            for (int i = 0; i < wcs.Count; i++)
            {
                var c  = wcs[i];
                var cn = c.Name.EscapeToSqlName();
                sb.Append(@"
        " + (i > 0 ? ", " : "  ") + "[" + cn + @"]");
                opts += (i > 0 ? ", " : "") + "Inserted.[" + cn + @"]";
            }
            sb.Append(@"
    )
--    OUTPUT " + opts + @"
    VALUES (");
            for (int i = 0; i < wcs.Count; i++)
            {
                var c  = wcs[i];
                var pn = c.Name.EscapeToParmName();
                sb.Append(@"
        " + (i > 0 ? ", " : "  ") + "@" + pn);
            }
            sb.Append(@"
    );");
            sb.Append(@"

    SELECT @ERROR = @@ERROR, @ROWCOUNT = @@ROWCOUNT;
    IF @ERROR <> 0 OR @ROWCOUNT = 0
    BEGIN
/*
        @ReturnValue = -4;
        GOTO Cleanup;
*/
        RETURN -4;
    END

/*
    @ReturnValue = @ROWCOUNT;
    GOTO Cleanup;
*/

    RETURN @ROWCOUNT;

/*
    --cleanup trans
    IF @TranStarted = 1 COMMIT TRANSACTION;
    RETURN @ReturnValue;
Cleanup:
    IF @TranStarted = 1 ROLLBACK TRANSACTION;
    RETURN @ReturnValue;
*/

END
");

            #endregion

            #region return

            gr.CodeSegment.first  = this.Properties[GenProperties.Caption].ToString();
            gr.CodeSegment.second = sb.ToString();

            return(gr);

            #endregion
        }
示例#23
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];

            List <Column> pks = Utils.GetPrimaryKeyColumns(t);

            if (pks.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有主键字段的表生成该UI代码!";
                return(gr);
            }

            List <Column> wcs  = Utils.GetWriteableColumns(t);
            List <Column> socs = Utils.GetSortableColumns(t);
            List <Column> sacs = Utils.GetSearchableColumns(t);

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            string tbn = Utils.GetEscapeName(t);


            string s = "";


            sb.Append(@"<cc:DockPart ID=""_" + tbn + @"_GridView_DockPart"" runat=""server"" Height=""40"" IsClientClose=""False"" Style=""position: absolute; left: 0px; top: 0px; z-index: 101;"" Title=""" + t.Name + @""" Visible=""True"" Width=""50"" BackColor=""white"">
	<cc:GVToolbar ID=""_"     + tbn + @"_GVToolbar"" runat=""server"" GridViewID=""_" + tbn + @"_GridView"" OnOnDeleteButtonClicked=""_" + tbn + @"_GVToolbar_OnDeleteButtonClicked"" OnOnEditButtonClicked=""_" + tbn + @"_GVToolbar_OnEditButtonClicked"" OnOnInsertButtonClicked=""_" + tbn + @"_GVToolbar_OnInsertButtonClicked"" OnOnRefreshButtonClicked=""_" + tbn + @"_GVToolbar_OnRefreshButtonClicked"" />
	<asp:GridView ID=""_"     + tbn + @"_GridView"" CssClass=""GridView"" runat=""server"" AllowPaging=""True"" AllowSorting=""True"" AutoGenerateColumns=""False"" OnSelectedIndexChanged=""_" + tbn + @"_GridView_SelectedIndexChanged"" DataKeyNames=""");
            for (int i = 0; i < pks.Count; i++)
            {
                if (i > 0)
                {
                    sb.Append(@", ");
                }
                sb.Append(pks[i].Name);
            }
            sb.Append(@""" DataSourceID=""_" + tbn + @"_ObjectDataSource"">
		<Columns>
			<asp:CommandField ShowSelectButton=""True"" />"            );
            foreach (Column c in t.Columns)
            {
                string cn      = c.Name;
                string caption = Utils.GetCaption(c);
                if (string.IsNullOrEmpty(caption) || caption.Trim().Length == 0)
                {
                    caption = c.Name;
                }
                string rdonly = wcs.Contains(c) ? "" : @" ReadOnly=""True""";
                string sort   = socs.Contains(c) ? (@" SortExpression=""" + cn + @"""") : "";

                sb.Append(@"
			<asp:BoundField DataField="""             + cn + @""" HeaderText=""" + caption + @"""" + rdonly + @"" + sort + @" />");
            }

            string search = "";
            foreach (Column c in sacs)
            {
                string cn = Utils.GetEscapeRowFilterName(c.Name);
                if (search.Length > 0)
                {
                    search += " OR ";
                }
                search += @"" + cn + @" LIKE '%{0}%'";
            }
            if (search.Length > 0)
            {
                search = @" FilterExpression=""" + search + @"""";
            }

            sb.Append(@"
		</Columns>
		<FooterStyle CssClass=""GridView_Footer"" />
		<EmptyDataRowStyle CssClass=""GridView_Empty"" />
		<RowStyle CssClass=""GridView_Row"" />
		<EditRowStyle CssClass=""GridView_EditRow"" />
		<SelectedRowStyle CssClass=""GridView_SelectedRow"" />
		<PagerStyle CssClass=""GridView_Pager"" />
		<HeaderStyle CssClass=""GridView_Header"" />
		<AlternatingRowStyle CssClass=""GridView_AlternatingRow"" />
	</asp:GridView>
	<asp:ObjectDataSource ID=""_"     + tbn + @"_ObjectDataSource"" runat=""server"" OldValuesParameterFormatString=""original_{0}"" SelectMethod=""SelectAll"" TypeName=""DAL.DB+" + tbn + @"""" + search + @">
		<FilterParameters>
			<asp:ControlParameter ControlID=""_"             + tbn + @"_GVToolbar"" ConvertEmptyStringToNull=""False"" Name=""Keyword"" PropertyName=""Keyword"" Type=""string"" />
		</FilterParameters>
	</asp:ObjectDataSource>
</cc:DockPart>





");



            sb.Append(@"
<cc:DockPart ID=""_" + tbn + @"_DetailPanel_DockPart"" runat=""server"" Height=""40"" IsClientClose=""False"" Style=""position: absolute; left: 0px; top: 0px; z-index: 101;"" Title=""" + t.Name + @" Row's Detail"" Visible=""False"" Width=""50"" BackColor=""white"">
    <cc:DetailPanel ID=""_" + tbn + @"_DetailPanel"" runat=""server"" CssClass=""DetailPanel"" OnOnCancel=""_" + tbn + @"_DetailPanel_OnCancel"" OnOnDelete=""_" + tbn + @"_DetailPanel_OnDelete"" OnOnInsert=""_" + tbn + @"_DetailPanel_OnInsert"" OnOnUpdate=""_" + tbn + @"_DetailPanel_OnUpdate"">");
            foreach (Column c in t.Columns)
            {
                string cn = Utils.GetEscapeName(c);
                if (c.DataType.SqlDataType == SqlDataType.Bit)
                {
                    sb.Append(@"
        <cc:DetailCheckBox ID=""_" + tbn + "_" + cn + @"_DetailTextBox"" Caption=""" + Utils.GetCaption(c) + @":"" FieldName=""" + c.Name + @""" runat=""server"" />");
                }
                else if (Utils.CheckIsDateTimeType(c))
                {
                    sb.Append(@"
        <cc:DetailDateTimeBox ID=""_" + tbn + "_" + cn + @"_DateTimeBox"" Caption=""" + Utils.GetCaption(c) + @":"" FieldName=""" + c.Name + @""" runat=""server"" />");
                }
                else
                {
                    sb.Append(@"
        <cc:DetailTextBox ID=""_" + tbn + "_" + cn + @"_TextBox"" Caption=""" + Utils.GetCaption(c) + @":"" FieldName=""" + c.Name + @""" runat=""server"" />");
                }
            }
            sb.Append(@"
        <cc:DetailHR ID=""_" + tbn + @"_DetailHR"" runat=""server"" />
        <cc:DetailButtons ID=""_" + tbn + @"_DetailButtons"" runat=""server"" />
		<cc:DetailMessageBox ID=""_"         + tbn + @"_DetailMessageBox"" runat=""server"" />
    </cc:DetailPanel>
</cc:DockPart>



");



            //先得到从 GridView 取 Row 的语句
            if (pks.Count > 0)
            {
                s = @"DAL.DS." + tbn + @"Row r = DAL.DB." + tbn + @".Select(";
                for (int i = 0; i < pks.Count; i++)
                {
                    Column c        = pks[i];
                    string cn       = Utils.GetEscapeName(c);
                    string typename = Utils.GetDataType(c);
                    if (i > 0)
                    {
                        s += @", ";
                    }
                    s += @"(" + typename + @")_" + tbn + @"_GridView.SelectedDataKey[""" + c.Name + @"""]";
                }
                s += @");";
            }

            sb.Append(@"

#region _" + tbn + @"_GridView

protected DAL.DS." + tbn + @"Row GetSelectedRow_" + tbn + @"_GridView()
{
	"     + s + @"
	return r;
}


protected void _" + tbn + @"_GridView_SelectedIndexChanged(object sender, EventArgs e)
{
");
            if (pks.Count > 0)
            {
                sb.Append(@"
	DAL.DS."     + tbn + @"Row r = GetSelectedRow_" + tbn + @"_GridView();
	//todo
	_"     + tbn + @"_DetailPanel.Init(r, Mender.Web.Controls.DetailStates.View);
	_"     + tbn + @"_DetailPanel_DockPart.Show(""view"");
");
            }
            sb.Append(@"
}

protected void _" + tbn + @"_GVToolbar_OnRefreshButtonClicked(object sender, EventArgs e)
{
	_"     + tbn + @"_GridView.DataBind();
}

protected void _" + tbn + @"_GVToolbar_OnInsertButtonClicked(object sender, EventArgs e)
{
");
            if (pks.Count > 0)
            {
                sb.Append(@"
	DAL.DS."     + tbn + @"Row r = DAL.DS." + tbn + @"Row.CreateInstance(");
                for (int i = 0; i < wcs.Count; i++)
                {
                    Column c            = wcs[i];
                    string cn           = Utils.GetEscapeName(c);
                    string defaultvalue = Utils.GetDefaultValue(c);
                    if (i > 0)
                    {
                        sb.Append(@", ");
                    }
                    sb.Append(defaultvalue);
                }
                sb.Append(@");
	//todo
	_"     + tbn + @"_DetailPanel.Init(r, Mender.Web.Controls.DetailStates.Insert);
	_"     + tbn + @"_DetailPanel_DockPart.Show(""insert"");
");
            }
            sb.Append(@"
}

protected void _" + tbn + @"_GVToolbar_OnDeleteButtonClicked(object sender, EventArgs e)
{
");
            if (pks.Count > 0)
            {
                sb.Append(@"
	DAL.DS."     + tbn + @"Row r = GetSelectedRow_" + tbn + @"_GridView();
	//todo
	_"     + tbn + @"_DetailPanel.Init(r, Mender.Web.Controls.DetailStates.Delete);
	_"     + tbn + @"_DetailPanel_DockPart.Show(""delete"");
");
            }
            sb.Append(@"
}

protected void _" + tbn + @"_GVToolbar_OnEditButtonClicked(object sender, EventArgs e)
{
");
            if (pks.Count > 0)
            {
                sb.Append(@"
	DAL.DS."     + tbn + @"Row r = GetSelectedRow_" + tbn + @"_GridView();
	//todo
	_"     + tbn + @"_DetailPanel.Init(r, Mender.Web.Controls.DetailStates.Edit);
	_"     + tbn + @"_DetailPanel_DockPart.Show(""edit"");
");
            }
            sb.Append(@"
}

#endregion








");



            sb.Append(@"

#region _" + tbn + @"_DetailPanel

protected void _" + tbn + @"_DetailPanel_OnCancel(Mender.Web.Controls.DetailPanel dp)
{
	_"     + tbn + @"_DetailPanel_DockPart.Hide();
}

protected void _" + tbn + @"_DetailPanel_OnInsert(Mender.Web.Controls.DetailPanel dp)
{
	DAL.DS."     + tbn + @"Row r = (DAL.DS." + tbn + @"Row)dp.DataSource;
	//todo
	DAL.DB."     + tbn + @".Insert(r);
	_"     + tbn + @"_GridView.DataBind();
}

protected void _" + tbn + @"_DetailPanel_OnDelete(Mender.Web.Controls.DetailPanel dp)
{
	DAL.DS."     + tbn + @"Row r = (DAL.DS." + tbn + @"Row)dp.DataSource;
	//todo
	DAL.DB."     + tbn + @".Delete(r);
	_"     + tbn + @"_GridView.DataBind();
}

protected void _" + tbn + @"_DetailPanel_OnUpdate(Mender.Web.Controls.DetailPanel dp)
{
	DAL.DS."     + tbn + @"Row r = (DAL.DS." + tbn + @"Row)dp.DataSource;
	//todo
	DAL.DB."     + tbn + @".Update(r);
	_"     + tbn + @"_GridView.DataBind();
}

#endregion

");


            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#24
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            View      t = (View)sqlElements[0];

            List <Column> pks = Utils.GetPrimaryKeyColumns(t);

            if (pks.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有主键字段的视图生成该UI代码!";
                return(gr);
            }

            List <Column> wcs  = Utils.GetWriteableColumns(t);
            List <Column> socs = Utils.GetSortableColumns(t);
            List <Column> sacs = Utils.GetSearchableColumns(t);

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            string tbn = t.Name;

            sb.Append(@"
	<asp:GridView ID=""_"     + tbn + @"_GridView"" CssClass=""GridView"" runat=""server"" AllowPaging=""True"" AllowSorting=""True"" AutoGenerateColumns=""False"" DataKeyNames=""");
            for (int i = 0; i < pks.Count; i++)
            {
                if (i > 0)
                {
                    sb.Append(@", ");
                }
                sb.Append(pks[i].Name);
            }
            sb.Append(@""">
		<Columns>
			<asp:CommandField ShowSelectButton=""True"" />"            );
            foreach (Column c in t.Columns)
            {
                string cn      = c.Name;
                string caption = Utils.GetCaption(c);
                if (string.IsNullOrEmpty(caption) || caption.Trim().Length == 0)
                {
                    caption = c.Name;
                }
                string rdonly = wcs.Contains(c) ? "" : @" ReadOnly=""True""";
                string sort   = socs.Contains(c) ? (@" SortExpression=""" + cn + @"""") : "";

                sb.Append(@"
			<asp:BoundField DataField="""             + cn + @""" HeaderText=""" + caption + @"""" + rdonly + @"" + sort + @" />");
            }
            sb.Append(@"
		</Columns>
		<FooterStyle CssClass=""GridView_Footer"" />
		<EmptyDataRowStyle CssClass=""GridView_Empty"" />
		<RowStyle CssClass=""GridView_Row"" />
		<EditRowStyle CssClass=""GridView_EditRow"" />
		<SelectedRowStyle CssClass=""GridView_SelectedRow"" />
		<PagerStyle CssClass=""GridView_Pager"" />
		<HeaderStyle CssClass=""GridView_Header"" />
		<AlternatingRowStyle CssClass=""GridView_AlternatingRow"" />
	</asp:GridView>
");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#25
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];

            List <Column> pks = Utils.GetPrimaryKeyColumns(t);

            if (pks.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有主键字段的表生成该代码!";
                return(gr);
            }
            else if (pks.Count > 1)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为多主键字段的表生成该代码!";
                return(gr);
            }
            else if (!Utils.CheckIsNumericType(pks[0]))
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为非数字型主键字段的表生成该代码!";
                return(gr);
            }

            Column vc = pks[0];
            Column nc = null;

            List <Column> sacs = Utils.GetSearchableColumns(t);
            if (sacs.Count == 0)
            {
                nc = vc;
            }
            else
            {
                nc = sacs[0];
            }

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            string tbn = Utils.GetEscapeSqlObjectName(t.Name);

            sb.Append(@"/// <summary>
/// " + Utils.GetDescription(t) + @"
/// </summary>
public enum " + tbn + @"
{");
            DataSet ds = _db.ExecuteWithResults("SELECT [" + Utils.GetEscapeSqlObjectName(vc.Name) + "], [" + Utils.GetEscapeSqlObjectName(nc.Name) + "] FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + "].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"] ORDER BY [" + Utils.GetEscapeSqlObjectName(nc.Name) + "]");
            if (ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "当前表中没有数据!生成失败!";
                return(gr);
            }

            foreach (DataRow c in ds.Tables[0].Rows)
            {
                sb.Append(@"
	"     + Utils.GetEscapeName(c[nc.Name].ToString()) + @" = " + c[vc.Name].ToString() + @",");
            }
            sb.Append(@"
}
");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#26
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];

            List <Column> scs  = Utils.GetSearchableColumns(t);
            List <Column> socs = Utils.GetSortableColumns(t);

            if (socs.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有可排序字段的表生成该过程!";
                return(gr);
            }

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            sb.Append(@"
-- 针对 表 " + t.ToString() + @"
-- 根据填写的查询字串返回数行数据(带分页排序)
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll_Page_Custom] (
    @WhereString                    NVARCHAR(max)    = NULL,            -- tsql expression
    @SortExpression                 NVARCHAR(max)    = NULL,            -- column name
    @SortDirection                  INT              = NULL,            -- 0 : asc  1: desc
    @PageSize                       INT              = NULL,            -- page size
    @StartRowIndex                  INT              = NULL,            -- current page first row index
    @Count                          INT              = NULL    OUTPUT   -- rows count
) AS
BEGIN
    SET NOCOUNT ON;
    
    DECLARE @SqlStr NVARCHAR(max)
    DECLARE @SqlParm NVARCHAR(max)
    DECLARE @EndRowIndex INT;

    IF @WhereString IS NULL SET @WhereString = '';
    ELSE IF @WhereString <> '' SET @WhereString = ' WHERE ' + @WhereString;
    IF @SortExpression IS NULL OR @SortExpression = '' SET @SortExpression = '" + socs[0].Name + @"';
    IF @SortDirection IS NULL SET @SortDirection = 0;
    IF @SortDirection = 1 SET @SortExpression = @SortExpression + ' DESC'

    IF @PageSize IS NULL OR @PageSize < 1 SET @PageSize = 20;
    IF @StartRowIndex IS NULL OR @StartRowIndex < 0 SET @StartRowIndex = 0;
    SET @StartRowIndex = @StartRowIndex + 1;
    SET @EndRowIndex = @StartRowIndex + @PageSize - 1;

    SET @SqlStr = 'SELECT @Count = COUNT(*) FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]' + @WhereString;
    SET @SqlParm = '@Count INT OUTPUT';
    EXEC sp_executesql @SqlStr, @SqlParm, @Count OUTPUT;

    SET @SqlStr = '
    WITH T AS
    (
        SELECT ");
            for (int i = 0; i < t.Columns.Count; i++)
            {
                Column c = t.Columns[i];
                sb.Append((i > 0 ? @"
             , " : "") + @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
            }
            sb.Append(@"
             , ROW_NUMBER() OVER (ORDER BY ' + @SortExpression + ') AS ''RowNumber''
          FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"] ' + @WhereString + '
    )
    SELECT ");
            for (int i = 0; i < t.Columns.Count; i++)
            {
                Column c = t.Columns[i];
                sb.Append((i > 0 ? @"
         , " : "") + @"T.[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]");
            }
            sb.Append(@"
      FROM T
     WHERE T.RowNumber BETWEEN @StartRowIndex AND @EndRowIndex';
    SET @SqlParm = '@StartRowIndex INT, @EndRowIndex INT';
    EXEC sp_executesql @SqlStr, @SqlParm, @StartRowIndex, @EndRowIndex;

    RETURN 0
END


-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 表 " + t.ToString() + @"
根据填写的查询字串返回数行数据(带分页排序)' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll_Page_Custom'
EXEC sys.sp_addextendedproperty @name=N'SPGenSettings_ResultType', @value=N'" + t.ToString() + @"' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_SelectAll_Page_Custom'

");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#27
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];


            List <Column> pks  = Utils.GetPrimaryKeyColumns(t);
            List <Column> wcs  = Utils.GetWriteableColumns(t);
            List <Column> mwcs = Utils.GetMustWriteColumns(t);

            if (wcs == null || wcs.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有可写入字段的表生成该过程!";
                return(gr);
            }
            if (pks == null || pks.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有主键字段的表生成该过程!";
                return(gr);
            }

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            sb.Append(@"
-- 针对 表 " + t.ToString() + @"
-- 根据主键的值定位一行数据并修改
-- 操作成功返回 受影响行数, 失败返回
-- -1: 主键为空
-- -2: 主键未找到
-- -3: 为必填字段传入了空值
-- -4: 欲更新的主键值已存在
-- -5: 外键在相关表中未找到
-- -6: 更新失败
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Update] (");
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
    " + (i > 0 ? ", " : "  ") + Utils.FormatString("@Original_" + cn, Utils.GetParmDeclareStr(c), 40));
            }
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c  = wcs[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
    , " + Utils.FormatString("@" + cn, Utils.GetParmDeclareStr(c), "= NULL", 40, 40));
            }
            sb.Append(@"
) AS
BEGIN
    SET NOCOUNT ON;
");
            //判断原始主键必填
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                string cc = Utils.GetCaption(c);
                sb.Append(@"
    IF @Original_" + cn + @" IS NULL RETURN -1;
");
            }

            //判断原始主键必存在
            sb.Append(@"
	-- 这里也可以先不判断原记录是否存在,直接取值,并任意判断一个非空值是否取到
    IF NOT EXISTS (
        SELECT 1 FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]
--          WITH (UPDLOCK)
         WHERE ");
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                if (i > 0)
                {
                    sb.Append(@" AND ");
                }
                sb.Append(@"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @Original_" + cn);
            }
            sb.Append(@"
    ) RETURN -2;
");

            // 从原数据行读出必填字段原始值并锁定

            // 声明字段原始值
            string s = "";
            foreach (Column c in wcs)
            {
                if (pks.Contains(c))
                {
                    continue;                             // 主键已传入了原始值
                }
                if (c.Nullable)
                {
                    continue;
                }
                string cn = Utils.GetEscapeName(c);
                string cc = Utils.GetCaption(c);
                if (mwcs.Contains(c))
                {
                    sb.Append(@"
    DECLARE @Original_" + cn + @" " + Utils.GetParmDeclareStr(c) + @";");

                    s += (s.Length > 0 ? ", " : "") + "@Original_" + cn + @" = [" + Utils.GetEscapeSqlObjectName(c.Name) + @"]";
                }
            }
            if (s.Length > 0)
            {
                sb.Append(@"
    SELECT " + s + @"
      FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]
--      WITH (UPDLOCK)
     WHERE ");
                for (int i = 0; i < pks.Count; i++)
                {
                    Column c  = pks[i];
                    string cn = Utils.GetEscapeName(c);
                    if (i > 0)
                    {
                        sb.Append(@" AND ");
                    }
                    sb.Append(@"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @Original_" + cn);
                }
                sb.Append(@";");
            }

            //判断必填字段是否填写了空值
            foreach (Column c in wcs)
            {
                if (c.Nullable)
                {
                    continue;
                }
                string cn = Utils.GetEscapeName(c);
                string cc = Utils.GetCaption(c);
                if (mwcs.Contains(c))
                {
                    sb.Append(@"
    IF @" + cn + @" IS NULL SET @" + cn + @" = @Original_" + cn + @";
    -- ELSE IF LEN(@" + cn + @") = 0 RETURN -3;
");
                }
                else
                {
                    sb.Append(@"
    -- IF @" + cn + @" IS NULL SET @" + cn + @" = " + c.DefaultConstraint.Text + @";
");
                }
            }


            //判断新主键值是否和已有主键重复
            if (pks.Count == 1 && pks[0].Identity)
            {
            }
            else
            {
                sb.Append(@"
    IF ");
                bool isFirst = true;
                foreach (Column c in pks)
                {
                    if (c.Identity)
                    {
                        continue;
                    }
                    string cn = Utils.GetEscapeName(c);
                    string cc = Utils.GetCaption(c);
                    if (!isFirst)
                    {
                        sb.Append(@" OR ");
                    }
                    sb.Append(@"@Original_" + cn + @" <> @" + cn);
                    isFirst = false;
                }
                sb.Append(@"
    BEGIN
        IF EXISTS (
            SELECT 1 FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]
             WHERE ");
                for (int i = 0; i < pks.Count; i++)
                {
                    Column c  = pks[i];
                    string cn = Utils.GetEscapeName(c);
                    string cc = Utils.GetCaption(c);
                    if (i > 0)
                    {
                        sb.Append(@" AND ");
                    }
                    sb.Append(@"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @Original_" + cn);
                }
                sb.Append(@"
        ) RETURN -4;
    END;
");
                //判断外键字段是否在外键表中存在
                foreach (ForeignKey fk in t.ForeignKeys)
                {
                    Table ft = t.Parent.Tables[fk.ReferencedTable, fk.ReferencedTableSchema];
                    sb.Append(@"
    IF NOT EXISTS (
        SELECT 1 FROM [" + Utils.GetEscapeSqlObjectName(ft.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(ft.Name) + @"]
         WHERE ");
                    string s1 = "";
                    for (int i = 0; i < fk.Columns.Count; i++)
                    {
                        ForeignKeyColumn fkc = fk.Columns[i];
                        Column           c   = t.Columns[fkc.Name];
                        string           cn  = Utils.GetEscapeName(c);
                        string           cc  = Utils.GetCaption(c);

                        if (i > 0)
                        {
                            sb.Append(@" AND ");
                        }
                        sb.Append("(" + (c.Nullable ? (" @" + cn + @" IS NULL OR ") : "") + @"[" + Utils.GetEscapeSqlObjectName(fkc.ReferencedColumn) + @"] = @" + cn + @")");
                        if (i > 0)
                        {
                            s1 += ",";
                        }
                        s1 += Utils.GetCaption(t.Columns[fkc.Name]);
                    }
                    sb.Append(@"
    ) RETURN -5;
");
                }
            }

            sb.Append(@"
/*
    --prepare trans & error
    DECLARE @TranStarted bit, @ReturnValue int;
    SELECT @TranStarted = 0, @ReturnValue = 0;
    IF @@TRANCOUNT = 0 
    BEGIN
        BEGIN TRANSACTION;
        SET @TranStarted = 1
    END;
*/

    DECLARE @ERROR INT, @ROWCOUNT INT;

    UPDATE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]
       SET ");
            for (int i = 0; i < wcs.Count; i++)
            {
                Column c  = wcs[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append((i > 0 ? @"
         , " : "") + Utils.FormatString("[" + Utils.GetEscapeSqlObjectName(c.Name) + @"]", "= @" + cn, 40));
            }
            s = "";
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                if (i > 0)
                {
                    s += " AND ";
                }
                s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @Original_" + cn;
            }
            if (s.Length > 0)
            {
                sb.Append(@"
     WHERE " + s);
            }
            sb.Append(@";

    SELECT @ERROR = @@ERROR, @ROWCOUNT = @@ROWCOUNT;
    IF @ERROR <> 0 OR @ROWCOUNT = 0
    BEGIN
/*
        @ReturnValue = -6;
        GOTO Cleanup;
*/
        RETURN -6;
    END

/*
    @ReturnValue = @ROWCOUNT;
    GOTO Cleanup;
*/

    RETURN @ROWCOUNT;

/*
    --cleanup trans
    IF @TranStarted = 1 COMMIT TRANSACTION;
    RETURN @ReturnValue;
Cleanup:
    IF @TranStarted = 1 ROLLBACK TRANSACTION;
    RETURN @ReturnValue;
*/
END


-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 表 " + t.ToString() + @"
根据主键的值定位一行数据并修改
操作成功返回 受影响行数, 失败返回
-1: 主键为空
-2: 主键未找到
-3: 为必填字段传入了空值
-4: 欲更新的主键值已存在
-5: 外键在相关表中未找到
-6: 更新失败' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_UpdatePart'
");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#28
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];

            List <Column> pks = Utils.GetPrimaryKeyColumns(t);

            if (pks.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有主键字段的表生成该UI代码!";
                return(gr);
            }

            List <Column> wcs = Utils.GetWriteableColumns(t);

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen CSS

            sb.Append(@"

<style type=""text/css"">

    .UL_DETAIL, .LI_FIELD, .LI_BUTTON, .UL_FIELD, .UL_FIELD, .LI_FIELD_LABEL, .LI_FIELD_CONTENT, .LI_FIELD_MESSAGE
    {
        float:left;
        margin:0px;
        list-style:none;
        padding:0px;
    }
    .UL_DETAIL
    {
        font-size:12px;
        width:600px;
    }
    .LI_FIELD
    {
        width:600px;
    }
    .LI_BUTTON
    {
        width:600px;
    }
    .LI_FIELD_LABEL
    {
        width:150px;
    }
    .LI_FIELD_CONTENT
    {
        width:200px;
    }
    .LI_FIELD_MESSAGE
    {
        width:250px;
    }
    .LI_FIELD_CONTENT_TA, .LI_FIELD_CONTENT_TB, .LI_FIELD_CONTENT_CB, .LI_FIELD_CONTENT_DDL
    {
        width:180px;
    }
    .LI_FIELD_CONTENT_TA
    {
        height:60px;
    }
    .LI_FIELD_CONTENT_TB, .LI_FIELD_CONTENT_CB
    {
        height:18px;
    }
    .TABLE_BUTTON
    {
        width:600px;
    }
    .TD_MESSAGE
    {
        width:500px;
    }
    .TD_BUTTON
    {
        text-align:right;
        float:right;
    }

</style>
");

            string result_css = sb.ToString();
            sb.Remove(0, sb.Length);

            #endregion

            #region Gen ASPX

            string tn = Utils.GetEscapeName(t);
            string tc = Utils.GetCaption(t);

            sb.Append(@"
<!-- " + tn + " (" + tc + ")" + @" -->
<ul class=""UL_DETAIL"">");

            foreach (Column c in t.Columns)
            {
                // 如果 c 是外键,则注释
                bool isForeignKey = Utils.CheckIsForeignKey(c);

                sb.Append(isForeignKey ? @"<%--" : "");

                sb.Append(@"
    <li class=""LI_FIELD"">
        <ul class=""UL_FIELD"">
            <li class=""LI_FIELD_LABEL"">" + GenTD1(c) + @"            
            </li>
            <li class=""LI_FIELD_CONTENT"">" + GenTD2(c) + @"            
            </li>
            <li class=""LI_FIELD_MESSAGE"">" + GenTD3(c) + @"            
            </li>
        </ul>
    </li>
");
                sb.Append(isForeignKey ? @"--%>" : "");
            }

            // todo: 多字段外键支持
            foreach (ForeignKey fk in t.ForeignKeys)
            {
                Column c  = t.Columns[fk.Columns[0].Name];
                Table  ft = _db.Tables[fk.ReferencedTable, fk.ReferencedTableSchema];
                Column fc = ft.Columns[fk.Columns[0].ReferencedColumn];
                sb.Append(@"
    <li class=""LI_FIELD"">
        <ul class=""UL_FIELD"">
            <li class=""LI_FIELD_LABEL"">" + GenTD1(c) + @"            
            </li>
            <li class=""LI_FIELD_CONTENT"">" + GenTD2_DDL(c, ft, fc) + @"            
            </li>
            <li class=""LI_FIELD_MESSAGE"">" + GenTD3(c) + @"            
            </li>
        </ul>
    </li>
");
            }


            sb.Append(@"
    <li class=""LI_BUTTON"">
        <table class=""TABLE_BUTTON"" cellpadding=""0"" cellspacing=""0"" border=""0"">
            <tr>
                <td class=""TD_MESSAGE"">
                    <asp:PlaceHolder runat=""server"" ID=""_Message_PlaceHolder""></asp:PlaceHolder>
                </td>
                <td class=""TD_BUTTON"" valign=""top"">
                    <input type=""button"" runat=""server"" id=""_Submit_Button"" value=""提交"" />
                </td>
            </tr>
        </table>
    </li>
</ul>
");

            string result_aspx = sb.ToString();
            sb.Remove(0, sb.Length);

            #endregion

            #region Gen CS


            sb.Append(@"
protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    _Submit_Button.ServerClick += new EventHandler(_Submit_Button_ServerClick);
    
    if (!IsPostBack)
    {
        // todo
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // todo: init data here

        var o = new OO." + tn + @"();

        // todo: init data here

        SetData(o);
    }
}

void _Submit_Button_ServerClick(object sender, EventArgs e)
{
    var o = GetData();

    if (HasErrors) return;

    try
    {
        OB." + tn + @".Insert(o);
        EnableControls(false);
        _Submit_Button.Disabled = true;

        OP(""数据保存成功!"");
    }
    catch(Exception ex)
    {
        OP(""数据保存失败..."" + ex.Message);
    }
}

void SetData(OO." + tn + @" o)
{");
            foreach (Column c in t.Columns)
            {
                sb.Append(@"
");
                bool   isForeignKey = Utils.CheckIsForeignKey(c);
                string cn           = Utils.GetEscapeName(c);

                sb.Append(isForeignKey ? @"
/*
                     " : "");

                if (c.Nullable)
                {
                    if (Utils.CheckIsStringType(c))
                    {
                        sb.Append(@"
    _" + cn + @"_TextBox.Text = o." + cn + @" ?? """";");
                    }
                    else if (Utils.CheckIsNumericType(c) || Utils.CheckIsDateTimeType(c) || Utils.CheckIsGuidType(c))
                    {
                        sb.Append(@"
    if (o." + cn + @" == null) _" + cn + @"_TextBox.Text = """";
    else _" + cn + @"_TextBox.Text = o." + cn + @".ToString();");
                    }
                    else if (Utils.CheckIsBooleanType(c))
                    {
                        sb.Append(@"
    if (o." + cn + @" == null) _" + cn + @"_RadioButtonList.SelectedIndex = 0;
    else _" + cn + @"_RadioButtonList.SelectedIndex = o." + cn + @".value ? 1 : 2;");
                    }
                    else if (Utils.CheckIsBinaryType(c))
                    {
                        // todo
                    }
                }
                else
                {
                    if (Utils.CheckIsStringType(c))
                    {
                        sb.Append(@"
    _" + cn + @"_TextBox.Text = o." + cn + @";");
                    }
                    else if (Utils.CheckIsNumericType(c))
                    {
                        sb.Append(@"
    _" + cn + @"_TextBox.Text = o." + cn + @".ToString();");
                    }
                    else if (Utils.CheckIsGuidType(c))
                    {
                        sb.Append(@"
    if (o." + cn + @" == Guid.Empty) _" + cn + @"_TextBox.Text = """";
    else _" + cn + @"_TextBox.Text = o." + cn + @".ToString();");
                    }
                    else if (Utils.CheckIsDateTimeType(c))
                    {
                        sb.Append(@"
    if (o." + cn + @" == DateTime.MinValue) _" + cn + @"_TextBox.Text = """";
    else _" + cn + @"_TextBox.Text = o." + cn + @".ToString();");
                    }
                    else if (Utils.CheckIsBooleanType(c))
                    {
                        sb.Append(@"
    _" + cn + @"_CheckBox.Checked = o." + cn + @";");
                    }
                    else if (Utils.CheckIsBinaryType(c))
                    {
                        // todo
                    }
                }

                sb.Append(isForeignKey ? @"
*/
                     " : "");
            }

            foreach (ForeignKey fk in t.ForeignKeys)
            {
                Column c  = t.Columns[fk.Columns[0].Name];
                Table  ft = _db.Tables[fk.ReferencedTable, fk.ReferencedTableSchema];
                Column fc = ft.Columns[fk.Columns[0].ReferencedColumn];
                Column dc = Utils.GetDisplayColumn(ft);

                string cn  = Utils.GetEscapeName(c);
                string fcn = Utils.GetEscapeName(fc);
                string ftn = Utils.GetEscapeName(ft);
                string dcn = Utils.GetEscapeName(dc);

                sb.Append(@"
    _" + cn + @"_DropDownList.DataSource = OB." + ftn + @".SelectAll();
    _" + cn + @"_DropDownList.DataTextField = DI." + ftn + @"." + dcn + @".ToString();
    _" + cn + @"_DropDownList.DataValueField = DI." + ftn + @"." + fcn + @".ToString();
    _" + cn + @"_DropDownList.DataBind();
");
                if (c.Nullable)
                {
                    sb.Append(@"
    _" + cn + @"_DropDownList.Items.Insert(0, """");
");
                }
                sb.Append(@"
    var " + cn + @"_Value = o." + cn + @" == null ? """" : o." + cn + @".ToString();
    foreach (ListItem item in _" + cn + @"_DropDownList.Items)
    {
        if (item.Value == " + cn + @"_Value)
        {
            item.Selected = true;
            break;
        }
    }
");
            }

            sb.Append(@"

    // todo: more control init here
}


OO." + tn + @" GetData()
{
    var o = new OO." + tn + @"();

");

            foreach (Column c in t.Columns)
            {
                bool   isForeignKey = Utils.CheckIsForeignKey(c);
                string cn           = Utils.GetEscapeName(c);

                sb.Append(isForeignKey ? @"
/*
                     " : "");

                if (c.Nullable)
                {
                    if (Utils.CheckIsStringType(c))
                    {
                        sb.Append(@"
    _" + cn + @"_TextBox.Text = _" + cn + @"_TextBox.Text.Trim();
    if (_" + cn + @"_TextBox.Text == """") o." + cn + @" = null;
    else o." + cn + @" = _" + cn + @"_TextBox.Text;");
                    }
                    else if (Utils.CheckIsNumericType(c) || Utils.CheckIsDateTimeType(c))
                    {
                        sb.Append(@"
    _" + cn + @"_TextBox.Text = _" + cn + @"_TextBox.Text.Trim();
    if (_" + cn + @"_TextBox.Text == """") o." + cn + @" = null;
    else
    {
        try
        {
            o." + cn + @" = " + Utils.GetDataType(c) + @".Parse(_" + cn + @"_TextBox.Text);
            _" + cn + @"_Warning_Label.Text = """";
        }
        catch(Exception ex)
        {
            OP(""必须正确输入" + Utils.GetCaption(c) + @"!"");
            _" + cn + @"_Warning_Label.Text = ""*"";
        }
    }");
                    }
                    else if (Utils.CheckIsBooleanType(c))
                    {
                        sb.Append(@"
    if (_" + cn + @"_RadioButtonList.SelectedValue == """") o." + cn + @" = null;
    else o." + cn + @" = _" + cn + @"_RadioButtonList.SelectedValue == ""1"";
    _" + cn + @"_Warning_Label.Text = """";");
                    }
                    //else if (Utils.CheckIsDateTimeType(c))
                    //{
                    //}
                    else if (Utils.CheckIsGuidType(c))
                    {
                        sb.Append(@"
    _" + cn + @"_TextBox.Text = _" + cn + @"_TextBox.Text.Trim();
    if (_" + cn + @"_TextBox.Text == """") o." + cn + @" = null;
    else
    {
        try
        {
            o." + cn + @" = new Guid(_" + cn + @"_TextBox.Text);
            _" + cn + @"_Warning_Label.Text = """";
        }
        catch(Exception ex)
        {
            OP(""必须正确输入" + Utils.GetCaption(c) + @"!"");
            _" + cn + @"_Warning_Label.Text = ""*"";
        }
    }");
                    }
                    else if (Utils.CheckIsBinaryType(c))
                    {
                        // todo
                    }
                }
                else
                {
                    if (Utils.CheckIsStringType(c))
                    {
                        sb.Append(@"
    // _" + cn + @"_TextBox.Text = _" + cn + @"_TextBox.Text.Trim();
    // if (_" + cn + @"_TextBox.Text == """")
    // {
        // OP(""必须正确输入" + Utils.GetCaption(c) + @"!"");
        // _" + cn + @"_Warning_Label.Text = ""*"";
    // }
    // else
    // {
    o." + cn + @" = _" + cn + @"_TextBox.Text;
    _" + cn + @"_Warning_Label.Text = """";
    // }");
                    }
                    else if (Utils.CheckIsNumericType(c) || Utils.CheckIsDateTimeType(c))
                    {
                        sb.Append(@"
    _" + cn + @"_TextBox.Text = _" + cn + @"_TextBox.Text.Trim();
    try
    {
        o." + cn + @" = " + Utils.GetDataType(c) + @".Parse(_" + cn + @"_TextBox.Text);
        _" + cn + @"_Warning_Label.Text = """";
    }
    catch(Exception ex)
    {
        OP(""必须正确输入" + Utils.GetCaption(c) + @"!"");
        _" + cn + @"_Warning_Label.Text = ""*"";
    }");
                    }
                    else if (Utils.CheckIsBooleanType(c))
                    {
                        sb.Append(@"
    o." + cn + @" = _" + cn + @"_CheckBox.Checked;
    _" + cn + @"_Warning_Label.Text = """";");
                    }
                    //else if (Utils.CheckIsDateTimeType(c))
                    //{
                    //}
                    else if (Utils.CheckIsGuidType(c))
                    {
                        sb.Append(@"
    _" + cn + @"_TextBox.Text = _" + cn + @"_TextBox.Text.Trim();
    try
    {
        o." + cn + @" = new Guid(_" + cn + @"_TextBox.Text);
        _" + cn + @"_Warning_Label.Text = """";
    }
    catch(Exception ex)
    {
        OP(""必须正确输入" + Utils.GetCaption(c) + @"!"");
        _" + cn + @"_Warning_Label.Text = ""*"";
    }");
                    }
                    else if (Utils.CheckIsBinaryType(c))
                    {
                        // todo
                    }
                }

                sb.Append(isForeignKey ? @"
*/
                     " : "");
            }

            foreach (ForeignKey fk in t.ForeignKeys)
            {
                Column c  = t.Columns[fk.Columns[0].Name];
                Table  ft = _db.Tables[fk.ReferencedTable, fk.ReferencedTableSchema];
                Column fc = ft.Columns[fk.Columns[0].ReferencedColumn];
                Column dc = Utils.GetDisplayColumn(ft);

                string cn  = Utils.GetEscapeName(c);
                string fcn = Utils.GetEscapeName(fc);
                string ftn = Utils.GetEscapeName(ft);
                string dcn = Utils.GetEscapeName(dc);

                string typename = Utils.GetDataType(c);
                if (c.Nullable)
                {
                    if (Utils.CheckIsStringType(c))
                    {
                        sb.Append(@"
    o." + cn + @" = _" + cn + @"_DropDownList.SelectedValue == """" ? null : _" + cn + @"_DropDownList.SelectedValue;
");
                    }
                    else if (Utils.CheckIsNumericType(c) || Utils.CheckIsBooleanType(c) || Utils.CheckIsDateTimeType(c))
                    {
                        sb.Append(@"
    o." + cn + @" = _" + cn + @"_DropDownList.SelectedValue == """" ? null : new " + typename + @"?(" + typename + @".Parse(_" + cn + @"_DropDownList.SelectedValue));
");
                    }
                    else if (Utils.CheckIsGuidType(c))
                    {
                        sb.Append(@"
    o." + cn + @" = _" + cn + @"_DropDownList.SelectedValue == """" ? null : new Guid?(new Guid(_" + cn + @"_DropDownList.SelectedValue));
");
                    }
                    else
                    {
                        throw new Exception("no handle data type");
                    }
                }
                else
                {
                    if (Utils.CheckIsStringType(c))
                    {
                        sb.Append(@"
    o." + cn + @" = _" + cn + @"_DropDownList.SelectedValue;
");
                    }
                    else if (Utils.CheckIsNumericType(c) || Utils.CheckIsBooleanType(c) || Utils.CheckIsDateTimeType(c))
                    {
                        sb.Append(@"
    o." + cn + @" = new " + typename + @"?(" + typename + @".Parse(_" + cn + @"_DropDownList.SelectedValue));
");
                    }
                    else if (Utils.CheckIsGuidType(c))
                    {
                        sb.Append(@"
    o." + cn + @" = new Guid?(new Guid(_" + cn + @"_DropDownList.SelectedValue));
");
                    }
                    else
                    {
                        throw new Exception("no handle data type");
                    }
                }
            }


            sb.Append(@"

    if (!HasErrors)
    {
        // todo: more check here
    }

    return o;
}

int _msgCounter = 0;
void OP(string msg)
{
    _msgCounter++;
    _Message_PlaceHolder.Controls.Add(new Label() { Text = msg, ForeColor = System.Drawing.Color.Red });
    if (_msgCounter % 4 == 0) _Message_PlaceHolder.Controls.Add(new Literal() { Text = ""<br />"" });
}

bool HasErrors
{
    get { return _msgCounter > 0; }
}

void EnableControls(bool b)
{");
            foreach (Column c in t.Columns)
            {
                bool isForeignKey = Utils.CheckIsForeignKey(c);
                sb.Append(isForeignKey ? @"
/*
                     " : "");

                if (c.Nullable)
                {
                    if (Utils.CheckIsStringType(c) || Utils.CheckIsNumericType(c) || Utils.CheckIsDateTimeType(c) || Utils.CheckIsGuidType(c))
                    {
                        sb.Append(@"
    _" + Utils.GetEscapeName(c) + @"_TextBox.Enabled = b;");
                    }
                    else if (Utils.CheckIsBooleanType(c))
                    {
                        sb.Append(@"
    _" + Utils.GetEscapeName(c) + @"_RadioButtonList.Enabled = b;");
                    }
                    else if (Utils.CheckIsBinaryType(c))
                    {
                        // todo
                    }
                }
                else
                {
                    if (Utils.CheckIsStringType(c) || Utils.CheckIsNumericType(c) || Utils.CheckIsDateTimeType(c) || Utils.CheckIsGuidType(c))
                    {
                        sb.Append(@"
    _" + Utils.GetEscapeName(c) + @"_TextBox.Enabled = b;");
                    }
                    else if (Utils.CheckIsBooleanType(c))
                    {
                        sb.Append(@"
    _" + Utils.GetEscapeName(c) + @"_CheckBox.Enabled = b;");
                    }
                    else if (Utils.CheckIsBinaryType(c))
                    {
                    }
                }
                sb.Append(isForeignKey ? @"
*/
                     " : "");
            }

            foreach (ForeignKey fk in t.ForeignKeys)
            {
                Column c  = t.Columns[fk.Columns[0].Name];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
    _" + cn + @"_DropDownList.Enabled = b;");
            }

            sb.Append(@"
}");

            #endregion

            #region return

            gr = new GenResult(GenResultTypes.CodeSegments);
            gr.CodeSegments = new List <KeyValuePair <string, string> >();
            gr.CodeSegments.Add(new KeyValuePair <string, string>("CSS Style", result_css));
            gr.CodeSegments.Add(new KeyValuePair <string, string>("ASPX Code", result_aspx));
            gr.CodeSegments.Add(new KeyValuePair <string, string>("C# Code", sb.ToString()));
            return(gr);

            #endregion
        }
示例#29
0
        public GenResult Gen(params object[] sqlElements)
        {
            GenResult gr;

            if (_isPopupConfigForm)
            {
                DialogResult dr;

                using (FGen_Database_DAL_Config cfg = new FGen_Database_DAL_Config(_db, _currentSchemeID))
                {
                    dr = cfg.ShowDialog();
                }

                if (dr != DialogResult.OK)
                {
                    gr         = new GenResult(GenResultTypes.Message);
                    gr.Message = null;
                    return(gr);
                }
            }
            Utils.LoadDatabaseDALGenSettingDS(_db, _currentSchemeID);

            string ns = Utils._CurrrentDALGenSetting_CurrentScheme.Namespace;

            // 只要有任意的数据操作方法需要生成, 即生成 DC 对象根
            bool isSupportDC = Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_Table ||
                               Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_View ||
                               Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_Function ||
                               Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_SP ||
                               Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_View ||
                               Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_Table ||
                               Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_Function ||
                               Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_SP;

            // 只要有 DB, OB 其中之一需要生成, 即生成相应 DC 对象
            bool isSupportDC_Table    = Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_Table || Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_Table;
            bool isSupportDC_View     = Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_View || Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_View;
            bool isSupportDC_Function = Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_Function || Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_Function;
            bool isSupportDC_SP       = Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_SP || Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_SP;


            gr       = new GenResult(GenResultTypes.Files);
            gr.Files = new List <KeyValuePair <string, byte[]> >();

            using (FOutputText fw = new FOutputText("Gening...Plz Wait...", "", 350, 500, true))
            {
                fw.Text = "Generate Information";
                fw.Show();
                fw.Activate();

                fw.Write("Analysing");
                fw.Write(Color.Blue, "Prefetch");
                fw.WriteLine("...");

                #region Prefetch

                ScriptingOptions option = new ScriptingOptions();
                option.ExtendedProperties = true;
                try
                {
                    _db.PrefetchObjects(typeof(Microsoft.SqlServer.Management.Smo.StoredProcedure), option);
                }
                catch { }
                try
                {
                    _db.PrefetchObjects(typeof(Microsoft.SqlServer.Management.Smo.UserDefinedFunction), option);
                }
                catch { }
                try
                {
                    _db.PrefetchObjects(typeof(Microsoft.SqlServer.Management.Smo.View), option);
                }
                catch { }
                try
                {
                    _db.PrefetchObjects(typeof(Microsoft.SqlServer.Management.Smo.Table), option);
                }
                catch { }
                try
                {
                    _db.PrefetchObjects(typeof(Microsoft.SqlServer.Management.Smo.UserDefinedType), option);
                }
                catch { }
                if (_db.CompatibilityLevel >= CompatibilityLevel.Version100)
                {
                    try
                    {
                        _db.PrefetchObjects(typeof(Microsoft.SqlServer.Management.Smo.UserDefinedTableType), option);
                    }
                    catch { }
                }

                #endregion

                fw.WriteLine(Color.OrangeRed, "Done!");


                fw.Write("Generating");
                fw.Write(Color.Blue, " Database Informatin");
                fw.WriteLine("...");

                gr.Files.Add(new KeyValuePair <string, byte[]>("DI.cs", Encoding.UTF8.GetBytes(
                                                                   Gen_DI.Gen(_db, ns, "DS2")
                                                                   )));

                fw.WriteLine(Color.OrangeRed, "Done!");


                if (_db.CompatibilityLevel >= CompatibilityLevel.Version100)
                {
                    fw.Write("Generating");
                    fw.Write(Color.Blue, "UserDefinedTableType Information");
                    fw.WriteLine("...");

                    gr.Files.Add(new KeyValuePair <string, byte[]>("DI2.cs", Encoding.UTF8.GetBytes(
                                                                       Gen_DI2.Gen(_db, ns, "DI2")
                                                                       )));

                    fw.WriteLine(Color.OrangeRed, "Done!");



                    fw.Write("Generating");
                    fw.Write(Color.Blue, "UserDefinedTableType DataSet Declare");
                    fw.WriteLine("...");

                    gr.Files.Add(new KeyValuePair <string, byte[]>("DS2.cs", Encoding.UTF8.GetBytes(
                                                                       Gen_DS2.Gen(_db, ns, "DS2")
                                                                       )));

                    fw.WriteLine(Color.OrangeRed, "Done!");



                    fw.Write("Generating");
                    fw.Write(Color.Blue, "UserDefinedTableType Object Class Declare");
                    fw.WriteLine("...");

                    gr.Files.Add(new KeyValuePair <string, byte[]>("OO2.cs", Encoding.UTF8.GetBytes(
                                                                       Gen_OO2.Gen(_db, ns, Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportWCF, "DS2")
                                                                       )));

                    fw.WriteLine(Color.OrangeRed, "Done!");
                }


                if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDS)
                {
                    fw.Write("Generating");
                    fw.Write(Color.Blue, "DataSet");
                    fw.WriteLine("...");

                    gr.Files.Add(new KeyValuePair <string, byte[]>("DS.cs", Encoding.UTF8.GetBytes(
                                                                       Gen_DS.Gen(_db, ns, "DS")
                                                                       )));

                    fw.WriteLine(Color.OrangeRed, "Done!");
                }


                if (isSupportDC)
                {
                    fw.Write("Generating");
                    fw.Write(Color.Blue, "Data Command");
                    fw.WriteLine("...");

                    gr.Files.Add(new KeyValuePair <string, byte[]>("DC.cs", Encoding.UTF8.GetBytes(
                                                                       Gen_DC.Gen(_db, ns)
                                                                       )));

                    if (isSupportDC_Table)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("DC_Table.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_DC_Table.Gen(_db, ns)
                                                                           )));
                    }
                    if (isSupportDC_View)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("DC_View.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_DC_View.Gen(_db, ns)
                                                                           )));
                    }
                    if (isSupportDC_Function)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("DC_Function.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_DC_Function.Gen(_db, ns)
                                                                           )));
                    }
                    if (isSupportDC_SP)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("DC_StoredProcedure.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_DC_StoredProcedure.Gen(_db, ns)
                                                                           )));
                    }

                    fw.WriteLine(Color.OrangeRed, "Done!");
                }

                if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_Table ||
                    Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_View ||
                    Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_Function ||
                    Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_SP)
                {
                    fw.Write("Generating");
                    fw.Write(Color.Blue, "DataSet Business");
                    fw.WriteLine("...");

                    gr.Files.Add(new KeyValuePair <string, byte[]>("DB.cs", Encoding.UTF8.GetBytes(
                                                                       Gen_DB.Gen(_db, ns, "DS", "DS2")
                                                                       )));

                    if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_Table)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("DB_Table.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_DB_Table.Gen(_db, ns, "DS", "DS2")
                                                                           )));
                    }
                    if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_View)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("DB_View.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_DB_View.Gen(_db, ns, "DS", "DS2")
                                                                           )));
                    }
                    if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_Function)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("DB_Function.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_DB_Function.Gen(_db, ns, "DS", "DS2")
                                                                           )));
                    }
                    if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportDB_SP)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("DB_StoredProcedure.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_DB_StoredProcedure.Gen(_db, ns, "DS", "DS2")
                                                                           )));
                    }

                    fw.WriteLine(Color.OrangeRed, "Done!");
                }

                if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOO)
                {
                    fw.Write("Generating");
                    fw.Write(Color.Blue, "Object Class Declare");
                    fw.WriteLine("...");

                    gr.Files.Add(new KeyValuePair <string, byte[]>("OO.cs", Encoding.UTF8.GetBytes(
                                                                       Gen_OO.Gen(_db, ns, Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportWCF)
                                                                       )));

                    fw.WriteLine(Color.OrangeRed, "Done!");
                }

                if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_Table ||
                    Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_View ||
                    Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_Function ||
                    Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_SP)
                {
                    fw.Write("Generating");
                    fw.Write(Color.Blue, "Object Business");
                    fw.WriteLine("...");

                    gr.Files.Add(new KeyValuePair <string, byte[]>("OB.cs", Encoding.UTF8.GetBytes(
                                                                       Gen_OB.Gen(_db, ns, "OO2")
                                                                       )));

                    if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_Table)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("OB_Table.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_OB_Table.Gen(_db, ns, "OO2")
                                                                           )));
                    }
                    if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_View)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("OB_View.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_OB_View.Gen(_db, ns, "OO2")
                                                                           )));
                    }
                    if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_Function)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("OB_Function.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_OB_Function.Gen(_db, ns, "OO2")
                                                                           )));
                    }
                    if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_SP)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("OB_StoredProcedure.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_OB_StoredProcedure.Gen(_db, ns, "OO2")
                                                                           )));
                    }

                    fw.WriteLine(Color.OrangeRed, "Done!");
                }


                if (isSupportDC)
                {
                    fw.Write("Generating");
                    fw.Write(Color.Blue, "Object Expression");
                    fw.WriteLine("...");

                    gr.Files.Add(new KeyValuePair <string, byte[]>("OE.cs", Encoding.UTF8.GetBytes(
                                                                       Gen_OE.Gen(_db, ns)
                                                                       )));
                    if (isSupportDC_Table)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("OE_Table.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_OE_Table.Gen(_db, ns)
                                                                           )));
                    }
                    if (isSupportDC_View)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("OE_View.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_OE_View.Gen(_db, ns)
                                                                           )));
                    }
                    if (isSupportDC_Function)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("OE_Function.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_OE_Function.Gen(_db, ns)
                                                                           )));
                    }

                    fw.WriteLine(Color.OrangeRed, "Done!");
                }

                if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_Extend)
                {
                    fw.Write("Generating");
                    fw.Write(Color.Blue, "Object Business Extension( .net 3.5+ )");
                    fw.WriteLine("...");

                    gr.Files.Add(new KeyValuePair <string, byte[]>("OB_Extend.cs", Encoding.UTF8.GetBytes(
                                                                       Gen_OB_Extend.Gen(_db, ns)
                                                                       )));
                    if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_Table)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("OB_Extend_Table.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_OB_Extend_Table.Gen(_db, ns)
                                                                           )));
                    }
                    if (Utils._CurrrentDALGenSetting_CurrentScheme.IsSupportOB_View)
                    {
                        gr.Files.Add(new KeyValuePair <string, byte[]>("OB_Extend_View.cs", Encoding.UTF8.GetBytes(
                                                                           Gen_OB_Extend_View.Gen(_db, ns)
                                                                           )));
                    }

                    fw.WriteLine(Color.OrangeRed, "Done!");
                }

                fw.Write("Generating");
                fw.Write(Color.Blue, "SQLHelper");
                fw.WriteLine("...");


                gr.Files.Add(new KeyValuePair <string, byte[]>("SQLHelper.cs", Encoding.UTF8.GetBytes(
                                                                   Gen_SQLHelper.Gen(ns)
                                                                   )));

                fw.WriteLine(Color.OrangeRed, "Done!");

                fw.WriteLine();
                fw.WriteLine(Color.Red, "All Done!");
            }

            //gr = new GenResult(GenResultTypes.CodeSegment);
            //gr.CodeSegment = new KeyValuePair<string, string>(this.Tips, t.Name + " gen finished!");
            return(gr);
        }
示例#30
0
        public GenResult Gen(params object[] sqlElements)
        {
            #region Init

            GenResult gr;
            Table     t = (Table)sqlElements[0];

            List <Column> pks = Utils.GetPrimaryKeyColumns(t);

            if (pks.Count == 0)
            {
                gr         = new GenResult(GenResultTypes.Message);
                gr.Message = "无法为没有主键字段的表生成该过程!";
                return(gr);
            }

            StringBuilder sb = new StringBuilder();

            #endregion

            #region Gen

            sb.Append(@"
-- 针对 表 " + t.ToString() + @"
-- 根据新旧主键值删除一行数据(这是为 SqlDataSource 的删除方法准备的)
CREATE PROCEDURE [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Delete_ForSqlDataSource] (");
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
    " + (i > 0 ? ", " : "  ") + Utils.FormatString("@" + cn, Utils.GetParmDeclareStr(c), "= NULL", 40, 40));
            }
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
    , " + Utils.FormatString("@Original_" + cn, Utils.GetParmDeclareStr(c), 30));
            }
            sb.Append(@"
) AS
BEGIN
    SET NOCOUNT ON;
");
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                sb.Append(@"
    IF @" + cn + @" IS NULL
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Delete|Required." + c.Name + @" " + cn + @"不能为空', 11, 1); RETURN -1;
    END;
");
            }
            sb.Append(@"
/*
    --prepare trans & error
    DECLARE @TranStarted bit; SET @TranStarted = 0; IF @@TRANCOUNT = 0 BEGIN BEGIN TRANSACTION; SET @TranStarted = 1 END;
*/


    DELETE
      FROM [" + Utils.GetEscapeSqlObjectName(t.Schema) + @"].[" + Utils.GetEscapeSqlObjectName(t.Name) + @"]");
            string s = "";
            for (int i = 0; i < pks.Count; i++)
            {
                Column c  = pks[i];
                string cn = Utils.GetEscapeName(c);
                if (i > 0)
                {
                    s += " AND ";
                }
                s += @"[" + Utils.GetEscapeSqlObjectName(c.Name) + @"] = @" + cn;
            }
            if (s.Length > 0)
            {
                sb.Append(@"
     WHERE " + s);
            }
            sb.Append(@"
    IF @@ERROR <> 0 OR @@ROWCOUNT = 0
    BEGIN
        RAISERROR ('" + t.Schema + @"." + t.Name + @".Delete|Failed 数据删除失败', 11, 1); RETURN -1;  -- GOTO Cleanup;
    END


/*
    --cleanup trans
    IF @TranStarted = 1 COMMIT TRANSACTION; RETURN 0;
Cleanup:
    IF @TranStarted = 1 ROLLBACK TRANSACTION; RETURN -1;
*/

    RETURN 0;

END


-- 下面这几行用于生成智能感知代码,以及强类型返回值,请注意同步修改(SP名称,备注,返回值类型)

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'针对 表 " + t.ToString() + @"
根据新旧主键值删除一行数据(这是为 SqlDataSource 的删除方法准备的)' , @level0type=N'SCHEMA',@level0name=N'" + t.Schema + @"', @level1type=N'PROCEDURE',@level1name=N'usp_" + Utils.GetEscapeSqlObjectName(t.Name) + @"_Delete_ForSqlDataSource'

");

            #endregion

            #region return

            gr             = new GenResult(GenResultTypes.CodeSegment);
            gr.CodeSegment = new KeyValuePair <string, string>(this._properties[GenProperties.Tips].ToString(), sb.ToString());
            return(gr);

            #endregion
        }
示例#31
0
        private GenResult EmailMessageFromMessage(
            StoredContact sender,
            StoredContact recipient,
            Storage.Message msg)
        {
            GenResult res = new GenResult();
            try
            {
                EmailAddress em =
                    Contact.Bind(this.service, new ItemId(sender.UniqId))
                        .EmailAddresses[EmailAddressKey.EmailAddress1];

                EmailMessage newMsg = new EmailMessage(this.service)
                {
                    From = em,
                    Sender = em,
                    Body = new MessageBody(msg.BodyHtml),
                    Subject = msg.Subject
                };

                newMsg.Save(WellKnownFolderName.Drafts);

                foreach (object obj in msg.Attachments)
                {
                    Storage.Attachment attach = obj as Storage.Attachment;
                    if (attach == null)
                        continue;
                    newMsg.Attachments.AddFileAttachment(attach.FileName, attach.Data);
                }

                this.FillAdresses(ref newMsg, recipient.Email);

                res.msg = newMsg;

                // делаем ли форвард
                if (RndTrueFalse())
                {
                    newMsg.Update(ConflictResolutionMode.AlwaysOverwrite);
                    ResponseMessage respMsg = newMsg.CreateForward();
                    respMsg.BodyPrefix = @"test body prefix for forward message";
                    this.FillAdressesForResponse(ref respMsg, this.RndRecipMail());
                    respMsg.Save(WellKnownFolderName.Drafts);
                    res.response = respMsg;
                }

                // делаем ли реплай
                if (RndTrueFalse())
                {
                    /*newMsg.ReplyTo.Add(_RndRecipMail());
                    if (_RndTrueFalse())
                    {
                        newMsg.ReplyTo.Add(_RndRecipMail());
                    }

                    if (_RndTrueFalse()) */
                    {
                        newMsg.Update(ConflictResolutionMode.AlwaysOverwrite);
                        ResponseMessage replMsg = newMsg.CreateReply(RndTrueFalse());
                        replMsg.BodyPrefix = @"test body prefix for reply message";
                        this.FillAdressesForResponse(ref replMsg, recipient.Email);
                        replMsg.Save(WellKnownFolderName.Drafts);
                        res.reply = replMsg;
                    }
                }
            }
            catch (Exception exc)
            {
                GenericLogger<Generator>.Error(
                    LocalizibleStrings.ErrorCreateFromTemplate + msg.FileName, exc);
            }
            return res;
        }