예제 #1
0
        /// <summary>
        /// 生成保存实体的sql及参数,返回Dict的结构:包含两个键text和params,text值为sql字符串,params值为sql参数Dict
        /// </summary>
        /// <param name="p_row">待保存的行</param>
        /// <returns>返回提交参数</returns>
        internal Dict GetSaveSql(Row p_row)
        {
            // 不再重复判断
            //if (p_row == null)
            //    throw new Exception(_saveError);

            //// 无需保存
            //if (!p_row.IsAdded && !p_row.IsChanged)
            //    return null;

            // 检查是否包含主键
            foreach (var col in PrimaryKey)
            {
                if (!p_row.Contains(col.Name))
                {
                    throw new Exception(string.Format(_primaryError, p_row.GetType().Name, col.Name));
                }
            }

            Dict          dtParams = new Dict();
            StringBuilder sql      = new StringBuilder();

            if (p_row.IsAdded)
            {
                // 插入
                StringBuilder insertCol = new StringBuilder();
                StringBuilder insertVal = new StringBuilder();
                foreach (var col in PrimaryKey.Concat(Columns))
                {
                    if (!p_row.Contains(col.Name))
                    {
                        continue;
                    }

                    if (insertCol.Length > 0)
                    {
                        insertCol.Append(",");
                    }
                    insertCol.Append(col.Name);

                    if (insertVal.Length > 0)
                    {
                        insertVal.Append(",");
                    }
                    insertVal.Append("@");
                    insertVal.Append(col.Name);

                    dtParams[col.Name] = p_row[col.Name];
                }
                sql.Append("insert into ");
                sql.Append(Name);
                sql.Append("(");
                sql.Append(insertCol.ToString());
                sql.Append(") values (");
                sql.Append(insertVal.ToString());
                sql.Append(")");
            }
            else
            {
                // 更新
                StringBuilder updateVal   = new StringBuilder();
                StringBuilder whereVal    = new StringBuilder();
                int           updateIndex = 1;

                foreach (var col in PrimaryKey.Concat(Columns))
                {
                    if (!p_row.Contains(col.Name) || !p_row.Cells[col.Name].IsChanged)
                    {
                        continue;
                    }

                    // 只更新变化的列
                    if (updateVal.Length > 0)
                    {
                        updateVal.Append(", ");
                    }
                    updateVal.Append(col.Name);
                    updateVal.Append("=@");
                    updateVal.Append(updateIndex);

                    // 更新主键时避免重复
                    dtParams[updateIndex.ToString()] = p_row[col.Name];
                    updateIndex++;
                }

                // 主键
                foreach (var col in PrimaryKey)
                {
                    if (whereVal.Length > 0)
                    {
                        whereVal.Append(" and ");
                    }
                    whereVal.Append(col.Name);
                    whereVal.Append("=@");
                    whereVal.Append(col.Name);

                    // 主键可能被更新
                    dtParams[col.Name] = p_row.Cells[col.Name].OriginalVal;
                }

                sql.Append("update ");
                sql.Append(Name);
                sql.Append(" set ");
                sql.Append(updateVal.ToString());
                sql.Append(" where ");
                sql.Append(whereVal.ToString());
            }

            Dict dt = new Dict();

            dt["text"]   = sql.ToString();
            dt["params"] = dtParams;
            return(dt);
        }