Example #1
0
        public virtual IDataReader RunQuery(IDbConnection connection,
                                            ISqlQuery query,
                                            IDbTransaction transaction      = null,
                                            CommandBehavior commandBehavior = CommandBehavior.Default)
        {
            IDataReader dataReader = null;
            string      sql;

            if (query.FirstRow > 0 || query.TotalRows > 0)
            {
                sql = GetQueryForRows(query);
            }
            else
            {
                sql = query.GetQuery();
            }
            var newQuery = new SqlQueryDef(sql, query.Parameters);


            BeforeRunQuery(query);

            using (IDbCommand cmd = GetCommand(connection, newQuery, transaction))
            {
                ExecuteSqlFinal(new Action(() =>
                {
                    dataReader = cmd.ExecuteReader(commandBehavior);
                }));

                cmd.Parameters.Clear();
            }

            OnQueryComplete();

            return(dataReader);
        }
Example #2
0
        public IQuery <dynamic> From(string query, params object[] parameters)
        {
            var op  = new OptionParser(parameters);
            var raw = new SqlQueryDef(query, parameters);

            return((IQuery <dynamic>)(new Query(this, raw)));
        }
Example #3
0
        public virtual int Count(IDbConnection connection,
                                 ISqlQuery query,
                                 IDbTransaction transaction      = null,
                                 CommandBehavior commandBehavior = CommandBehavior.Default)
        {
            int count;

            if (query is ISqlQueryMaker)
            {
                var comp = (ISqlQueryMaker)query;
                count = Count(connection, comp.TableName, comp.Where.ToString(), comp.Parameters, transaction, commandBehavior);
            }
            else
            {
                ValidateQueryType(query.GetQuery(), "select");
                var countQuery = new SqlQueryDef("SELECT COUNT(*) FROM (" + query + ") q", query.Parameters);
                count = RunQueryScalar(connection, countQuery, transaction, commandBehavior);
            }
            count -= query.FirstRow;
            if (query.TotalRows > 0)
            {
                count = Math.Min(count, query.TotalRows);
            }
            return(count);
        }
Example #4
0
        public int QueryScalar(string query, params object[] parameters)
        {
            var raw = new SqlQueryDef(query, parameters);

            return(DataStorageController.RunQueryScalar(Connection,
                                                        raw,
                                                        Transaction,
                                                        CommandBehavior));
        }
Example #5
0
        protected virtual int Count(IDbConnection connection,
                                    string tableName,
                                    string where,
                                    IEnumerable <IDataParameter> parameters,
                                    IDbTransaction transaction,
                                    CommandBehavior commandBehavior = CommandBehavior.Default)
        {
            var countQuery = new SqlQueryDef(String.Format("SELECT COUNT(*) FROM {0}{1}", tableName,
                                                           (!String.IsNullOrEmpty(where) ?
                                                            " WHERE " + where :
                                                            "")),
                                             parameters);

            return(RunQueryScalar(connection, countQuery, transaction, commandBehavior));
        }
Example #6
0
        public void NullHandling()
        {
            /// Nulls should be stripped
            var testQ = new SqlQueryDef("someField=@val", new object[] { null });

            Assert.AreEqual("someField=@val", testQ.GetQuery());
            Assert.AreEqual(1, testQ.Parameters.Count());


            testQ = new SqlQueryDef("someField=@p1 and someField2=@p2", new object[] { null, DBNull.Value });
            Assert.AreEqual("someField=@p1 and someField2=@p2", testQ.GetQuery());
            Assert.AreEqual(testQ.Parameters.Count(), 2);

            Assert.AreEqual(DBNull.Value, testQ.Parameters.ElementAt(0).Value);
            Assert.AreEqual(DBNull.Value, testQ.Parameters.ElementAt(1).Value);
        }
Example #7
0
        /// <summary>
        /// When passing type=0, it's never going to try to build a query - only fully formed query SQl will work.
        /// </summary>
        /// <param name="type"></param>
        /// <param name="query"></param>
        /// <param name="parameters"></param>
        protected void ParseQuery(object query, IEnumerable <object> parameters)
        {
            ISqlQuery outputQuery = null;

            if (query == null)
            {
                throw new IQMissingQueryException();
            }
            else if (query is SqlQueryMaker)
            {
                ExpectNoParameters(parameters);
                if (QueryType != 0 && ((SqlQueryMaker)query).QueryType != QueryType)
                {
                    throw new IQException("The query passed was not of type '" + QueryType.ToString() + "' as required for this operation.");
                }
                outputQuery = (SqlQueryMaker)query;
            }
            else if (QueryType != 0)
            {
                outputQuery = ParseComplexQuery(query, parameters);
            }
            else if (query is string)
            {
                string queryString = (string)query;

                ParameterParser pp = new ParameterParser(queryString, parameters);

                outputQuery = new SqlQueryDef(queryString, pp.Parameters);
            }
            else
            {
                throw new IQException("The type of object '" + query.GetType().ToString() + "' passed as a query isn't something I know how to handle.");
            }

            if (outputQuery == null)
            {
                throw new IQMissingQueryException();
            }

            if (outputQuery.QueryType == QueryType.Invalid && QueryType != 0)
            {
                throw new IQException("Couldn't make a valid query out of the mess you passed me. Check the SQL and the parameters.");
            }

            Query = outputQuery;
        }
