' clsSQLBuilder
‘ By YuHonglai
‘ www.hahaIT.com
‘ hahasoft@msn.com 
' Note:提供重载方法以指明表名称,默认情况下,是传入参数 o 的类型+"tbl_",此时类名称必须是 clsXXX 的形式.
' 如:
' dim Rooms as new clsRooms
' SQLBuilder.Add(Rooms)
' 此时程序将把 clsRooms 转换成 tbl_Rooms,以操作数据库表 tbl_Rooms
' 如果类名称和数据库表名称不具有上述对应关系,请使用 Add(o,"TableName")形式的方法,以显示指定要操作的数据库表的名称 
Public Class SQLBuilder 
    ' 当要生成的SQL语句的 where 条件语句很复杂时,用该常量作为 Select 方法中 FindCondition(HashTable)
    ' Key,例如:要生成 where Birth<'2000-4-4' and Birth>'1980-1-1' 的复杂条件时,用以下方法:
    ' Dim h as new HashTable
    ' h.Add(ComplexSQL,"_Birth<'2000-4-4' and _Birth>'1980-1-1'")
    ' 注意,Birth是实体类的属性名称,前面必须有一个下划线 "_"
    ' 处理时,程序将用实际数据库字段名称代替相应的 _Birth 
    Public Const ComplexSQL As String = "@ComplexSQL" 
    ' 根具实体类生成相应的 Insert ...SQL 语句
    ' 如果与数据库表名称对应的属性时 关键字段而且是自动增加值时(在DB.XML文件中seed的值为 1 )
    ' 那么该属相将忽略,不会出现在返回的 Insert... SQL语句中
    Public Overloads Shared Function Add(ByVal o As Object) As String
        Dim typeString As String = o.GetType.ToString
        Dim i As Int16
        i = typeString.IndexOf("cls") + 3
        typeString = "tbl_" & typeString.Substring(i, typeString.Length - i)
        Return Add(o, typeString)
    End Function 
    Public Overloads Shared Function Add(ByVal o As Object, ByVal TableName As String) As String
        Try
            Dim outSQL As String
            Dim tmpString As String 
            outSQL = "insert into [" & TableName & "]("
            tmpString = "" 
            Dim dsDB As New DataSet
            dsDB.ReadXml(clsPersistant.DBConfigPath) 
            Dim row As Data.DataRow 
            For Each row In dsDB.Tables(TableName).Rows
                If row.Item("seed") & "" = "0" Then
                    outSQL = outSQL & row.Item("dbname") & ","
                    tmpString = tmpString & getS(row.Item("type")) & "@" & row.Item("dbname") & getS(row.Item("type")) & ","
                End If
            Next
            outSQL = outSQL.Substring(0, outSQL.Length - 1)
            tmpString = tmpString.Substring(0, tmpString.Length - 1)
            outSQL = outSQL & ") values (" & tmpString & ")" 
            For Each row In dsDB.Tables(TableName).Rows
                If row.Item("seed") & "" <> "1" Then
                    ' tmpString = o.GetType.InvokeMember(row.Item("name"), Reflection.BindingFlags.GetField Or Reflection.BindingFlags.GetProperty, Nothing, o, New Object() {}) & ""
                    tmpString = CallByName(o, CType(row.Item("name"), String).Trim, CallType.Get) & ""
                    If tmpString = "True" Then
                        tmpString = "1"
                    ElseIf tmpString = "False" Then
                        tmpString = "0"
                    End If
                    outSQL = outSQL.Replace("@" & row.Item("dbname"), tmpString)
                End If
            Next 
            Return outSQL.Trim
        Catch ex As Exception
            Throw ex
        End Try
    End Function