Exemplo n.º 1
0
        private string GenerateUpdateSQL(IList<RdbColumn> lobColumns)
        {
            var sql = new StringWriter();
            sql.Write("UPDATE ");
            sql.AppendQuoteName(this);
            sql.Write(" SET ");

            bool comma = false;
            var paramIndex = 0;

            //先更新所有非 lob 字段。
            for (int i = 0, c = _columns.Count; i < c; i++)
            {
                var column = _columns[i];
                if (!column.Info.IsPrimaryKey && !column.IsLOB)
                {
                    if (comma) { sql.Write(','); }
                    else { comma = true; }

                    sql.AppendQuote(this, column.Name).Write(" = {");
                    sql.Write(paramIndex++);
                    sql.Write('}');
                }
            }
            //再更新所有 lob 字段。
            if (lobColumns != null)
            {
                for (int i = 0, c = lobColumns.Count; i < c; i++)
                {
                    if (comma) { sql.Write(','); }
                    else { comma = true; }

                    var column = lobColumns[i];
                    sql.AppendQuote(this, column.Name);
                    sql.Write(" = {");
                    sql.Write(paramIndex++);
                    sql.Write('}');
                }
            }
            sql.Write(" WHERE ");
            sql.AppendQuote(this, _pkColumn.Name);
            sql.Write(" = {");
            sql.Write(paramIndex);
            sql.Write('}');

            return sql.ToString();
        }
Exemplo n.º 2
0
        private string ReplaceLOBColumns(string sql)
        {
            //如果 sql 中编写了 LOBColumnsToken 这个符号,则表示需要进行列名替换。
            var tokenIndex = sql.IndexOf(LOBColumnsToken);
            if (tokenIndex < 0) return sql;

            var res = new StringWriter();

            var tableName = string.Empty;

            //如果使用了 XXX.{*},则表示指定了表的名称,这时需要在每个字段前使用这个表的名称。
            var hasTablePrefix = sql[tokenIndex - 1] == '.';
            if (hasTablePrefix)
            {
                var tablePrefixIndex = tokenIndex - 1;
                while (true)
                {
                    tablePrefixIndex--;
                    if (tablePrefixIndex < 0) throw new InvalidOperationException("sql 语句格式有误。");
                    var c = sql[tablePrefixIndex];
                    if (c == ' ')
                    {
                        tablePrefixIndex++;
                        tableName = sql.Substring(tablePrefixIndex, tokenIndex - 1 - tablePrefixIndex);

                        var before = sql.Substring(0, tablePrefixIndex);
                        res.Write(before);

                        break;
                    }
                }
            }
            else
            {
                var before = sql.Substring(0, tokenIndex);
                res.Write(before);

                tableName = this.GetQuoteName();
            }

            //输出所有非 lob 列的列名。
            bool comma = false;
            for (int i = 0, c = _columns.Count; i < c; i++)
            {
                var column = _columns[i];
                if (column.IsLOB) { continue; }
                if (comma) { res.Write(','); }
                else { comma = true; }

                res.Write(tableName);
                res.Write('.');
                res.AppendQuote(this, column.Name);
            }

            var after = sql.Substring(tokenIndex + LOBColumnsToken.Length);
            res.Write(after);

            return res.ToString();
        }
Exemplo n.º 3
0
 private string GenerateDeleteSQL()
 {
     var sql = new StringWriter();
     sql.Write("DELETE FROM ");
     sql.AppendQuoteName(this);
     sql.Write(" WHERE ");
     sql.AppendQuote(this, this.PKColumn.Name).Write(" = {0}");
     return sql.ToString();
 }
Exemplo n.º 4
0
        internal string GenerateInsertSQL()
        {
            var sql = new StringWriter();
            sql.Write("INSERT INTO ");
            sql.AppendQuote(this, this.Name).Write(" (");

            var values = new StringBuilder();
            bool comma = false;
            var index = 0;
            for (int i = 0, c = _columns.Count; i < c; i++)
            {
                var column = _columns[i];
                if (column.CanInsert)
                {
                    if (comma)
                    {
                        sql.Write(',');
                        values.Append(',');
                    }
                    else { comma = true; }

                    sql.AppendQuote(this, column.Name);
                    values.Append('{').Append(index++).Append('}');
                }
            }

            sql.Write(") VALUES (");
            sql.Write(values.ToString());
            sql.Write(")");

            return sql.ToString();
        }
Exemplo n.º 5
0
        /// <summary>
        /// 生成 Update 语句。
        /// 注意,此方法不会更新 LOB 字段。
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        private string GenerateUpdateSQL(RdbTable table)
        {
            //代码参考 RdbTable.GenerateUpdateSQL() 方法。

            var sql = new StringWriter();
            sql.Write("UPDATE ");
            sql.AppendQuoteName(table);
            sql.Write(" SET ");

            var updateLOB = this.UpdateLOB;
            bool comma = false;
            var columns = table.Columns;
            for (int i = 0, c = columns.Count; i < c; i++)
            {
                var column = columns[i];
                if (!column.Info.IsPrimaryKey && (updateLOB || !column.IsLOB))
                {
                    if (comma) { sql.Write(','); }
                    else { comma = true; }

                    sql.AppendQuote(table, column.Name).Write(" = @");
                    sql.Write(column.Name);
                }
            }

            sql.Write(" WHERE ");
            sql.AppendQuote(table, table.PKColumn.Name);
            sql.Write(" = @");
            sql.Write(table.PKColumn.Name);

            return sql.ToString();
        }
Exemplo n.º 6
0
        /// <summary>
        /// 子类重写此方法,来实现自己的 GetEntityValue 方法的数据层代码。
        /// </summary>
        /// <param name="entityId"></param>
        /// <param name="property"></param>
        /// <returns></returns>
        public override LiteDataTable GetEntityValue(object entityId, string property)
        {
            var table = this.DbTable;
            var idColumn = table.PKColumn.Name;
            var column = table.Translate(property);

            var sql = new StringWriter();
            sql.Write("SELECT ");
            sql.AppendQuote(table, column);
            sql.Write(" FROM ");
            sql.AppendQuoteName(table);
            sql.Write(" WHERE ");
            sql.AppendQuote(table, idColumn);
            sql.Write(" = {0}");

            return this.QueryTable(new TableQueryArgs
            {
                FormattedSql = sql.ToString(),
                Parameters = new object[] { entityId },
            });
        }
Exemplo n.º 7
0
        internal string GenerateInsertSQL()
        {
            var sql = new StringWriter();
            sql.Write("INSERT INTO ");
            sql.AppendQuote(this, this.Name).Write(" (");
            var values = new StringBuilder();
            bool comma = false;
            var index = 0;
            foreach (RdbColumn column in _columns)
            {
                if (this.CanInsert(column))
                {
                    if (comma)
                    {
                        sql.Write(',');
                        values.Append(',');
                    }
                    else { comma = true; }

                    sql.AppendQuote(this, column.Name);
                    values.Append('{').Append(index++).Append('}');
                }
            }
            sql.Write(") VALUES (");
            sql.Write(values.ToString());
            sql.Write(")");

            return sql.ToString();
        }