Ejemplo n.º 1
0
        private bool               _first;             //是否为首次拼接sql

        public FQLBuilder(string firstConnector, IFQLProvider provider, string commandText, DbParameter[] parameters, ThreadStart callback, int argumentCount)
        {
            _first          = true;
            _firstConnector = firstConnector;
            _provider       = provider;
            _callback       = callback;
            _commandTexts   = new List <string>();
            if (commandText != null && commandText.Length > 0)
            {
                _commandTexts.Add(commandText);
                _commandTextsLimit = 1;
            }
            else
            {
                _commandTextsLimit = 0;
            }
            _parameters = new List <DbParameter>();
            if (parameters != null && parameters.Length > 0)
            {
                _parameters.AddRange(parameters);
                _parametersLimit = parameters.Length;
            }
            else
            {
                _parametersLimit = 0;
            }
            _argumentStart = argumentCount;
        }
Ejemplo n.º 2
0
 public FQLResult(IFQLProvider provider, string commandText, DbParameter[] parameters, ThreadStart callback, int argumentCount)
 {
     _provider      = provider;
     CommandText    = commandText;
     DbParameters   = parameters ?? EmptyDbParameters;
     _callback      = callback;
     _argumentCount = argumentCount;
 }
Ejemplo n.º 3
0
 public SqlBuilder(DbTour tour, string sql, object[] args)
     : base(GetDbHelper(tour))
 {
     Assertor.AreNull(sql, "sql");
     if (args == null && sql.Length < 24 && sql.IndexOfAny(new char[] { ' ', '\r', '\n', '\t' }) == -1)
     {
         sql = "SELECT * FROM " + sql;
     }
     _fql   = tour._FQLProvider;
     _where = FQL.Format(_fql, sql, args).AsBuilder("WHERE");
 }
Ejemplo n.º 4
0
Archivo: FQL.cs Proyecto: blqw/blqw-FQL
        /// <summary> 使用 指定的IFQLProvider 作为格式化机制,格式sql语句
        /// </summary>
        /// <param name="provider">用于格式化sql语句的格式化机制</param>
        /// <param name="sql">待格式化的sql语句</param>
        /// <param name="args">包含零个或多个Sql参数</param>
        /// <param name="propPrefix">参数名称前缀</param>
        public static IFQLResult Format(IFQLProvider provider, int startNumber, string sql, object[] args)
        {
            if (sql == null || sql.Length == 0)
            {
                throw new ArgumentNullException("sql");
            }
            if (provider == null)
            {
                throw new ArgumentNullException("provider");
            }
            var sqlLength = sql.Length;

            if (sqlLength < 3 || args == null || args.Length == 0)
            {
                return(new FQLResult(provider, sql, null, null, 0));
            }
            var argsCount = args.Length;
            var command   = new FQLCommand()
            {
                Values    = new Dictionary <string, DbParameter>(argsCount),
                Provider  = provider,
                SqlBuffer = new StringBuilder(sqlLength + argsCount * 3),
                Arguments = args,
            };
            var buffer = command.SqlBuffer;

            unsafe
            {
                fixed(char *p = sql)
                {
                    var    curr   = 0;
                    var    state  = 0;          //状态机 0:一般,  1:出现了{, 2:出现了:
                    string number = null;

                    for (int i = 0; i < sqlLength; i++)
                    {
                        var c = p[i];
                        switch (c)
                        {
                        case '{':
                            if (state != 0)
                            {
                                if (state == 1 && curr == i)     //如果是两个 {{
                                {
                                    state = 0;
                                    break;
                                }
                                throw new FormatException("意外的'{'符号");
                            }
                            buffer.Append(sql, curr, i - curr);
                            state = 1;
                            curr  = i + 1;
                            break;

                        case ':':
                            if (state == 1)
                            {
                                number = new string(p, curr, i - curr);
                                curr   = i + 1;
                                state  = 2;
                            }
                            else if (state == 2)
                            {
                                throw new FormatException("意外的':'符号");
                            }
                            break;

                        case '}':
                            if (state == 0)
                            {
                                if (p[i + 1] == '}')
                                {
                                    i++;
                                    buffer.Append(sql, curr, i - curr);
                                    curr = i + 1;
                                }
                                break;
                            }
                            string format;
                            if (state == 1)
                            {
                                number = new string(p, curr, i - curr);
                                format = string.Empty;
                            }
                            else if (curr == i)
                            {
                                format = string.Empty;
                            }
                            else
                            {
                                format = new string(p, curr, i - curr);
                            }
                            command.AppendFormat(number, format, startNumber);
                            state = 0;
                            curr  = i + 1;
                            break;

                        default:
                            break;
                        }
                    }
                    switch (state)
                    {
                    case 1:
                        throw new FormatException("意外的'{'符号");

                    case 2:
                        throw new FormatException("没有'}'符号");

                    default:
                        break;
                    }
                    var count = sqlLength - curr;

                    if (count > 0)
                    {
                        buffer.Append(sql, curr, sqlLength - curr);
                    }
                }
            }
            return(new FQLResult(provider, buffer.ToString(), command.GetParameters(), command.Callback, args.Length));
        }
Ejemplo n.º 5
0
Archivo: FQL.cs Proyecto: blqw/blqw-FQL
 /// <summary> 使用 指定的IFQLProvider 作为格式化机制,格式sql语句
 /// </summary>
 /// <param name="provider">用于格式化sql语句的格式化机制</param>
 /// <param name="sql">待格式化的sql语句</param>
 /// <param name="args">包含零个或多个Sql参数</param>
 public static IFQLResult Format(IFQLProvider provider, string sql, params object[] args)
 {
     return(Format(provider, 0, sql, args));
 }
Ejemplo n.º 6
0
Archivo: FQL.cs Proyecto: blqw/blqw-FQL
 public static IFQLBuilder CreateBuilder(IFQLProvider provider, string firstConnector)
 {
     return(new FQLBuilder(firstConnector, provider, null, null, null, 0));
 }
Ejemplo n.º 7
0
Archivo: FQL.cs Proyecto: blqw/blqw-FQL
 public static IFQLBuilder CreateBuilder(IFQLProvider provider)
 {
     return(new FQLBuilder(null, provider, null, null, null, 0));
 }