/// <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); }