示例#1
0
        public string BuildPhrase(ConnectorBase conn)
        {
            string ret;
            if (conn.TYPE == ConnectorBase.SqlServiceType.MSSQL)
                ret = @"RAND(CAST(NEWID() AS VARBINARY)) * ";
            else if (conn.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                ret = @"RAND() * ";
            else // if (conn.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                ret = @"RANDOM() * ";

            if (ObjectType == ValueObjectType.ColumnName)
            {
                if (TableName != null && TableName.Length > 0)
                {
                    ret += conn.EncloseFieldName(TableName);
                    ret += ".";
                }
                ret += conn.EncloseFieldName(Object);
            }
            else if (ObjectType == ValueObjectType.Value)
            {
                ret += conn.PrepareValue(Object);
            }
            else ret += Object;

            return ret;
        }
示例#2
0
        private static void GenerateXY(
            ConnectorBase conn, 
            PointWrapper point,
            out string x, out string y)
        {
            if (point.PointColumnName != null)
            {
                string pt;

                if (point.LatitudeTableName != null)
                {
                    pt = conn.WrapFieldName(point.LatitudeTableName) + @"." + conn.WrapFieldName(point.PointColumnName);
                }
                else
                {
                    pt = conn.WrapFieldName(point.PointColumnName);
                }

                if (conn.TYPE == ConnectorBase.SqlServiceType.MSSQL)
                {
                    x = pt + @".STX";
                    y = pt + @".STY";
                }
                else
                {
                    if (conn.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                    {
                        x = @"ST_X(" + pt + @")";
                        y = @"ST_Y(" + pt + @")";
                    }
                    else // MYSQL
                    {
                        x = @"X(" + pt + @")";
                        y = @"Y(" + pt + @")";
                    }
                }
            }
            else
            {
                if (point.LatitudeColumnName != null)
                {
                    x = (point.LatitudeTableName != null ? conn.WrapFieldName(point.LatitudeTableName) + "." : "")
                        + conn.WrapFieldName(point.LatitudeColumnName);
                }
                else
                {
                    x = (point.Latitude ?? 0m).ToString(CultureInfo.InvariantCulture);
                }

                if (point.LongitudeColumnName != null)
                {
                    y = (point.LongitudeTableName != null ? conn.WrapFieldName(point.LongitudeTableName) + "." : "")
                        + conn.WrapFieldName(point.LongitudeColumnName);
                }
                else
                {
                    y = (point.Longitude ?? 0m).ToString(CultureInfo.InvariantCulture);
                }
            }
        }
示例#3
0
文件: Max.cs 项目: ycaihua/dg.Sql
        public string BuildPhrase(ConnectorBase conn)
        {
            string ret;

            ret = @"MAX(";

            if (ObjectType == ValueObjectType.ColumnName)
            {
                if (TableName != null && TableName.Length > 0)
                {
                    ret += conn.EncloseFieldName(TableName);
                    ret += ".";
                }
                ret += conn.EncloseFieldName(Object.ToString());
            }
            else if (ObjectType == ValueObjectType.Value)
            {
                ret += conn.PrepareValue(Object);
            }
            else ret += Object;

            ret += ")";

            return ret;
        }
示例#4
0
        public string BuildPhrase(ConnectorBase conn, Query relatedQuery = null)
        {
            string ret = "";

            ret += Value.Build(conn, relatedQuery);

            return Binary ? conn.func_SHA1_Binary(ret) : conn.func_SHA1_Hex(ret);
        }
示例#5
0
        public string BuildPhrase(ConnectorBase conn, Query relatedQuery = null)
        {
            string ret = "";

            ret += Value.Build(conn, relatedQuery);

            return conn.func_SECOND(ret);
        }
示例#6
0
文件: Replace.cs 项目: ycaihua/dg.Sql
        public string BuildPhrase(ConnectorBase conn)
        {
            string ret = @"REPLACE(";

            if (SourceType == ValueObjectType.ColumnName)
            {
                if (SourceTableName != null && SourceTableName.Length > 0)
                {
                    ret += conn.EncloseFieldName(SourceTableName);
                    ret += ".";
                }
                ret += conn.EncloseFieldName(Source);
            }
            else if (SourceType == ValueObjectType.Value)
            {
                ret += conn.PrepareValue(Source);
            }
            else ret += Source;

            ret += ",";

            if (SearchType == ValueObjectType.ColumnName)
            {
                if (SearchTableName != null && SearchTableName.Length > 0)
                {
                    ret += conn.EncloseFieldName(SearchTableName);
                    ret += ".";
                }
                ret += conn.EncloseFieldName(Search);
            }
            else if (SearchType == ValueObjectType.Value)
            {
                ret += conn.PrepareValue(Search);
            }
            else ret += Search;

            ret += ",";

            if (ReplaceWithType == ValueObjectType.ColumnName)
            {
                if (ReplaceWithTableName != null && ReplaceWithTableName.Length > 0)
                {
                    ret += conn.EncloseFieldName(ReplaceWithTableName);
                    ret += ".";
                }
                ret += conn.EncloseFieldName(ReplaceWith);
            }
            else if (ReplaceWithType == ValueObjectType.Value)
            {
                ret += conn.PrepareValue(ReplaceWith);
            }
            else ret += ReplaceWith;

            ret += ")";

            return ret;
        }
示例#7
0
        public string BuildPhrase(ConnectorBase conn, Query relatedQuery = null)
        {
            if (Values.Count == 0)
            {
                return conn.PrepareValue("");
            }
            else
            {
                bool first = true;

                if (conn.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL && !IgnoreNulls)
                {
                    // PostgreSQL does not ignore NULL values in || operator, like CONCAT in other sql languages

                    string ret = "";

                    foreach (var value in Values)
                    {
                        if (first) first = false;
                        else ret += " || ";

                        ret += value.Build(conn, relatedQuery);
                    }

                    return ret;
                }
                else
                {
                    // PostgreSQL ignores NULL values in CONCAT

                    bool coalesce = IgnoreNulls && conn.TYPE != ConnectorBase.SqlServiceType.POSTGRESQL;
                    
                    string ret = "CONCAT(";

                    foreach (var value in Values)
                    {
                        if (first) first = false;
                        else ret += ",";

                        if (coalesce)
                        {
                            ret += "COALESCE(";
                            ret += value.Build(conn, relatedQuery);
                            ret += ",'')";
                        }
                        else
                        {
                            ret += value.Build(conn, relatedQuery);
                        }
                    }

                    ret += ")";

                    return ret;
                }
            }
        }
示例#8
0
文件: Sum.cs 项目: danielgindi/dg.Sql
        public string BuildPhrase(ConnectorBase conn, Query relatedQuery = null)
        {
            string ret;

            ret = @"SUM(";

            ret += Value.Build(conn, relatedQuery);

            ret += ")";

            return ret;
        }
示例#9
0
 public string BuildPhrase(ConnectorBase conn)
 {
     StringBuilder sb = new StringBuilder();
     bool first = true;
     //sb.Append(@"(");
     foreach (Query qry in Queries)
     {
         if (first) first = false; else sb.Append(@" UNION ALL");
         sb.Append(qry.BuildCommand(conn));
     }
     //sb.Append(@")");
     return sb.ToString();
 }
示例#10
0
        public string BuildPhrase(ConnectorBase conn, Query relatedQuery = null)
        {
            string ret;
            if (conn.TYPE == ConnectorBase.SqlServiceType.MSSQL)
                ret = @"RAND(CAST(NEWID() AS VARBINARY)) * ";
            else if (conn.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                ret = @"RAND() * ";
            else // if (conn.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                ret = @"RANDOM() * ";

            ret += Value.Build(conn, relatedQuery);

            return ret;
        }
示例#11
0
文件: Selects.cs 项目: ycaihua/dg.Sql
 /// <summary>
 /// Select [Table].*
 /// This will only return the fields which belong to the main table in the Query.
 /// Use this if using DISTINCT.
 /// </summary>
 /// <param name="Connection">Optional connection. (Used for escaping the table name).</param>
 /// <returns>Current <typeparamref name="Query"/> object</returns>
 public Query SelectAllTableColumns(ConnectorBase Connection = null)
 {
     if (Connection == null)
     {
         Connection = ConnectorBase.NewInstance();
     }
     if (_Schema != null)
     {
         return Select(Connection.EncloseFieldName(_SchemaName) + @".*", true, true);
     }
     else
     {
         return Select(Connection.EncloseFieldName(this._FromExpressionTableAlias) + @".*", true, true);
     }
 }
示例#12
0
 protected virtual void Dispose(bool disposing)
 {
     if (disposing)
     {
         if (UnderlyingReader != null)
         {
             UnderlyingReader.Dispose();
         }
         if (AttachedConnection != null)
         {
             AttachedConnection.Dispose();
             AttachedConnection = null;
         }
     }
     // Now clean up Native Resources (Pointers)
 }
示例#13
0
        public string BuildPhrase(ConnectorBase conn, Query relatedQuery = null)
        {
            string ret;
            if (conn.TYPE == ConnectorBase.SqlServiceType.MYSQL || conn.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                ret = @"IFNULL(";
            else ret = @"ISNULL(";

            ret += Value1.Build(conn, relatedQuery);

            ret += ", ";

            ret += Value2.Build(conn, relatedQuery);

            ret += ")";

            return ret;
        }
示例#14
0
        public string BuildPhrase(ConnectorBase conn, Query relatedQuery = null)
        {
            string ret;

            ret = @"ROUND(";

            ret += Value.Build(conn, relatedQuery);

            if (DecimalPlaces != 0)
            {
                ret += ',';
                ret += DecimalPlaces;
            }
            ret += ')';

            return ret;
        }
示例#15
0
            public override void BuildValue(StringBuilder sb, ConnectorBase conn)
            {
                if (conn.TYPE == ConnectorBase.SqlServiceType.MSSQL)
                {
                    if (this.IsGeographyType)
                    {
                        sb.Append(@"geography::STGeomFromText('");
                    }
                    else
                    {
                        sb.Append(@"geometry::STGeomFromText('");
                    }
                }
                else if (conn.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                {
                    if (this.IsGeographyType)
                    {
                        sb.Append(@"ST_GeogFromText('");
                    }
                    else
                    {
                        sb.Append(@"ST_GeomFromText('");
                    }
                }
                else
                {
                    sb.Append(@"GeomFromText('");
                }

                sb.Append(@"POINT(");
                sb.Append(X.ToString(formatProvider));
                sb.Append(' ');
                sb.Append(Y.ToString(formatProvider));

                if (SRID != null)
                {
                    sb.Append(@")',");
                    sb.Append(SRID.Value);
                    sb.Append(')');
                }
                else
                {
                    sb.Append(@")')");
                }
            }
示例#16
0
        public string BuildPhrase(ConnectorBase conn, Query relatedQuery = null)
        {
            string ret;

            if (Distinct)
            {
                ret = @"COUNT(DISTINCT ";
            }
            else
            {
                ret = @"COUNT(";
            }

            ret += Value.Build(conn, relatedQuery);

            ret += ")";

            return ret;
        }
示例#17
0
文件: IfNull.cs 项目: ycaihua/dg.Sql
        public string BuildPhrase(ConnectorBase conn)
        {
            string ret;
            if (conn.TYPE == ConnectorBase.SqlServiceType.MYSQL || conn.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                ret = @"IFNULL(";
            else ret = @"ISNULL(";

            if (FirstObjectType == ValueObjectType.ColumnName)
            {
                if (FirstTableName != null && FirstTableName.Length > 0)
                {
                    ret += conn.EncloseFieldName(FirstTableName);
                    ret += ".";
                }
                ret += conn.EncloseFieldName((string)FirstObject);
            }
            else if (FirstObjectType == ValueObjectType.Value)
            {
                ret += conn.PrepareValue(FirstObject);
            }
            else ret += FirstObject;

            ret += ", ";

            if (SecondObjectType == ValueObjectType.ColumnName)
            {
                if (SecondTableName != null && SecondTableName.Length > 0)
                {
                    ret += conn.EncloseFieldName(SecondTableName);
                    ret += ".";
                }
                ret += conn.EncloseFieldName((string)SecondObject);
            }
            else if (SecondObjectType == ValueObjectType.Value)
            {
                ret += conn.PrepareValue(SecondObject);
            }
            else ret += SecondObject;

            ret += ")";

            return ret;
        }
示例#18
0
            public override void BuildValue(StringBuilder sb, ConnectorBase conn)
            {
                if (conn.TYPE == ConnectorBase.SqlServiceType.MSSQL)
                {
                    if (this.IsGeographyType)
                    {
                        sb.Append(@"geography::STGeomFromText('");
                    }
                    else
                    {
                        sb.Append(@"geometry::STGeomFromText('");
                    }
                }
                else if (conn.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                {
                    if (this.IsGeographyType)
                    {
                        sb.Append(@"ST_GeogFromText('");
                    }
                    else
                    {
                        sb.Append(@"ST_GeomFromText('");
                    }
                }
                else
                {
                    sb.Append(@"GeomFromText('");
                }

                BuildValueForCollection(sb, conn);
                
                if (SRID != null)
                {
                    sb.Append(@"',");
                    sb.Append(SRID.Value);
                    sb.Append(')');
                }
                else
                {
                    sb.Append(@"')");
                }
            }
示例#19
0
文件: Add.cs 项目: ycaihua/dg.Sql
        public string BuildPhrase(ConnectorBase conn)
        {
            string ret = @"";

            if (ObjectType1 == ValueObjectType.ColumnName)
            {
                if (TableName1 != null && TableName1.Length > 0)
                {
                    ret += conn.EncloseFieldName(TableName1);
                    ret += ".";
                }
                ret += conn.EncloseFieldName(Object1.ToString());
            }
            else if (ObjectType1 == ValueObjectType.Value)
            {
                ret += @"(" + conn.PrepareValue(Object1) + @")";
            }
            else ret += Object1;

            ret += @"+";

            if (ObjectType2 == ValueObjectType.ColumnName)
            {
                if (TableName2 != null && TableName2.Length > 0)
                {
                    ret += conn.EncloseFieldName(TableName2);
                    ret += ".";
                }
                ret += conn.EncloseFieldName(Object2.ToString());
            }
            else if (ObjectType2 == ValueObjectType.Value)
            {
                ret += @"(" + conn.PrepareValue(Object2) + @")";
            }
            else ret += Object2;

            return ret;
        }
示例#20
0
        public string BuildPhrase(ConnectorBase conn, Query relatedQuery = null)
        {
            string fx, fy, tx, ty;

            GenerateXY(conn, From, out fx, out fy);
            GenerateXY(conn, To, out tx, out ty);
            
            StringBuilder sb = new StringBuilder();
            sb.Append(@"12742.0*ASIN(SQRT(POWER(SIN(((");
            sb.Append(fx);
            sb.Append(@")-(");
            sb.Append(tx);
            sb.Append(@")) * PI()/360.0), 2) + COS(");
            sb.Append(fx);
            sb.Append(@"* PI()/180.0) * COS((");
            sb.Append(tx);
            sb.Append(@") * PI()/180.0) * POWER(SIN((");
            sb.Append(fy);
            sb.Append(@"-");
            sb.Append(ty);
            sb.Append(@") * PI()/360.0), 2)))");

            return sb.ToString();
        }
示例#21
0
        private void BuildSelectForMsAccessLimitOffset(StringBuilder sb, ConnectorBase connection)
        {
            // MSACCESS - LIMIT,OFFSET:
            // SELECT * FROM
            //  (
            //    SELECT TOP [limit] * FROM 
            //     (
            //       SELECT TOP [offset+limit] 
            //       [selects] FROM [tables, joins] 
            //       WHERE [wheres] 
            //       ORDER BY [orders]
            //     ) pp ORDER BY [inverted orders]
            //  ) p ORDER BY [orders]

            sb.AppendFormat(@"SELECT * FROM ( SELECT TOP {0} * FROM ( SELECT TOP {1} ", Limit, Offset + Limit);

            if (IsDistinct) sb.Append(@"DISTINCT ");

            BuildSelectList(sb, connection);

            sb.Append(@" FROM ");
            if (Schema != null)
            {
                if (Schema.DatabaseOwner.Length > 0)
                {
                    sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                    sb.Append('.');
                }
                sb.Append(connection.WrapFieldName(_SchemaName));
            }
            else
            {
                sb.Append(@"(");
                if (_FromExpression is dg.Sql.IPhrase)
                {
                    sb.Append(((dg.Sql.IPhrase)_FromExpression).BuildPhrase(connection, this));
                }
                else sb.Append(_FromExpression);
                sb.Append(@") ");
                sb.Append(connection.WrapFieldName(_FromExpressionTableAlias));
            }

            BuildJoin(sb, connection);

            if (_ListWhere != null && _ListWhere.Count > 0)
            {
                sb.Append(@" WHERE ");
                _ListWhere.BuildCommand(sb, connection, this, null, null);
            }

            StringBuilder sbOrderBy = new StringBuilder();
            StringBuilder sbGroupBy = new StringBuilder();
            BuildGroupBy(sbGroupBy, connection, false);
            BuildOrderBy(sbOrderBy, connection, false);
            sb.Append(sbOrderBy.ToString());
            sb.Append(sbGroupBy.ToString());
            sb.Append(@") pp ");
            BuildGroupBy(sb, connection, true);
            BuildOrderBy(sb, connection, true);
            sb.Append(@") p ");
            sb.Append(sbOrderBy.ToString());
            sb.Append(sbGroupBy.ToString());
        }
示例#22
0
        public string BuildPhrase(ConnectorBase conn, Query relatedQuery = null)
        {
            StringBuilder sb = new StringBuilder();

            if (conn.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
            {
                sb.Append("string_agg(");

                if (Distinct)
                {
                    sb.Append("DISTINCT ");
                }

                sb.Append(Value.Build(conn, relatedQuery));

                if (Separator != null)
                {
                    sb.Append("," + conn.PrepareValue(Separator));
                }
                else
                {
                    sb.Append(",','");
                }

                if (OrderBy != null && OrderBy.Count > 0)
                {
                    OrderBy.BuildCommand(sb, conn, relatedQuery, false);
                }

                sb.Append(")");
            }
            else if (conn.TYPE == ConnectorBase.SqlServiceType.MYSQL)
            {
                sb.Append("GROUP_CONCAT(");

                if (Distinct)
                {
                    sb.Append("DISTINCT ");
                }

                sb.Append(Value.Build(conn, relatedQuery));

                if (OrderBy != null && OrderBy.Count > 0)
                {
                    OrderBy.BuildCommand(sb, conn, relatedQuery, false);
                }

                if (Separator != null)
                {
                    sb.Append(" SEPARATOR " + conn.PrepareValue(Separator));
                }

                sb.Append(")");
            }
            else
            {
                throw new NotSupportedException("SHA1 is not supported by " + conn.TYPE.ToString());
            }

            return sb.ToString();
        }
示例#23
0
        private void BuildJoin(StringBuilder sb, ConnectorBase connection)
        {
            if (_ListJoin != null)
            {
                foreach (Join join in _ListJoin)
                {
                    switch (join.JoinType)
                    {
                        case JoinType.InnerJoin:
                            sb.Append(@" INNER JOIN ");
                            break;
                        case JoinType.LeftJoin:
                            sb.Append(@" LEFT JOIN ");
                            break;
                        case JoinType.RightJoin:
                            sb.Append(@" RIGHT JOIN ");
                            break;
                        case JoinType.LeftOuterJoin:
                            sb.Append(@" LEFT OUTER JOIN ");
                            break;
                        case JoinType.RightOuterJoin:
                            sb.Append(@" RIGHT OUTER JOIN ");
                            break;
                        case JoinType.FullOuterJoin:
                            sb.Append(@" FULL OUTER JOIN ");
                            break;
                    }
                    if (join.RightTableSchema != null)
                    {
                        if (join.RightTableSchema.DatabaseOwner.Length > 0)
                        {
                            sb.Append(connection.WrapFieldName(join.RightTableSchema.DatabaseOwner));
                            sb.Append('.');
                        }
                        sb.Append(connection.WrapFieldName(join.RightTableSchema.Name));
                    }
                    else
                    {
                        sb.Append('(');
                        if (join.RightTableSql is Query)
                        {
                            sb.Append(((Query)join.RightTableSql).BuildCommand(connection));
                        }
                        else
                        {
                            sb.Append(join.RightTableSql.ToString());
                        }
                        sb.Append(')');
                    }

                    sb.Append(' ');

                    if (join.RightTableAlias != null)
                    {
                        sb.Append(join.RightTableAlias);
                    }
                    else
                    {
                        sb.Append(join.RightTableSchema != null ? join.RightTableSchema.Name : @"");
                    }

                    if (join.Pairs.Count > 1)
                    {
                        sb.Append(@" ON ");
                        WhereList wl = new WhereList();
                        foreach (WhereList joins in join.Pairs)
                        {
                            wl.AddRange(joins);
                        }
                        wl.BuildCommand(sb, connection, this, join.RightTableSchema, join.RightTableAlias == null ? join.RightTableSchema.Name : join.RightTableAlias);
                    }
                    else if (join.Pairs.Count == 1)
                    {
                        sb.Append(@" ON ");
                        join.Pairs[0].BuildCommand(sb, connection, this, join.RightTableSchema, join.RightTableAlias == null ? join.RightTableSchema.Name : join.RightTableAlias);
                    }
                }
            }
        }
示例#24
0
        public string BuildCommand(ConnectorBase connection)
        {
            if (this.QueryMode == QueryMode.ExecuteStoredProcedure || this.QueryMode == QueryMode.None) return string.Empty;

            StringBuilder sb = new StringBuilder();

            bool ownsConnection = false;
            if (connection == null)
            {
                ownsConnection = true;
                connection = ConnectorBase.NewInstance();
            }
            try
            {
                bool bFirst;

                if (this.QueryMode != QueryMode.None)
                {
                    switch (this.QueryMode)
                    {
                        case QueryMode.Select:
                            {
                                if (Offset > 0 && 
                                    connection.TYPE == ConnectorBase.SqlServiceType.MSSQL &&
                                    !connection.SupportsSelectPaging())
                                {
                                    // Special case for Sql Server where in versions prior to 2012 there was no paging support
                                    BuildSelectForMsSqlPaging(sb, connection);
                                }
                                else if (Offset > 0 && Limit > 0 &&
                                    connection.TYPE == ConnectorBase.SqlServiceType.MSACCESS)
                                {
                                    // Special case for Ms Access where paging is not supported so we do a complex emulation of LIMIT+OFFSET
                                    BuildSelectForMsAccessLimitOffset(sb, connection);
                                }
                                else if (Offset > 0 &&
                                    connection.TYPE == ConnectorBase.SqlServiceType.MSACCESS)
                                {
                                    // Special case for Ms Access where paging is not supported so we do a complex emulation of OFFSET
                                    BuildSelectForMsAccessOffset(sb, connection);
                                }
                                else
                                {
                                    sb.Append(@" SELECT ");

                                    if (IsDistinct) sb.Append(@"DISTINCT ");

                                    if (Limit > 0 && 
                                        (connection.TYPE == ConnectorBase.SqlServiceType.MSACCESS ||
                                        (connection.TYPE == ConnectorBase.SqlServiceType.MSSQL && !(connection.SupportsSelectPaging() && Offset > 0))
                                        ))
                                    {
                                        sb.Append(@"TOP " + Limit);
                                        sb.Append(' ');
                                    }

                                    BuildSelectList(sb, connection);

                                    sb.Append(@" FROM ");
                                    if (Schema != null)
                                    {
                                        if (Schema.DatabaseOwner.Length > 0)
                                        {
                                            sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                            sb.Append('.');
                                        }
                                        sb.Append(connection.WrapFieldName(_SchemaName));
                                    }
                                    else
                                    {
                                        sb.Append(@"(");
                                        if (_FromExpression is dg.Sql.IPhrase)
                                        {
                                            sb.Append(((dg.Sql.IPhrase)_FromExpression).BuildPhrase(connection, this));
                                        }
                                        else sb.Append(_FromExpression);
                                        sb.Append(@") ");
                                        sb.Append(connection.WrapFieldName(_FromExpressionTableAlias));
                                    }

                                    BuildJoin(sb, connection);

                                    if (_ListWhere != null && _ListWhere.Count > 0)
                                    {
                                        sb.Append(@" WHERE ");
                                        _ListWhere.BuildCommand(sb, connection, this, null, null);
                                    }

                                    BuildGroupBy(sb, connection, false);
                                    BuildHaving(sb, connection);
                                    BuildOrderBy(sb, connection, false);

                                    if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                                    {
                                        if (Limit > 0)
                                        {
                                            sb.Append(@" LIMIT ");
                                            sb.Append(Limit);

                                            // OFFSET is not supported without LIMIT
                                            if (Offset > 0)
                                            {
                                                sb.Append(@" OFFSET ");
                                                sb.Append(Offset);
                                            }
                                        }
                                    }
                                    else if (connection.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                                    {
                                        if (Limit > 0)
                                        {
                                            sb.Append(@" LIMIT ");
                                            sb.Append(Limit);
                                        }
                                        if (Offset > 0)
                                        {
                                            sb.Append(@" OFFSET ");
                                            sb.Append(Offset);
                                        }
                                    }
                                    else if (connection.TYPE == ConnectorBase.SqlServiceType.MSSQL)
                                    {
                                        if (connection.SupportsSelectPaging() && Offset > 0)
                                        {
                                            // If we are in MsSql OFFSET/FETCH mode...

                                            sb.Append(@" OFFSET ");
                                            sb.Append(Offset);
                                            sb.Append(@" ROWS");
                                            if (Limit > 0) 
                                            {
                                                sb.Append(@" FETCH NEXT ");
                                                sb.Append(Limit);
                                                sb.Append(@" ROWS ONLY");
                                            }
                                        }
                                    }

                                    // Done with select query
                                }
                                
                                // Write out supported hints
                                switch (_QueryHint)
                                {
                                    case QueryHint.ForUpdate:
                                        if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL ||
                                            connection.TYPE == ConnectorBase.SqlServiceType.MSSQL ||
                                            connection.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                                        {
                                            sb.Append(@" FOR UPDATE");
                                        }
                                        break;
                                    case QueryHint.LockInSharedMode:
                                        if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                                        {
                                            sb.Append(@" LOCK IN SHARED MODE");
                                        }
                                        else if (connection.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                                        {
                                            sb.Append(@" FOR SHARE");
                                        }
                                        break;
                                }
                            }

                            break;
                        case QueryMode.Insert:
                            {
                                sb.Append(@"INSERT INTO ");

                                if (Schema.DatabaseOwner.Length > 0)
                                {
                                    sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                    sb.Append('.');
                                }
                                sb.Append(connection.WrapFieldName(_SchemaName));

                                sb.Append(@" (");
                                bFirst = true;
                                foreach (AssignmentColumn ins in _ListInsertUpdate)
                                {
                                    if (bFirst) bFirst = false;
                                    else sb.Append(',');
                                    sb.Append(connection.WrapFieldName(ins.ColumnName));
                                }
                                if (InsertExpression != null)
                                {
                                    sb.Append(@") ");
                                    sb.Append(InsertExpression);
                                }
                                else
                                {
                                    sb.Append(@") VALUES (");
                                    bFirst = true;
                                    foreach (AssignmentColumn ins in _ListInsertUpdate)
                                    {
                                        if (bFirst) bFirst = false;
                                        else sb.Append(',');
                                        if (ins.SecondType == ValueObjectType.Literal)
                                        {
                                            sb.Append(ins.Second);
                                        }
                                        else if (ins.SecondType == ValueObjectType.Value)
                                        {
                                            if (ins.Second is Query)
                                            {
                                                sb.Append('(');
                                                sb.Append(((Query)ins.Second).BuildCommand(connection));
                                                sb.Append(')');
                                            }
                                            else
                                            {
                                                Query.PrepareColumnValue(Schema.Columns.Find(ins.ColumnName), ins.Second, sb, connection, this);
                                            }
                                        }
                                        else if (ins.SecondType == ValueObjectType.ColumnName)
                                        {
                                            if (ins.SecondTableName != null)
                                            {
                                                sb.Append(connection.WrapFieldName(ins.SecondTableName));
                                                sb.Append(@".");
                                            }
                                            sb.Append(connection.WrapFieldName(ins.Second.ToString()));
                                        }
                                    }
                                    sb.Append(@")");

                                    if (_ListWhere != null && _ListWhere.Count > 0)
                                    {
                                        sb.Append(@" WHERE ");
                                        _ListWhere.BuildCommand(sb, connection, this, null, null);
                                    }
                                }
                            }

                            break;
                        case QueryMode.Update:
                            {
                                bool hasJoins = _ListJoin != null && _ListJoin.Count > 0;

                                sb.Append(@"UPDATE ");

                                if (hasJoins && 
                                    (connection.TYPE == ConnectorBase.SqlServiceType.MSSQL || 
                                    connection.TYPE == ConnectorBase.SqlServiceType.MSACCESS) &&
                                    _FromExpressionTableAlias != null && _FromExpressionTableAlias.Length > 0)
                                {
                                    sb.Append(connection.WrapFieldName(_FromExpressionTableAlias));
                                }
                                else
                                {
                                    if (Schema.DatabaseOwner.Length > 0)
                                    {
                                        sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                        sb.Append('.');
                                    }
                                    sb.Append(connection.WrapFieldName(_SchemaName));

                                    if (_FromExpressionTableAlias != null && _FromExpressionTableAlias.Length > 0)
                                    {
                                        sb.Append(' ');
                                        sb.Append(connection.WrapFieldName(_FromExpressionTableAlias));
                                    }
                                }

                                if (hasJoins)
                                {
                                    if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                                    {
                                        BuildJoin(sb, connection);
                                    }
                                }

                                bFirst = true;
                                foreach (AssignmentColumn upd in _ListInsertUpdate)
                                {
                                    if (bFirst)
                                    {
                                        sb.Append(@" SET ");
                                        bFirst = false;
                                    }
                                    else sb.Append(',');
                                    sb.Append(connection.WrapFieldName(upd.ColumnName));
                                    sb.Append('=');

                                    if (upd.SecondType == ValueObjectType.Literal)
                                    {
                                        sb.Append(upd.Second);
                                    }
                                    else if (upd.SecondType == ValueObjectType.Value)
                                    {
                                        Query.PrepareColumnValue(Schema.Columns.Find(upd.ColumnName), upd.Second, sb, connection, this);
                                    }
                                    else if (upd.SecondType == ValueObjectType.ColumnName)
                                    {
                                        if (upd.SecondTableName != null)
                                        {
                                            sb.Append(connection.WrapFieldName(upd.SecondTableName));
                                            sb.Append(@".");
                                        }
                                        sb.Append(connection.WrapFieldName(upd.Second.ToString()));
                                    }
                                }

                                if (hasJoins)
                                {
                                    if (connection.TYPE == ConnectorBase.SqlServiceType.MSSQL || 
                                        connection.TYPE == ConnectorBase.SqlServiceType.MSACCESS)
                                    {
                                        sb.Append(@" FROM ");
                                        if (Schema.DatabaseOwner.Length > 0)
                                        {
                                            sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                            sb.Append('.');
                                        }
                                        sb.Append(connection.WrapFieldName(_SchemaName));

                                        if (_FromExpressionTableAlias != null && _FromExpressionTableAlias.Length > 0)
                                        {
                                            sb.Append(' ');
                                            sb.Append(connection.WrapFieldName(_FromExpressionTableAlias));
                                        }

                                        BuildJoin(sb, connection);
                                    }
                                }

                                if (_ListWhere != null && _ListWhere.Count > 0)
                                {
                                    sb.Append(@" WHERE ");
                                    _ListWhere.BuildCommand(sb, connection, this, null, null);
                                }

                                BuildOrderBy(sb, connection, false);
                            }

                            break;
                        case QueryMode.InsertOrUpdate:
                            {
                                if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                                {
                                    sb.Append(@"REPLACE INTO ");

                                    if (Schema.DatabaseOwner.Length > 0)
                                    {
                                        sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                        sb.Append('.');
                                    }
                                    sb.Append(connection.WrapFieldName(_SchemaName));

                                    sb.Append(@" (");
                                    bFirst = true;
                                    foreach (AssignmentColumn ins in _ListInsertUpdate)
                                    {
                                        if (bFirst) bFirst = false;
                                        else sb.Append(',');
                                        sb.Append(connection.WrapFieldName(ins.ColumnName));
                                    }
                                    if (InsertExpression != null)
                                    {
                                        sb.Append(@") ");
                                        sb.Append(InsertExpression);
                                    }
                                    else
                                    {
                                        sb.Append(@") VALUES (");
                                        bFirst = true;
                                        foreach (AssignmentColumn ins in _ListInsertUpdate)
                                        {
                                            if (bFirst) bFirst = false;
                                            else sb.Append(',');
                                            if (ins.SecondType == ValueObjectType.Literal)
                                            {
                                                sb.Append(ins.Second);
                                            }
                                            else if (ins.SecondType == ValueObjectType.Value)
                                            {
                                                if (ins.Second is Query)
                                                {
                                                    sb.Append('(');
                                                    sb.Append(((Query)ins.Second).BuildCommand(connection));
                                                    sb.Append(')');
                                                }
                                                else
                                                {
                                                    Query.PrepareColumnValue(Schema.Columns.Find(ins.ColumnName), ins.Second, sb, connection, this);
                                                }
                                            }
                                            else if (ins.SecondType == ValueObjectType.ColumnName)
                                            {
                                                if (ins.SecondTableName != null)
                                                {
                                                    sb.Append(connection.WrapFieldName(ins.SecondTableName));
                                                    sb.Append(@".");
                                                }
                                                sb.Append(connection.WrapFieldName(ins.Second.ToString()));
                                            }
                                        }
                                        sb.Append(@")");

                                        if (_ListWhere != null && _ListWhere.Count > 0)
                                        {
                                            sb.Append(@" WHERE ");
                                            _ListWhere.BuildCommand(sb, connection, this, null, null);
                                        }
                                    }
                                }
                                else
                                {
                                    _NeedTransaction = true;

                                    if (connection.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                                    {
                                        throw new NotImplementedException(@"This operation is not implemented for PostgreSQL due to database limitations.");
                                    }

                                    // MSSQL
                                    QueryMode qm = this.QueryMode;
                                    this.QueryMode = QueryMode.Update;

                                    sb.Append(BuildCommand(connection));

                                    sb.Append(@"; IF @@rowcount = 0 BEGIN ");

                                    this.QueryMode = QueryMode.Insert;

                                    sb.Append(BuildCommand(connection));

                                    sb.Append(@"; END");

                                    this.QueryMode = qm;
                                }
                            }
                            break;
                        case QueryMode.Delete:
                            {
                                sb.Append(@"DELETE");
                                if (_ListJoin != null && _ListJoin.Count > 0)
                                {
                                    if (Schema.DatabaseOwner.Length > 0)
                                    {
                                        sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                        sb.Append('.');
                                    }
                                    sb.Append(connection.WrapFieldName(_SchemaName));
                                }
                                sb.Append(@" FROM ");

                                if (Schema.DatabaseOwner.Length > 0)
                                {
                                    sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                    sb.Append('.');
                                }
                                sb.Append(connection.WrapFieldName(_SchemaName));

                                BuildJoin(sb, connection);
                                if (_ListWhere != null && _ListWhere.Count > 0)
                                {
                                    sb.Append(@" WHERE ");
                                    _ListWhere.BuildCommand(sb, connection, this, null, null);
                                }
                                BuildOrderBy(sb, connection, false);
                            }

                            break;
                        case QueryMode.CreateTable:
                            {
                                sb.Append(@"CREATE TABLE ");

                                if (Schema.DatabaseOwner.Length > 0)
                                {
                                    sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                    sb.Append('.');
                                }
                                sb.Append(connection.WrapFieldName(_SchemaName));

                                sb.Append('(');
                                int iPrimaryKeys = 0;
                                bool bSep = false;
                                foreach (TableSchema.Column col in Schema.Columns)
                                {
                                    if (col.IsPrimaryKey) iPrimaryKeys++;
                                    if (bSep) sb.Append(@", "); else bSep = true;
                                    BuildColumnProperties(sb, connection, col, false);
                                }
                                if (iPrimaryKeys > 0)
                                {
                                    if (bSep) sb.Append(@", ");

                                    sb.AppendFormat(@"CONSTRAINT {0} PRIMARY KEY(", connection.WrapFieldName(@"PK_" + _SchemaName));
                                    bSep = false;
                                    foreach (TableSchema.Column col in Schema.Columns)
                                    {
                                        if (!col.IsPrimaryKey) continue;
                                        if (bSep) sb.Append(@", "); else bSep = true;
                                        if (col.IsPrimaryKey) sb.Append(connection.WrapFieldName(col.Name));
                                    }
                                    bSep = true;
                                    sb.Append(')');
                                }

                                sb.Append(')');

                                if (Schema.TableOptions != null && Schema.TableOptions.Count > 0)
                                {
                                    foreach (KeyValuePair<string, string> option in Schema.TableOptions)
                                    {
                                        sb.Append(' ');
                                        sb.Append(option.Key);
                                        sb.Append('=');
                                        sb.Append(option.Value);
                                    }
                                }
                            }
                            break;
                        case QueryMode.CreateIndex:
                            BuildCreateIndex(sb, connection, _CreateIndexObject);
                            break;
                        case QueryMode.CreateIndexes:
                            {
                                if ((Schema.Indexes.Count + Schema.ForeignKeys.Count) > 1)
                                {
                                    _NeedTransaction = true;
                                }
                                foreach (TableSchema.Index index in Schema.Indexes)
                                {
                                    BuildCreateIndex(sb, connection, index);
                                    sb.Append(@";");
                                }
                                foreach (TableSchema.ForeignKey foreignKey in Schema.ForeignKeys)
                                {
                                    BuildCreateIndex(sb, connection, foreignKey);
                                    sb.Append(@";");
                                }
                            }
                            break;
                        case QueryMode.AddColumn:
                            {
                                sb.Append(@"ALTER TABLE ");

                                if (Schema.DatabaseOwner.Length > 0)
                                {
                                    sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                    sb.Append('.');
                                }
                                sb.Append(connection.WrapFieldName(_SchemaName));

                                sb.Append(@" ADD ");

                                if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL || connection.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                                {
                                    sb.Append(@"COLUMN ");
                                }
                                BuildColumnProperties(sb, connection, _AlterColumn, false);
                                if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                                {
                                    int idx = Schema.Columns.IndexOf(_AlterColumn);
                                    if (idx == 0) sb.Append(@"FIRST ");
                                    else sb.AppendFormat(@"AFTER {0} ", connection.WrapFieldName(Schema.Columns[idx - 1].Name));
                                }
                            }
                            break;
                        case QueryMode.ChangeColumn:
                            {
                                if (_AlterColumnOldName != null && _AlterColumnOldName.Length == 0) _AlterColumnOldName = null;
                                if (_AlterColumnOldName != null)
                                {
                                    if (connection.TYPE == ConnectorBase.SqlServiceType.MSSQL)
                                    {
                                        sb.Append(@"EXEC sp_rename ");
                                        if (Schema.DatabaseOwner.Length > 0)
                                        {
                                            sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                            sb.Append('.');
                                        }
                                        sb.Append(connection.WrapFieldName(_SchemaName));
                                        sb.Append('.');
                                        sb.Append(connection.WrapFieldName(_AlterColumnOldName));
                                        sb.Append(',');
                                        sb.Append(connection.WrapFieldName(_AlterColumn.Name));
                                        sb.Append(@",'COLUMN';");
                                    }
                                    else if (connection.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                                    {
                                        sb.Append(@"ALTER TABLE ");
                                        if (Schema.DatabaseOwner.Length > 0)
                                        {
                                            sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                            sb.Append('.');
                                        }
                                        sb.Append(connection.WrapFieldName(_SchemaName));
                                        sb.Append(@" RENAME COLUMN ");
                                        sb.Append(connection.WrapFieldName(_AlterColumnOldName));
                                        sb.Append(@" TO ");
                                        sb.Append(connection.WrapFieldName(_AlterColumn.Name));
                                        sb.Append(';');
                                    }
                                }
                                if (connection.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                                {
                                    // Very limited syntax, will have to do this with several statements

                                    sb.Append(@"ALTER TABLE ");
                                    if (Schema.DatabaseOwner.Length > 0)
                                    {
                                        sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                        sb.Append('.');
                                    }
                                    sb.Append(connection.WrapFieldName(_SchemaName));

                                    string alterColumnStatement = @" ALTER COLUMN ";
                                    alterColumnStatement += connection.WrapFieldName(_AlterColumn.Name);

                                    sb.Append(alterColumnStatement);
                                    sb.Append(@" TYPE ");
                                    bool isTextField; // UNUSED HERE
                                    BuildColumnPropertiesDataType(sb, connection, _AlterColumn, out isTextField);
                                    sb.Append(',');

                                    sb.Append(alterColumnStatement);
                                    sb.Append(_AlterColumn.Nullable ? @" DROP NOT NULL;" : @" SET NOT NULL;");

                                    sb.Append(alterColumnStatement);
                                    sb.Append(@" SET DEFAULT ");
                                    Query.PrepareColumnValue(_AlterColumn, _AlterColumn.Default, sb, connection, this);
                                    sb.Append(';');
                                }
                                else
                                {
                                    sb.Append(@"ALTER TABLE ");
                                    if (Schema.DatabaseOwner.Length > 0)
                                    {
                                        sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                        sb.Append('.');
                                    }
                                    sb.Append(connection.WrapFieldName(_SchemaName));
                                    sb.Append(' ');
                                    if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                                    {
                                        sb.AppendFormat(@"CHANGE {0} ", connection.WrapFieldName(_AlterColumnOldName != null ? _AlterColumnOldName : _AlterColumn.Name));
                                    }
                                    else
                                    {
                                        sb.Append(@"ALTER COLUMN ");
                                    }
                                    BuildColumnProperties(sb, connection, _AlterColumn, connection.TYPE == ConnectorBase.SqlServiceType.MSSQL);
                                    if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                                    {
                                        int idx = Schema.Columns.IndexOf(_AlterColumn);
                                        if (idx == 0) sb.Append(@"FIRST ");
                                        else sb.AppendFormat(@"AFTER {0} ", connection.WrapFieldName(Schema.Columns[idx - 1].Name));
                                    }
                                }
                            }
                            break;
                        case QueryMode.DropColumn:
                            {
                                sb.Append(@"ALTER TABLE ");
                                if (Schema.DatabaseOwner.Length > 0)
                                {
                                    sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                    sb.Append('.');
                                }
                                sb.Append(connection.WrapFieldName(_SchemaName));
                                sb.Append(@" DROP COLUMN ");
                                sb.Append(connection.WrapFieldName(_DropColumnName));
                            }
                            break;
                        case QueryMode.DropForeignKey:
                            {
                                if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                                {
                                    sb.Append(@"ALTER TABLE ");
                                    if (Schema.DatabaseOwner.Length > 0)
                                    {
                                        sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                        sb.Append('.');
                                    }
                                    sb.Append(connection.WrapFieldName(_SchemaName));
                                    sb.Append(@" DROP FOREIGN KEY ");
                                    sb.Append(connection.WrapFieldName(_DropColumnName));
                                }
                                else if (connection.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                                {
                                    sb.Append(@"ALTER TABLE ");
                                    if (Schema.DatabaseOwner.Length > 0)
                                    {
                                        sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                        sb.Append('.');
                                    }
                                    sb.Append(connection.WrapFieldName(_SchemaName));
                                    sb.Append(@" DROP CONSTRAINT ");
                                    sb.Append(connection.WrapFieldName(_DropColumnName));
                                }
                                else
                                {
                                    sb.Append(@"ALTER TABLE ");
                                    if (Schema.DatabaseOwner.Length > 0)
                                    {
                                        sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                        sb.Append('.');
                                    }
                                    sb.Append(connection.WrapFieldName(_SchemaName));
                                    sb.Append(@" DROP CONSTRAINT ");
                                    sb.Append(connection.WrapFieldName(_DropColumnName));
                                }
                            }
                            break;
                        case QueryMode.DropIndex:
                            {
                                if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL || connection.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                                {
                                    sb.Append(@"ALTER TABLE ");
                                    if (Schema.DatabaseOwner.Length > 0)
                                    {
                                        sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                        sb.Append('.');
                                    }
                                    sb.Append(connection.WrapFieldName(_SchemaName));
                                    sb.Append(@" DROP INDEX ");
                                    sb.Append(connection.WrapFieldName(_DropColumnName));
                                }
                                else
                                {
                                    sb.Append(@"ALTER TABLE ");
                                    if (Schema.DatabaseOwner.Length > 0)
                                    {
                                        sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                        sb.Append('.');
                                    }
                                    sb.Append(connection.WrapFieldName(_SchemaName));
                                    sb.Append(@" DROP CONSTRAINT ");
                                    sb.Append(connection.WrapFieldName(_DropColumnName));
                                }
                            }
                            break;
                        case QueryMode.DropTable:
                            {
                                sb.Append(@"DROP TABLE ");
                                if (Schema.DatabaseOwner.Length > 0)
                                {
                                    sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                                    sb.Append('.');
                                }
                                sb.Append(connection.WrapFieldName(_SchemaName));
                            }
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (ownsConnection && connection != null)
                {
                    connection.Close();
                    connection.Dispose();
                    connection = null;
                }
            }

            return sb.ToString();
        }
示例#25
0
 public DbCommand BuildDbCommand(ConnectorBase connection)
 {
     if (this.QueryMode == QueryMode.ExecuteStoredProcedure)
     {
         using (DbCommand cmd = FactoryBase.Factory().NewCommand(_StoredProcedureName))
         {
             cmd.CommandType = CommandType.StoredProcedure;
             if (_StoredProcedureParameters != null)
             {
                 foreach (DbParameter param in _StoredProcedureParameters)
                 {
                     cmd.Parameters.Add(param);
                 }
             }
             if (connection != null)
             {
                 cmd.Connection = connection.Connection;
                 cmd.Transaction = connection.Transaction;
             }
             return cmd;
         }
     }
     else
     {
         DbCommand cmd = FactoryBase.Factory().NewCommand(BuildCommand(connection));
         if (connection != null)
         {
             cmd.Connection = connection.Connection;
             cmd.Transaction = connection.Transaction;
         }
         return cmd;
     }
 }
示例#26
0
        public void BuildColumnPropertiesDataType(StringBuilder sb, ConnectorBase connection, TableSchema.Column column, out bool isTextField)
        {
            if (column.LiteralType != null && column.LiteralType.Length > 0)
            {
                isTextField = column.ActualDataType == DataType.VarChar ||
                    column.ActualDataType == DataType.Char ||
                    column.ActualDataType == DataType.Text ||
                    column.ActualDataType == DataType.MediumText ||
                    column.ActualDataType == DataType.LongText ||
                    column.Type == typeof(string);

                sb.Append(column.LiteralType);
                return;
            }

            isTextField = false;
            DataType dataType = column.ActualDataType;
            if (!column.AutoIncrement || (connection.TYPE != ConnectorBase.SqlServiceType.MSACCESS && connection.TYPE != ConnectorBase.SqlServiceType.POSTGRESQL))
            {
                if (dataType == DataType.VarChar)
                {
                    if (column.MaxLength < 0)
                    {
                        if (connection.varchar_MAX != null)
                        {
                            sb.Append(connection.type_VARCHAR);
                            sb.AppendFormat(@"({0})", connection.varchar_MAX);
                        }
                        else
                        {
                            sb.Append(connection.type_VARCHAR);
                            sb.AppendFormat(@"({0})", connection.varchar_MAX_VALUE);
                        }
                    }
                    else if (column.MaxLength == 0)
                    {
                        sb.Append(connection.type_TEXT);
                        isTextField = true;
                    }
                    else if (column.MaxLength <= connection.varchar_MAX_VALUE)
                    {
                        sb.Append(connection.type_VARCHAR);
                        sb.AppendFormat(@"({0})", column.MaxLength);
                    }
                    else if (column.MaxLength < 65536)
                    {
                        sb.Append(connection.type_TEXT);
                        isTextField = true;
                    }
                    else if (column.MaxLength < 16777215)
                    {
                        sb.Append(connection.type_MEDIUMTEXT);
                        isTextField = true;
                    }
                    else
                    {
                        sb.Append(connection.type_LONGTEXT);
                        isTextField = true;
                    }
                }

                if (dataType == DataType.Char)
                {
                    if (column.MaxLength < 0)
                    {
                        if (connection.varchar_MAX != null)
                        {
                            sb.Append(connection.type_CHAR);
                            sb.AppendFormat(@"({0})", connection.varchar_MAX);
                        }
                        else
                        {
                            sb.Append(connection.type_CHAR);
                            sb.AppendFormat(@"({0})", connection.varchar_MAX_VALUE);
                        }
                    }
                    else if (column.MaxLength == 0 || column.MaxLength >= connection.varchar_MAX_VALUE)
                    {
                        sb.Append(connection.type_CHAR);
                        sb.AppendFormat(@"({0})", connection.varchar_MAX_VALUE);
                    }
                    else
                    {
                        sb.Append(connection.type_CHAR);
                        sb.AppendFormat(@"({0})", column.MaxLength);
                    }
                }
                else if (dataType == DataType.Text)
                {
                    sb.Append(connection.type_TEXT);
                    isTextField = true;
                }
                else if (dataType == DataType.MediumText)
                {
                    sb.Append(connection.type_MEDIUMTEXT);
                    isTextField = true;
                }
                else if (dataType == DataType.LongText)
                {
                    sb.Append(connection.type_LONGTEXT);
                    isTextField = true;
                }
                else if (dataType == DataType.Boolean)
                {
                    sb.Append(connection.type_BOOLEAN);
                }
                else if (dataType == DataType.DateTime)
                {
                    sb.Append(connection.type_DATETIME);
                }
                else if (dataType == DataType.Numeric)
                {
                    if (column.NumberPrecision > 0)
                    {
                        sb.Append(connection.type_NUMERIC);
                        sb.AppendFormat(@"({0}, {1})", column.NumberPrecision, column.NumberScale);
                    }
                    else
                    {
                        sb.Append(connection.type_NUMERIC);
                    }
                }
                else if (dataType == DataType.Float)
                {
                    if (column.NumberPrecision > 0 && connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                    {
                        sb.Append(connection.type_FLOAT);
                        sb.AppendFormat(@"({0}, {1})", column.NumberPrecision, column.NumberScale);
                    }
                    else
                    {
                        sb.Append(connection.type_FLOAT);
                    }
                }
                else if (dataType == DataType.Double)
                {
                    if (column.NumberPrecision > 0 && connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                    {
                        sb.Append(connection.type_DOUBLE);
                        sb.AppendFormat(@"({0}, {1})", column.NumberPrecision, column.NumberScale);
                    }
                    else
                    {
                        sb.Append(connection.type_DOUBLE);
                    }
                }
                else if (dataType == DataType.Decimal)
                {
                    if (column.NumberPrecision > 0)
                    {
                        sb.Append(connection.type_DECIMAL);
                        sb.AppendFormat(@"({0}, {1})", column.NumberPrecision, column.NumberScale);
                    }
                    else
                    {
                        sb.Append(connection.type_DECIMAL);
                    }
                }
                else if (dataType == DataType.Money)
                {
                    if (column.NumberPrecision > 0)
                    {
                        sb.Append(connection.type_MONEY);
                        if (connection.TYPE != ConnectorBase.SqlServiceType.MSSQL)
                        {
                            sb.AppendFormat(@"({0}, {1})", column.NumberPrecision, column.NumberScale);
                        }
                    }
                    else
                    {
                        sb.Append(connection.type_MONEY);
                    }
                }
                else if (dataType == DataType.TinyInt)
                {
                    sb.Append(connection.type_TINYINT);
                }
                else if (dataType == DataType.UnsignedTinyInt)
                {
                    sb.Append(connection.type_UNSIGNEDTINYINT);
                }
                else if (dataType == DataType.SmallInt)
                {
                    sb.Append(connection.type_SMALLINT);
                }
                else if (dataType == DataType.UnsignedSmallInt)
                {
                    sb.Append(connection.type_UNSIGNEDSMALLINT);
                }
                else if (dataType == DataType.Int)
                {
                    sb.Append(connection.type_INT);
                }
                else if (dataType == DataType.UnsignedInt)
                {
                    sb.Append(connection.type_UNSIGNEDINT);
                }
                else if (dataType == DataType.BigInt)
                {
                    sb.Append(connection.type_BIGINT);
                }
                else if (dataType == DataType.UnsignedBigInt)
                {
                    sb.Append(connection.type_UNSIGNEDBIGINT);
                }
                else if (dataType == DataType.Json)
                {
                    sb.Append(connection.type_JSON);
                }
                else if (dataType == DataType.JsonBinary)
                {
                    sb.Append(connection.type_JSON_BINARY);
                }
                else if (dataType == DataType.Blob)
                {
                    sb.Append(connection.type_BLOB);
                }
                else if (dataType == DataType.Guid)
                {
                    sb.Append(connection.type_GUID);
                }
                else if (dataType == DataType.Geometry)
                {
                    sb.Append(connection.type_GEOMETRY);
                }
                else if (dataType == DataType.GeometryCollection)
                {
                    sb.Append(connection.type_GEOMETRYCOLLECTION);
                }
                else if (dataType == DataType.Point)
                {
                    sb.Append(connection.type_POINT);
                }
                else if (dataType == DataType.LineString)
                {
                    sb.Append(connection.type_LINESTRING);
                }
                else if (dataType == DataType.Polygon)
                {
                    sb.Append(connection.type_POLYGON);
                }
                else if (dataType == DataType.Line)
                {
                    sb.Append(connection.type_LINE);
                }
                else if (dataType == DataType.Curve)
                {
                    sb.Append(connection.type_CURVE);
                }
                else if (dataType == DataType.Surface)
                {
                    sb.Append(connection.type_SURFACE);
                }
                else if (dataType == DataType.LinearRing)
                {
                    sb.Append(connection.type_LINEARRING);
                }
                else if (dataType == DataType.MultiPoint)
                {
                    sb.Append(connection.type_MULTIPOINT);
                }
                else if (dataType == DataType.MultiLineString)
                {
                    sb.Append(connection.type_MULTILINESTRING);
                }
                else if (dataType == DataType.MultiPolygon)
                {
                    sb.Append(connection.type_MULTIPOLYGON);
                }
                else if (dataType == DataType.MultiCurve)
                {
                    sb.Append(connection.type_MULTICURVE);
                }
                else if (dataType == DataType.MultiSurface)
                {
                    sb.Append(connection.type_MULTISURFACE);
                }
                else if (dataType == DataType.Geographic)
                {
                    sb.Append(connection.type_GEOGRAPHIC);
                }
                else if (dataType == DataType.GeographicCollection)
                {
                    sb.Append(connection.type_GEOGRAPHICCOLLECTION);
                }
                else if (dataType == DataType.GeographicPoint)
                {
                    sb.Append(connection.type_GEOGRAPHIC_POINT);
                }
                else if (dataType == DataType.GeographicLineString)
                {
                    sb.Append(connection.type_GEOGRAPHIC_LINESTRING);
                }
                else if (dataType == DataType.GeographicPolygon)
                {
                    sb.Append(connection.type_GEOGRAPHIC_POLYGON);
                }
                else if (dataType == DataType.GeographicLine)
                {
                    sb.Append(connection.type_GEOGRAPHIC_LINE);
                }
                else if (dataType == DataType.GeographicCurve)
                {
                    sb.Append(connection.type_GEOGRAPHIC_CURVE);
                }
                else if (dataType == DataType.GeographicSurface)
                {
                    sb.Append(connection.type_GEOGRAPHIC_SURFACE);
                }
                else if (dataType == DataType.GeographicLinearRing)
                {
                    sb.Append(connection.type_GEOGRAPHIC_LINEARRING);
                }
                else if (dataType == DataType.GeographicMultiPoint)
                {
                    sb.Append(connection.type_GEOGRAPHIC_MULTIPOINT);
                }
                else if (dataType == DataType.GeographicMultiLineString)
                {
                    sb.Append(connection.type_GEOGRAPHIC_MULTILINESTRING);
                }
                else if (dataType == DataType.GeographicMultiPolygon)
                {
                    sb.Append(connection.type_GEOGRAPHIC_MULTIPOLYGON);
                }
                else if (dataType == DataType.GeographicMultiCurve)
                {
                    sb.Append(connection.type_GEOGRAPHIC_MULTICURVE);
                }
                else if (dataType == DataType.GeographicMultiSurface)
                {
                    sb.Append(connection.type_GEOGRAPHIC_MULTISURFACE);
                }
                sb.Append(' ');
            }

            if (column.AutoIncrement)
            {
                if (dataType == DataType.BigInt || dataType == DataType.UnsignedBigInt)
                { // Specifically for PostgreSQL
                    sb.Append(connection.type_AUTOINCREMENT_BIGINT);
                }
                else
                {
                    sb.Append(connection.type_AUTOINCREMENT);
                }
                sb.Append(' ');
            }

            if (connection.TYPE != ConnectorBase.SqlServiceType.POSTGRESQL && !string.IsNullOrEmpty(column.Charset))
            {
                sb.Append(@"COLLATE ");
                sb.Append(column.Collate);
                sb.Append(' ');
            }

            if (!string.IsNullOrEmpty(column.Charset))
            {
                sb.Append(@"CHARACTER SET ");
                sb.Append(column.Charset);
                sb.Append(' ');
            }
        }
示例#27
0
        public void BuildColumnProperties(StringBuilder sb, ConnectorBase connection, TableSchema.Column column, bool NoDefault)
        {
            sb.Append(connection.WrapFieldName(column.Name));
            sb.Append(' ');

            bool isTextField;
            BuildColumnPropertiesDataType(sb, connection, column, out isTextField);

            if (!column.Nullable)
            {
                sb.Append(@"NOT NULL ");
            }
            if (!NoDefault && column.Default != null && (!(isTextField && connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)))
            {
                sb.Append(@"DEFAULT ");
                Query.PrepareColumnValue(column, column.Default, sb, connection, this);
                sb.Append(' ');
            }
        }
示例#28
0
        private void BuildCreateIndex(StringBuilder sb, ConnectorBase connection, object indexObj)
        {
            if (indexObj is TableSchema.Index)
            {
                TableSchema.Index index = indexObj as TableSchema.Index;
                if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                {
                    sb.Append(@"ALTER TABLE ");

                    if (Schema.DatabaseOwner.Length > 0)
                    {
                        sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                        sb.Append('.');
                    }
                    sb.Append(connection.WrapFieldName(_SchemaName));

                    sb.Append(@" ADD ");

                    if (index.Mode == dg.Sql.TableSchema.IndexMode.PrimaryKey)
                    {
                        sb.AppendFormat(@"CONSTRAINT {0} PRIMARY KEY ", connection.WrapFieldName(index.Name));
                    }
                    else
                    {
                        switch (index.Mode)
                        {
                            case TableSchema.IndexMode.Unique:
                                sb.Append(@"UNIQUE ");
                                break;
                            case TableSchema.IndexMode.FullText:
                                sb.Append(@"FULLTEXT ");
                                break;
                            case TableSchema.IndexMode.Spatial:
                                sb.Append(@"SPATIAL ");
                                break;
                        }
                        sb.Append(@"INDEX ");
                        sb.Append(connection.WrapFieldName(index.Name));
                        sb.Append(@" ");
                    }
                    if (index.Mode != TableSchema.IndexMode.Spatial)
                    {
                        switch (index.Type)
                        {
                            case TableSchema.IndexType.BTREE:
                                sb.Append(@"USING BTREE ");
                                break;
                            case TableSchema.IndexType.RTREE:
                                sb.Append(@"USING RTREE ");
                                break;
                            case TableSchema.IndexType.HASH:
                                sb.Append(@"USING HASH ");
                                break;
                        }
                    }
                    sb.Append(@"(");
                    for (int i = 0; i < index.ColumnNames.Length; i++)
                    {
                        if (i > 0) sb.Append(",");
                        sb.Append(connection.WrapFieldName(index.ColumnNames[i]));
                        if (index.ColumnLength[i] > 0) sb.AppendFormat("({0})", index.ColumnLength[i]);
                        sb.Append(index.ColumnSort[i] == SortDirection.ASC ? @" ASC" : @" DESC");
                    }
                    sb.Append(@")");
                }
                else if (connection.TYPE == ConnectorBase.SqlServiceType.POSTGRESQL)
                {
                    if (index.Mode == dg.Sql.TableSchema.IndexMode.PrimaryKey)
                    {
                        sb.Append(@"ALTER TABLE ");

                        if (Schema.DatabaseOwner.Length > 0)
                        {
                            sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                            sb.Append('.');
                        }
                        sb.Append(connection.WrapFieldName(_SchemaName));

                        sb.Append(@" ADD CONSTRAINT ");
                        sb.Append(connection.WrapFieldName(index.Name));
                        sb.Append(@" PRIMARY KEY ");

                        sb.Append(@"(");
                        for (int i = 0; i < index.ColumnNames.Length; i++)
                        {
                            if (i > 0) sb.Append(",");
                            sb.Append(connection.WrapFieldName(index.ColumnNames[i]));
                            sb.Append(index.ColumnSort[i] == SortDirection.ASC ? @" ASC" : @" DESC");
                        }
                        sb.Append(@")");
                    }
                    else
                    {
                        sb.Append(@"CREATE ");

                        if (index.Mode == TableSchema.IndexMode.Unique) sb.Append(@"UNIQUE ");

                        sb.Append(@"INDEX ");
                        sb.Append(connection.WrapFieldName(index.Name));

                        sb.Append(@"ON ");
                        if (Schema.DatabaseOwner.Length > 0)
                        {
                            sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                            sb.Append('.');
                        }
                        sb.Append(connection.WrapFieldName(_SchemaName));

                        if (index.Mode == TableSchema.IndexMode.Spatial)
                        {
                            sb.Append(@"USING GIST");
                        }

                        sb.Append(@"(");
                        for (int i = 0; i < index.ColumnNames.Length; i++)
                        {
                            if (i > 0) sb.Append(",");
                            sb.Append(connection.WrapFieldName(index.ColumnNames[i]));
                            sb.Append(index.ColumnSort[i] == SortDirection.ASC ? @" ASC" : @" DESC");
                        }
                        sb.Append(@")");
                    }
                }
                else if (connection.TYPE == ConnectorBase.SqlServiceType.MSACCESS)
                {
                    sb.Append(@"ALTER TABLE ");

                    if (Schema.DatabaseOwner.Length > 0)
                    {
                        sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                        sb.Append('.');
                    }
                    sb.Append(connection.WrapFieldName(_SchemaName));

                    sb.Append(@" ADD ");

                    if (index.Mode == dg.Sql.TableSchema.IndexMode.PrimaryKey)
                    {
                        sb.AppendFormat(@"CONSTRAINT {0} PRIMARY KEY ", connection.WrapFieldName(index.Name));
                    }
                    else
                    {
                        if (index.Mode == TableSchema.IndexMode.Unique) sb.Append(@"UNIQUE ");
                        sb.Append(@"INDEX ");
                        sb.Append(connection.WrapFieldName(index.Name));
                        sb.Append(@" ");
                    }
                    sb.Append(@"(");
                    for (int i = 0; i < index.ColumnNames.Length; i++)
                    {
                        if (i > 0) sb.Append(",");
                        sb.Append(connection.WrapFieldName(index.ColumnNames[i]));
                        sb.Append(index.ColumnSort[i] == SortDirection.ASC ? @" ASC" : @" DESC");
                    }
                    sb.Append(@")");
                }
                else if (connection.TYPE == ConnectorBase.SqlServiceType.MSSQL)
                {
                    if (index.Mode == dg.Sql.TableSchema.IndexMode.PrimaryKey)
                    {
                        sb.Append(@"ALTER TABLE ");

                        if (Schema.DatabaseOwner.Length > 0)
                        {
                            sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                            sb.Append('.');
                        }
                        sb.Append(connection.WrapFieldName(_SchemaName));

                        sb.Append(@" ADD CONSTRAINT ");
                        sb.Append(connection.WrapFieldName(index.Name));
                        sb.Append(@" PRIMARY KEY ");

                        if (index.Cluster == TableSchema.ClusterMode.Clustered) sb.Append(@"CLUSTERED ");
                        else if (index.Cluster == TableSchema.ClusterMode.NonClustered) sb.Append(@"NONCLUSTERED ");

                        sb.Append(@"(");
                        for (int i = 0; i < index.ColumnNames.Length; i++)
                        {
                            if (i > 0) sb.Append(",");
                            sb.Append(connection.WrapFieldName(index.ColumnNames[i]));
                            sb.Append(index.ColumnSort[i] == SortDirection.ASC ? @" ASC" : @" DESC");
                        }
                        sb.Append(@")");
                    }
                    else
                    {
                        sb.Append(@"CREATE ");

                        if (index.Mode == TableSchema.IndexMode.Unique) sb.Append(@"UNIQUE ");
                        if (index.Cluster == TableSchema.ClusterMode.Clustered) sb.Append(@"CLUSTERED ");
                        else if (index.Cluster == TableSchema.ClusterMode.NonClustered) sb.Append(@"NONCLUSTERED ");

                        sb.Append(@"INDEX ");
                        sb.Append(connection.WrapFieldName(index.Name));

                        sb.Append(@"ON ");
                        if (Schema.DatabaseOwner.Length > 0)
                        {
                            sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                            sb.Append('.');
                        }
                        sb.Append(connection.WrapFieldName(_SchemaName));

                        sb.Append(@"(");
                        for (int i = 0; i < index.ColumnNames.Length; i++)
                        {
                            if (i > 0) sb.Append(",");
                            sb.Append(connection.WrapFieldName(index.ColumnNames[i]));
                            sb.Append(index.ColumnSort[i] == SortDirection.ASC ? @" ASC" : @" DESC");
                        }
                        sb.Append(@")");
                    }
                }
            }
            else if (indexObj is TableSchema.ForeignKey)
            {
                TableSchema.ForeignKey foreignKey = indexObj as TableSchema.ForeignKey;

                sb.Append(@"ALTER TABLE ");

                if (Schema.DatabaseOwner.Length > 0)
                {
                    sb.Append(connection.WrapFieldName(Schema.DatabaseOwner));
                    sb.Append('.');
                }
                sb.Append(connection.WrapFieldName(_SchemaName));

                sb.Append(@" ADD CONSTRAINT ");
                sb.Append(connection.WrapFieldName(foreignKey.Name));
                sb.Append(@" FOREIGN KEY (");

                for (int i = 0; i < foreignKey.Columns.Length; i++)
                {
                    if (i > 0) sb.Append(",");
                    sb.Append(connection.WrapFieldName(foreignKey.Columns[i]));
                }
                sb.AppendFormat(@") REFERENCES {0} (", foreignKey.ForeignTable);
                for (int i = 0; i < foreignKey.ForeignColumns.Length; i++)
                {
                    if (i > 0) sb.Append(",");
                    sb.Append(connection.WrapFieldName(foreignKey.ForeignColumns[i]));
                }
                sb.Append(@")");
                if (foreignKey.OnDelete != TableSchema.ForeignKeyReference.None)
                {
                    switch (foreignKey.OnDelete)
                    {
                        case TableSchema.ForeignKeyReference.Cascade:
                            sb.Append(@" ON DELETE CASCADE");
                            break;
                        case TableSchema.ForeignKeyReference.NoAction:
                            sb.Append(@" ON DELETE NO ACTION");
                            break;
                        case TableSchema.ForeignKeyReference.Restrict:
                            sb.Append(@" ON DELETE RESTRICT");
                            break;
                        case TableSchema.ForeignKeyReference.SetNull:
                            sb.Append(@" ON DELETE SET NULL");
                            break;
                    }
                }
                if (foreignKey.OnUpdate != TableSchema.ForeignKeyReference.None)
                {
                    switch (foreignKey.OnUpdate)
                    {
                        case TableSchema.ForeignKeyReference.Cascade:
                            sb.Append(@" ON UPDATE CASCADE");
                            break;
                        case TableSchema.ForeignKeyReference.NoAction:
                            sb.Append(@" ON UPDATE NO ACTION");
                            break;
                        case TableSchema.ForeignKeyReference.Restrict:
                            sb.Append(@" ON UPDATE RESTRICT");
                            break;
                        case TableSchema.ForeignKeyReference.SetNull:
                            sb.Append(@" ON UPDATE SET NULL");
                            break;
                    }
                }
            }
        }
示例#29
0
 private void BuildHaving(StringBuilder sb, ConnectorBase connection)
 {
     if (_ListHaving != null && _ListHaving.Count > 0)
     {
         sb.Append(@" HAVING ");
         _ListHaving.BuildCommand(sb, connection, this, null, null);
     }
 }
示例#30
0
        private void BuildGroupBy(StringBuilder sb, ConnectorBase connection, bool invert)
        {
            if (_ListGroupBy != null && _ListGroupBy.Count > 0)
            {
                sb.Append(@" GROUP BY ");
                bool bFirst = true;
                foreach (GroupBy groupBy in _ListGroupBy)
                {
                    if (bFirst) bFirst = false;
                    else sb.Append(',');

                    if (groupBy.ColumnName is dg.Sql.IPhrase)
                    {
                        sb.Append(((dg.Sql.IPhrase)groupBy.ColumnName).BuildPhrase(connection, this));
                    }
                    else if (groupBy.ColumnName is dg.Sql.Where)
                    {
                        ((dg.Sql.Where)groupBy.ColumnName).BuildCommand(sb, true, connection, this);
                    }
                    else if (groupBy.IsLiteral)
                    {
                        sb.Append(groupBy.ColumnName);
                    }
                    else
                    {
                        if (groupBy.TableName != null)
                        {
                            sb.Append(connection.WrapFieldName(groupBy.TableName) + @"." + connection.WrapFieldName(groupBy.ColumnName.ToString()));
                        }
                        else
                        {
                            sb.Append(connection.WrapFieldName(groupBy.ColumnName.ToString()));
                        }
                    }

                    if (connection.TYPE == ConnectorBase.SqlServiceType.MYSQL)
                    {
                        switch (groupBy.SortDirection)
                        {
                            default:
                            case SortDirection.None:
                                break;
                            case SortDirection.ASC:
                                sb.Append(invert ? @" DESC" : @" ASC");
                                break;
                            case SortDirection.DESC:
                                sb.Append(invert ? @" ASC" : @" DESC");
                                break;
                        }
                    }
                }
            }
        }