예제 #1
0
        protected void RequireClauses(SqlClause clause)
        {
            var err = new Func <string>(() =>
            {
                return(" is required for an " + QueryType.ToString() + " query.");
            });

            if (clause.HasFlag(SqlClause.Table) && String.IsNullOrEmpty(TableName))
            {
                throw new IQException("TableName" + err());
            }
            if (clause.HasFlag(SqlClause.Select) && String.IsNullOrEmpty(Select))
            {
                throw new IQException("A SELECT clause" + err());
            }
            if (clause.HasFlag(SqlClause.From) && String.IsNullOrEmpty(From))
            {
                throw new IQException("A FROM clause" + err());
            }
            if (clause.HasFlag(SqlClause.Where) && Where.IsEmpty)
            {
                throw new IQException("A WHERE clause" + err());
            }
            if (clause.HasFlag(SqlClause.UpdateSet) && String.IsNullOrEmpty(UpdateSet))
            {
                throw new IQException("TableName" + err());
            }
            if (clause.HasFlag(SqlClause.InsertFields) && String.IsNullOrEmpty(InsertFields))
            {
                throw new IQException("TableName" + err());
            }
        }
예제 #2
0
        protected void RequireClauses(SqlClause clause)
        {
            var err = new Func<string>(() =>
            {
                return " is required for an " + QueryType.ToString() + " query.";
            });

            if (clause.HasFlag(SqlClause.Table) && String.IsNullOrEmpty(TableName))
            {
                throw new IQException("TableName" + err());
            }
            if (clause.HasFlag(SqlClause.Select) && String.IsNullOrEmpty(Select))
            {
                throw new IQException("A SELECT clause" + err());
            }
            if (clause.HasFlag(SqlClause.From) && String.IsNullOrEmpty(From))
            {
                throw new IQException("A FROM clause" + err());
            }
            if (clause.HasFlag(SqlClause.Where) && Where.IsEmpty)
            {
                throw new IQException("A WHERE clause" + err());
            }
            if (clause.HasFlag(SqlClause.UpdateSet) && String.IsNullOrEmpty(UpdateSet))
            {
                throw new IQException("TableName" + err());
            }
            if (clause.HasFlag(SqlClause.InsertFields) && String.IsNullOrEmpty(InsertFields))
            {
                throw new IQException("TableName" + err());
            }
        }
예제 #3
0
        /// <summary>
        /// Return the SQL for this query
        /// </summary>
        /// <returns></returns>
        public string GetQuery(SqlClause clause)
        {
            //if (String.IsNullOrEmpty(PrimaryKey) || String.IsNullOrEmpty(TableName)) {
            //    throw new InvalidOperationException("Missing primary key or table name.");
                //}

                SqlClause required;
                switch (QueryType)
                {
                    case QueryType.Select:
                        // special case for select: nothing is required, so we can extract parts
                         required = SqlClause.Select ;
                         RequireClauses(required);

                         /// <summary>
                         /// This may not actually create a query that is valid SQL in every (or even any) language. The SQL output from the IQuery/
                         /// ISqlQueryMaker object is not intended to be used directly by a SQL engine, rather, it is supposed to generate a unique
                         /// query for each distict conceptual query, and provide component parts that a DataStorageController can use to map to a
                         /// particular engine's implementation.
                         /// </summary>
                         ///
                        return String.Format("{0}{1}{2}{3}{4}{5}{6}",
                            (clause.HasFlag(SqlClause.Select)) ?
                                "SELECT " + Select :
                                "",
                             (clause.HasFlag(SqlClause.From) && !String.IsNullOrEmpty(From)) ?
                                " FROM " + From : "",
                            (clause.HasFlag(SqlClause.Where) && !Where.IsEmpty) ?
                                " WHERE " + Where : "",
                            (clause.HasFlag(SqlClause.GroupBy) && !String.IsNullOrEmpty(GroupBy)) ?
                                " GROUP BY " + GroupBy : "",
                           (clause.HasFlag(SqlClause.Having) && !String.IsNullOrEmpty(Having)) ?
                                " HAVING " + Having : "",
                            (clause.HasFlag(SqlClause.OrderBy) && !OrderBy.IsEmpty) ?
                                " ORDER BY " + OrderBy : "",
                            (clause.HasFlag(SqlClause.Limit) && (TotalRows>0 || FirstRow>0)) ?
                                (" LIMIT " + FirstRow+"," + TotalRows) : ""
                                ).Trim();

                    case QueryType.Delete:
                        required = SqlClause.Table | SqlClause.Where;
                        RequireClauses(required);
                        return String.Format("DELETE FROM {0} WHERE {1}",
                            TableName,
                            Where);
                    case QueryType.Update:
                        required = SqlClause.Table | SqlClause.Where | SqlClause.UpdateSet;
                        RequireClauses(required);
                        // TODO: From queries
                        return String.Format("UPDATE {0} SET {1} WHERE {2}",
                            TableName,
                            UpdateSet,
                            Where);
                    case QueryType.Insert:
                        RequireClauses(SqlClause.Table | SqlClause.InsertFields);
                        return String.Format("INSERT INTO {0} {1} VALUES {2}",
                            TableName,
                            InsertFields,
                            InsertValues);
                    default:
                        throw new InvalidOperationException("Unsupported query type.");
                }
        }
