/////////////////////////////////////////////////////////////////////////////
// File Description : 生成SQL语句
// Copyright : joyin
// -------------------------------------------------------------------------
// Date Created : Mar 26, 2010
// Author : jiangxinjun
//
/////////////////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using HanHe.Common;
using HanHe.Entity;
using HanHe.Utility.Data;
namespace HanHe.DAL
{
///
/// 生成SQL语句
///
public static class SqlStringHelper
{
#region CreateInsertSql
///
/// 生成Insert SQL语句
///
/// 表名
///
///
public static string CreateInsertSql(string tableName, Database db)
{
string sql = CommonUseSqlFormat.INSERT_SQL;
var schema = DAOManager.LoadTableSchema(tableName, db);
List columns = new List();
List parameters = new List();
foreach (var item in schema)
{
if (!item.Value.IsIdentity) //Identity的不需要插入
{
columns.Add(item.Key);
parameters.Add("@" + item.Key);
}
}
return string.Format(sql, tableName
, CollectionUti.Join(",", columns)
, CollectionUti.Join(",", parameters));
}
#endregion
#region CreateInsertDbCommand
///
/// 创建Insert的DbCommand
///
/// 实体
/// 表名
/// 相关的DAL
/// 返回Command
/// 是否成功
/// 会在赋值时,检测值是否大于数据库的字段长度。如果非法插入赋值,就会抛出CheckInvalidValueException异常
public static SqlExecuteResult CreateInsertDbCommand(BaseEntity entity, string tableName
, BaseDAL dal, out DbCommand cmd)
{
SqlExecuteResult result = null;
cmd = dal.DataAccess.GetSqlStringCommand(CreateInsertSql(tableName, dal.DataAccess));
//设置参数
var schema = DAOManager.LoadTableSchema(tableName, dal.DataAccess);
List mappers = new List();
foreach (var item in schema)
{
mappers.Add(new BaseDAL.CommandMapper(item.Key));
}
var checkInvalids = dal.SetCommandValueWithCheck(entity, mappers, cmd, tableName);
if (CollectionUti.HasItem(checkInvalids))
{
result = SqlExecuteResult.Create(checkInvalids);
}
return result;
}
#endregion
#region CreateDynamicSearchDbCommand
///
/// 动态查询字段信息
///
public class DynamicSearchColumnInfo
{
///
/// 构造函数
///
public DynamicSearchColumnInfo()
{
}
private string oper;
///
/// 操作符
///
/// 默认如果字符串遇到以%开头或结尾的,就用操作符Like;其他的用=
public string Operator
{
get
{
if (!string.IsNullOrEmpty(oper))
{
return oper;
}
if(Value == null)
{
return "=";
}
string str = Value.ToString();
return (!string.IsNullOrEmpty(str) && (str.StartsWith("%") || str.EndsWith("%"))) ? "LIKE" : "=";
}
set
{
oper = value;
}
}
///
/// 字段名
///
public string ColumnName { get; set; }
///
/// 查询值
///
public object Value { get; set; }
///
/// 字段名前缀
///
public string Prefix { get; set; }
private string whereString;
///
/// 直接Where字符串
///
/// 如果设置了,则ColumnName设置无效,只做parameterName的作用
public string WhereString
{
get
{
return this.whereString;
}
set
{
whereString = value;
}
}
}
///
/// 拼凑动态查询Sql
///
/// Sql主句,用“{0}”标识组合条件放置的地方。如果没有,则直接拼接Where条件语句到语句最后
/// 搜索栏位信息
/// 数据库访问工具类
/// Sql命令对象
public static DbCommand CreateDynamicSearchDbCommand(string sqlMainSql
, List colInfos, Database db)
{
//先创建一个临时的DbCommand
DbCommand cmd = db.GetSqlStringCommand(sqlMainSql);
//如果所有值都为空,不需要添加条件,会默认添加一个“1=1”的条件进去。
string whereStr = " 1=1 ";
if (CollectionUti.HasItem(colInfos))
{
List cacheParameters = new List();
List whereStrs = new List();
foreach (var item in colInfos)
{
DbType? dbType = GetDbType(item.Value);
if (dbType.HasValue)
{
//查找ParaName
string paraName = GetParameterName(item.ColumnName, cacheParameters);
if (string.IsNullOrEmpty(item.WhereString))
{
//自动创建Where条件语句
//添加rtrim,避免char类型形成的空格导致查询不匹配
string trimFunction = (dbType.Value == DbType.Int32
|| dbType.Value == DbType.Decimal
|| dbType.Value == DbType.Int64
|| dbType.Value == DbType.Double) ? "" : "RTRIM";
if (string.IsNullOrEmpty(item.Prefix))
{
whereStrs.Add(string.Format(" {3}([{0}]) {1} @{2}"
, item.ColumnName, item.Operator, paraName, trimFunction));
}
else
{
whereStrs.Add(string.Format(" {4}({2}.[{0}]) {1} @{3}"
, item.ColumnName, item.Operator, item.Prefix, paraName, trimFunction));
}
}
else
{
//自定义的条件语句
whereStrs.Add(item.WhereString);
}
db.AddInParameter(cmd, paraName, dbType.Value, item.Value);
}
}
cacheParameters.Clear();
if (whereStrs.Count > 0)
{
whereStr = CollectionUti.Join(" AND ", whereStrs);
whereStrs.Clear();
}
//拼凑Sql
if (sqlMainSql.IndexOf("{0}") < 0)
{
//如果没有{0},自动加上Where {0}
sqlMainSql += " WHERE {0} ";
}
}
//重新设置Command
cmd.CommandText = string.Format(sqlMainSql, whereStr);
return cmd;
}
///
/// 根据字段名获取对应的参数名称
///
/// 字段名称
/// 参数缓存列表,避免同样的字段返回同样的参数名称
/// 参数名称
private static string GetParameterName(string columnName, List cacheParameter)
{
if (!cacheParameter.Contains(columnName))
{
cacheParameter.Add(columnName);
return columnName;
}
else
{
//参数名後面+1
string paraName = columnName + (cacheParameter.FindAll(_str => { return _str == columnName; }).Count + 1).ToString();
cacheParameter.Add(columnName);
return paraName;
}
}
private static DbType? GetDbType(object val)
{
DbType? dbType = default(DbType?);
if (val != null && !string.IsNullOrEmpty(val.ToString()))
{
if (val is int || val is int?)
{
dbType = DbType.Int32;
}
else if (val is decimal || val is decimal?)
{
dbType = DbType.Decimal;
}
else if (val is double || val is double?)
{
dbType = DbType.Double;
}
else if (val is long || val is long?)
{
dbType = DbType.Int64;
}
else if (val is DateTime || val is DateTime?)
{
dbType = DbType.DateTime;
}
else
{
dbType = DbType.String;
}
}
return dbType;
}
#endregion
}
}