public  string CreateSelect(string TableName, string ColumnName, string WhereString ,string OrderString ,params string[] leftTable)
{
  StringBuilder strBuilder=new StringBuilder();
  strBuilder.Append(string.Format("select {0} from {1} ",TableName,TableName ));
  foreach (string leftStr in leftTable)
  {
     strBuilder.Append(leftStr );//这里参数带不带left join 这些你就自己看着办了
  }
  if(!string.IsNullOrEmpty(sqlStr))  strBuilder.Append("where "+ WhereString );
  if(!string.IsNullOrEmpty(OrderString ))  strBuilder.Append("order by "+ WhereString );
}手写代码,自己检查下,顺便说下,这样做没什么意义,数据库查询语句大家都懂,而你自己封装一次,让别人适应你的类吗??没意义

解决方案 »

  1.   

    这种封装相当有意义,但是也相当复杂,不是象你这么简单就可以实现的
    在对象持久化技术中对SQL语句的封装就是核心技术之一
      

  2.   

    多表关联的SELECT是相当复杂的,其实通常不是技术方面的约束,而是具体业务逻辑方面的问题。
    在很多不错ORM的框架中也没有一个彻底的解决办法,包括Hibernate。
    个人认为,类似的查询封装应当建立在一定的业务基础上,而不是大而全的一个或几个对象及方法中
    否则SQL的作用和优势将会被束缚,你会发现SQL的优化及调试等问题在实际应用中变得非常麻烦
      

  3.   

    简单的SQL可以动态生成,复杂的SQL(如:Group By分组统计)语句,还需传入具体SQL
    所以你做持久层时考虑一下能执行传入的SQL语句
      

  4.   

    不过楼主说的多表join查询,还是比较简单的
    你可以把各个实体类关系定义好,然后反射出来这些关系,然后根据这些关系来join,应该不是很难
      

  5.   

    看我这儿有断比较复杂的关联实体类定义,是VB代码,关联的表比较多(6,7个表吧)'*实体类主表参数以及关联表参数'
    <Serializable(), DataTable("tblBuy"), _
    QueryTable("tblWareCode", "WareOID", "tblBuy", "WareOID", JoinType:=SQLJoinType.LEFT), _
    QueryTable("tblProductArea", "ProductOID", "tblBuy", "ProductOID", JoinType:=SQLJoinType.LEFT), _
    QueryTable("tblUnitCode", "UnitOID", "tblBuy", "UnitOID", JoinType:=SQLJoinType.LEFT), _
    QueryTable("tblUser", "UserOID", "tblBuy", "BusinessOID", JoinType:=SQLJoinType.LEFT), _
    QueryTable("tblMarketWareCode", "CodeOID", "tblBuy", "CodeOID", JoinType:=SQLJoinType.LEFT), _
    QueryTable("tblGrade", "GradeOID", "tblBuy", "GradeOID", JoinType:=SQLJoinType.LEFT)> _
    Public Class poBuy
        Inherits clsPersistence
      Private m_strBuyOID As String = ""
        '***********************************************************
        '*     属性名称:BuyOID
        '*     功能描述:编号属性,表Guid类型主键
        '*     作    者:
        '*     创建日期:2004-02-20
        '***********************************************************
        <KeyField("BuyOID", Kind:=KeyType.Guid)> Public Property BuyOID() As String
            Get
                Return m_strBuyOID
            End Get
            Set(ByVal Value As String)
                m_strBuyOID = Value
            End Set
        End Property    ....
    #End Region
      

  6.   

    刚刚好做过一个
     public DataBase(string tablename)
    tablename 直接写 tableA left on tableB left on tableC 这样的形式 
      

  7.   

    把实体类和数据库对应。
    比如类名:TABLE1 数据库表明:TABLE1
    属性对应。
    在类中定义数据库主键。
    然后通过反射。可以直接生成语句。
    然后用实体类当参数。生成查询语句直接实现,INSERT , update , SELECT 
    复杂一点的SELECT 需要多定义一个查询参数类。生成语句的时候解析成SQL