예제 #4
0
        /// <summary>
        /// Return the SQL for this query
        /// </summary>
        /// <returns></returns>
        public string GetQuery(SqlClause clause)
        {
            //if (String.IsNullOrEmpty(PrimaryKey) || String.IsNullOrEmpty(TableName)) {
            //    throw new InvalidOperationException("Missing primary key or table name.");
            //}

            SqlClause required;

            switch (QueryType)
            {
            case QueryType.Select:
                // special case for select: nothing is required, so we can extract parts
                required = SqlClause.Select;
                RequireClauses(required);

                /// <summary>
                /// This may not actually create a query that is valid SQL in every (or even any) language. The SQL output from the IQuery/
                /// ISqlQueryMaker object is not intended to be used directly by a SQL engine, rather, it is supposed to generate a unique
                /// query for each distict conceptual query, and provide component parts that a DataStorageController can use to map to a
                /// particular engine's implementation.
                /// </summary>
                ///
                return(String.Format("{0}{1}{2}{3}{4}{5}{6}",
                                     (clause.HasFlag(SqlClause.Select)) ?
                                     "SELECT " + Select :
                                     "",
                                     (clause.HasFlag(SqlClause.From) && !String.IsNullOrEmpty(From)) ?
                                     " FROM " + From : "",
                                     (clause.HasFlag(SqlClause.Where) && !Where.IsEmpty) ?
                                     " WHERE " + Where : "",
                                     (clause.HasFlag(SqlClause.GroupBy) && !String.IsNullOrEmpty(GroupBy)) ?
                                     " GROUP BY " + GroupBy : "",
                                     (clause.HasFlag(SqlClause.Having) && !String.IsNullOrEmpty(Having)) ?
                                     " HAVING " + Having : "",
                                     (clause.HasFlag(SqlClause.OrderBy) && !OrderBy.IsEmpty) ?
                                     " ORDER BY " + OrderBy : "",
                                     (clause.HasFlag(SqlClause.Limit) && (TotalRows > 0 || FirstRow > 0)) ?
                                     (" LIMIT " + FirstRow + "," + TotalRows) : ""
                                     ).Trim());

            case QueryType.Delete:
                required = SqlClause.Table | SqlClause.Where;
                RequireClauses(required);
                return(String.Format("DELETE FROM {0} WHERE {1}",
                                     TableName,
                                     Where));

            case QueryType.Update:
                required = SqlClause.Table | SqlClause.Where | SqlClause.UpdateSet;
                RequireClauses(required);
                // TODO: From queries
                return(String.Format("UPDATE {0} SET {1} WHERE {2}",
                                     TableName,
                                     UpdateSet,
                                     Where));

            case QueryType.Insert:
                RequireClauses(SqlClause.Table | SqlClause.InsertFields);
                return(String.Format("INSERT INTO {0} {1} VALUES {2}",
                                     TableName,
                                     InsertFields,
                                     InsertValues));

            default:
                throw new InvalidOperationException("Unsupported query type.");
            }
        }