Example #8
0
        public void Basic()
        {
            var testQ = new SqlQueryDef("someField=@val", new object[] { 123 });

            Assert.AreEqual("someField=@val", testQ.GetQuery());
            Assert.AreEqual("@val", testQ.Parameters.First().ParameterName, "Parm name was correct when created for a simple field compariosn");
            Assert.AreEqual(123, testQ.Parameters.First().Value, "Parm value correct");

            testQ = new SqlQueryDef("someField=@valParm", new object[] { "abc" });
            Assert.AreEqual("someField=@valParm", testQ.GetQuery());
            Assert.AreEqual("@valParm", testQ.Parameters.First().ParameterName, "Parm name was correct when created for a simple field compariosn");
            Assert.AreEqual("abc", testQ.Parameters.First().Value, "Parm value correct");

            string query = "someField=@val1 and someOtherField=@val2";

            testQ = new SqlQueryDef(query, new object[] { "@val2", "abc", "@val1", 678 });
            Assert.AreEqual(testQ.GetQuery(), query);
            Assert.AreEqual(testQ.Parameters.ElementAt(1).ParameterName, "@val1", "Parm name was correct when created for a simple field compariosn");
            Assert.AreEqual(testQ.Parameters.ElementAt(1).Value, 678, "Parm value correct");
        }
        protected override int InsertAndReturnNewID(IDbConnection conn,
                                                    ISqlQuery query,
                                                    IDbTransaction transaction      = null,
                                                    CommandBehavior commandBehavior = CommandBehavior.Default)
        {
            int result = 0;

            BeforeRunQuery(query);
            var newQuery = new SqlQueryDef(query.GetQuery() + "; SET @___ID=SCOPE_IDENTITY();", query.Parameters);


            using (IDbCommand cmd = GetCommand(conn, newQuery, transaction))
            {
                IDataParameter ID = cmd.CreateParameter();
                ID.ParameterName = "@___ID";
                ID.DbType        = System.Data.DbType.Int32;
                ID.Direction     = ParameterDirection.Output;
                ID.Value         = -1;
                cmd.Parameters.Add(ID);

                ExecuteSqlFinal(new Action(() =>
                {
                    cmd.ExecuteScalar();
                }));

                result = Convert.ToInt32(ID.Value.ToString());
                cmd.Parameters.Clear();
                cmd.Dispose();
            }
            if (commandBehavior == CommandBehavior.CloseConnection)
            {
                conn.Close();
            }
            OnQueryComplete();
            return(result);
        }
Example #10
0
        protected ISqlQuery ParseComplexQuery(object query, IEnumerable <object> parms)
        {
            ISqlQuery outputQuery = null;

            // We always want to parse the parameters. But if the thing passed to us as "query" is not a string, then
            // just assume that all the parms are option type parameters and don't pass a query to ParameterParser
            string querySource = query is string?
                                 (string)query:
                                 "";

            ParameterParser pp = new ParameterParser(querySource, parms);

            if (Types.IsNumericType(query))
            {
                // It's a single numeric value - assume it's a primary key

                ExpectNoParameters(pp.Parameters);

                var classInfo = IQ.ClassInfo <T>();

                ISqlQueryMaker queryPK = classInfo.GetQuery();
                queryPK.Where.Add(classInfo.PrimaryKeyField.Name, query);
                outputQuery = queryPK;
            }
            else if (query is string)
            {
                bool isMappable = Types.IsMappable(typeof(T));

                // First check if its a single named field

                if (isMappable)
                {
                    var classInfo = IQ.ClassInfo <T>();


                    // Try to create a valid raw query.. if it's not valid, assume it's a where
                    if (QueryType == QueryType.Where || pp.QueryType == QueryType.Invalid)
                    {
                        ISqlQueryMaker queryPK = classInfo.GetQuery();

                        //var whereString = new WhereString(pp.Query,
                        //    pp.Parameters.Count > 0 ?
                        //        pp.Parameters.ToArray():
                        //        null);
                        queryPK.Where.Add(pp.GetWhereClause());

                        outputQuery = queryPK;
                    }
                    else
                    {
                        outputQuery = new SqlQueryDef(pp.GetQuery(QueryType), pp.Parameters);
                    }
                }
                else
                {
                    // it's mapped to a primitive type -
                    outputQuery = new SqlQueryDef(pp.GetQuery(QueryType), pp.Parameters);
                }
            }
            if (outputQuery.QueryType != QueryType)
            {
                throw new IQException("Wrong type of query passed to method: was " + outputQuery.ToString() + ", expected " + QueryType.ToString());
            }

            return(outputQuery);
        }