关于SQL语句的自动生成

作者PeterXu  来源:Blog.CSDN  Blog: http://blog.csdn.net/peterreg/
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。
本文地址:http://blog.csdn.net/peterreg/archive/2008/04/02/2243011.aspx  

在我们的日常编程中,数据库的程序基本上都要与SQL语句打交道,SQL语句的编写不可避免的成为一个头疼的工作。且因为SQL语句是STRING类型,因此在编译阶段查不出错,只有到运行时才能发现错误。
  本文的解决方案,通过自动生成SQL语句,在一定程度上降低出错的概率,从而提高编程效率。

    public interface IClause
    {
        void Add(string name, object val);
        void AddWhere(string name, object val);
        void Clear();
        string TableName { set;}
    }

    首先抽象出生成器的标准接口,Add及Addwhere,分别用增加字段及WHERE条件的,

    比如说,在Insert状态下,Add("name","gates")相当于字段name的值为gates

                    在select状态下,Add("name","gates")相当于字段name的别名为gates即select name as gates

                    在update状态下,Add("name","gates")相当于字段name的值为gates即update name = "gates"

    TableName属性即操作的表名

    Clear()是为了一个实例多次应用,清空当前的字段及WHERE条件,表名的设置都通过TABLENAME属性设置

 

接我的上一篇文章《关于SQL语句的自动生成!(一)》,基类实现接口,通过基类的实现,从而有效的实现的代码屏蔽。

private   abstract   class  BaseClause : IClause
        
... {
            
private string m_strTable = string.Empty;
            
private Where m_oWhere = new Where();

            
protected BaseClause()
            
...{
                
this.m_strTable = string.Empty;
                
this.Clear();
            }


            
public virtual void Add(string name, object val)
            
...{
            }


            
public void AddWhere(string name, object val)
            
...{
                
this.m_oWhere.Add(name, val);
            }


            
public void Clear()
            
...{
                
this.m_oWhere.Clear();
                
this.auxClear();
            }


            
public string TableName
            
...{
                
set ...this.m_strTable = value; }
                
protected get ...return this.m_strTable; }
            }


            
public sealed override string ToString()
            
...{
                
return this.ToStr + this.m_oWhere.ToString();
            }


            
protected abstract string ToStr ...get;}
            
protected virtual void auxClear() ...{ }
        }

 

工厂模式的应用,根据传入的枚举参数,实现动态创建接口的实例

public   abstract   class  ClauseFactory
    
... {
        
public enum Flag
        
...{
            Insert,
            Update,
            Select,
            Delete,
        }


        
public static IClause Create(string table, Flag category)
        
...{
            BaseClause ret 
= null;
            
switch (category)
            
...{
                
case Flag.Insert:
                    ret 
= new Insert();
                    
break;

                
case Flag.Update:
                    ret 
= new Update();
                    
break;

                
case Flag.Select:
                    ret 
= new Select();
                    
break;

                
case Flag.Delete:
                    ret 
= new Delete();
                    
break;

                  
default:
                    
break;
            }

            
if (ret != null)
            
...{
                ret.TableName 
= table;
            }

            
return ret;
        }

}

各派生类的具体实现

       private   class  Insert : BaseClause
        
... {
            
private string m_strName;
            
private string m_strValue;

            
public override void Add(string name, object val)
            
...{
                
if (val == null)
                
...{
                    
this.Add(name, "null"false);
                }

                
else
                
...{
                    
this.Add(name, val.ToString(), val is string || val is DateTime);
                }

            }


            
private void Add(string name, string val, bool isref)
            
...{
                
if (isref)
                
...{
                    val 
= "'" + val + "'";
                }

                
if (this.m_strName == string.Empty)
                
...{
                    
this.m_strName = "[" + name + "]";
                    
this.m_strValue = val;
                }

                
else
                
...{
                    
this.m_strName += ",[" + name + "]";
                    
this.m_strValue += "," + val;
                }

            }


            
protected override string ToStr
            
...{
                
get ...return "INSERT INTO [" + base.TableName + "] ( " + this.m_strName + " ) values ( " + this.m_strValue + " )"; }
            }


            
protected override void auxClear()
            
...{
                
this.m_strValue = string.Empty;
                
this.m_strName = string.Empty;
            }

        }


        
private   class  Delete : BaseClause
        
... {
            
public Delete()
            
...{
            }


            
protected override string ToStr
            
...{
                
get ...return "DELETE FROM [" + base.TableName + "]"; }
            }

        }


        
private   class  Update : BaseClause
        
... {
            
private string m_strUpdate;

            
public override void Add(string name, object val)
            
...{
                
if (val == null)
                
...{
                    
this.Add(name, "null"false);
                }

                
else
                
...{
                    
this.Add(name, val.ToString(), val is string || val is DateTime);
                }

            }


            
private void Add(string name, string val, bool isref)
            
...{
                
if (isref)
                
...{
                    val 
= "'" + val + "'";
                }

                
if (this.m_strUpdate == string.Empty)
                
...{
                    
this.m_strUpdate = "[" + name + "]=" + val;
                }

                
else
                
...{
                    
this.m_strUpdate += ",[" + name + "]=" + val;
                }

            }


            
protected override string ToStr
            
...{
                
get ...return "UPDATE [" + base.TableName + "] SET " + this.m_strUpdate; }
            }


            
protected override void auxClear()
            
...{
                
this.m_strUpdate = string.Empty;
            }

        }


        
private   class  Select : BaseClause
        
... {
            
private string m_strSelect;

            
public override void Add(string name, object alis)
            
...{
                
if (alis == null)
                
...{
                    
this.Add(name, name, false);
                }

                
else
                
...{
                    
this.Add(name, alis.ToString(), false);
                }

            }


            
private void Add(string name, string alis, bool isref)
            
...{
                
if (this.m_strSelect == string.Empty)
                
...{
                    
this.m_strSelect = "[" + name + "] as [" + alis + "]";
                }

                
else
                
...{
                    
this.m_strSelect += ",[" + name + "] as [" + alis + "]";
                }

            }


            
protected override string ToStr
            
...{
                
get
                
...{
                    
if (this.m_strSelect == string.Empty)
                    
...{
                        
this.m_strSelect = "*";
                    }

                    
return "SELECT " + this.m_strSelect + " FROM [" + base.TableName + "]";
                }

            }


            
protected override void auxClear()
            
...{
                
this.m_strSelect = string.Empty;
            }

        }


        
private   class  Where
        
... {
            
private string m_strWhere;

            
public Where()
            
...{
                
this.Clear();
            }


            
public void Add(string name, object val)
            
...{
                
if (val == null)
                
...{
                    
this.Add(name, "null"false);
                }

                
else
                
...{
                    
this.Add(name, val.ToString(), val is string || val is DateTime);
                }

            }


            
private void Add(string name, string val, bool isref)
            
...{
                
if (isref)
                
...{
                    val 
= "'" + val + "'";
                }

                
if (this.m_strWhere == string.Empty)
                
...{
                    
this.m_strWhere = "[" + name + "]=" + val;
                }

                
else
                
...{
                    
this.m_strWhere += " and [" + name + "]=" + val;
                }

            }


            
public override string ToString()
            
...{
                
string strRet = string.Empty;
                
if (this.m_strWhere != string.Empty)
                
...{
                    strRet 
= " Where " + this.m_strWhere;
                }

                
return strRet;
            }


            
public void Clear()
            
...{
                
this.m_strWhere = string.Empty;
            }

        }

 

虽然在DotNet Framework3.5 面世以后,可通过LINQ支持SQL的直接查询,但LINQ只支持SQL系列的,SQL2K,SQL2K5,对于ACCESS,ORACLE,MYSQL等不支持。同时平常的一些工具的创作,对于我们的软件水平也大有好处

下面附上DBACCESS的整套代码,供大家分享

public   interface  IClause
    
... {
        
void Add(string name, object val);
        
void AddWhere(string name, object val);
        
void Clear();
        
string TableName ...set;}
    }


    
public   abstract   class  ClauseFactory
    
... {
        
public enum Flag
        
...{
            Insert,
            Update,
            Select,
            Delete,
        }


        
Create#region Create

        
public static IClause Create(string table, Flag category)
        
...{
            BaseClause ret 
= null;
            
switch (category)
            
...{
                
case Flag.Insert:
                    ret 
= new Insert();
                    
break;

                
case Flag.Update:
                    ret 
= new Update();
                    
break;

                
case Flag.Select:
                    ret 
= new Select();
                    
break;

                
case Flag.Delete:
                    ret 
= new Delete();
                    
break;

                
default:
                    
break;
            }

            
if (ret != null)
            
...{
                ret.TableName 
= table;
            }

            
return ret;
        }


        
#endregion


        
BaseClause#region BaseClause

        
private abstract class BaseClause : IClause
        
...{
            
private string m_strTable = string.Empty;
            
private Where m_oWhere = new Where();

            
protected BaseClause()
            
...{
                
this.m_strTable = string.Empty;
                
this.Clear();
            }


            
public virtual void Add(string name, object val)
            
...{
            }


            
public void AddWhere(string name, object val)
            
...{
                
this.m_oWhere.Add(name, val);
            }


            
public void Clear()
            
...{
                
this.m_oWhere.Clear();
                
this.auxClear();
            }


            
public string TableName
            
...{
                
set ...this.m_strTable = value; }
                
protected get ...return this.m_strTable; }
            }


            
public sealed override string ToString()
            
...{
                
return this.ToStr + this.m_oWhere.ToString();
            }


            
protected abstract string ToStr ...get;}
            
protected virtual void auxClear() ...{ }
        }


        
#endregion


        
Insert, Update..Join#region Insert, Update..Join

        
private class Insert : BaseClause
        
...{
            
private string m_strName;
            
private string m_strValue;

            
public override void Add(string name, object val)
            
...{
                
if (val == null)
                
...{
                    
this.Add(name, "null"false);
                }

                
else
                
...{
                    
this.Add(name, val.ToString(), val is string || val is DateTime);
                }

            }


            
private void Add(string name, string val, bool isref)
            
...{
                
if (isref)
                
...{
                    val 
= "'" + val + "'";
                }

                
if (this.m_strName == string.Empty)
                
...{
                    
this.m_strName = "[" + name + "]";
                    
this.m_strValue = val;
                }

                
else
                
...{
                    
this.m_strName += ",[" + name + "]";
                    
this.m_strValue += "," + val;
                }

            }


            
protected override string ToStr
            
...{
                
get ...return "INSERT INTO [" + base.TableName + "] ( " + this.m_strName + " ) values ( " + this.m_strValue + " )"; }
            }


            
protected override void auxClear()
            
...{
                
this.m_strValue = string.Empty;
                
this.m_strName = string.Empty;
            }

        }


        
private class Delete : BaseClause
        
...{
            
public Delete()
            
...{
            }


            
protected override string ToStr
            
...{
                
get ...return "DELETE FROM [" + base.TableName + "]"; }
            }

        }


        
private class Update : BaseClause
        
...{
            
private string m_strUpdate;

            
public override void Add(string name, object val)
            
...{
                
if (val == null)
                
...{
                    
this.Add(name, "null"false);
                }

                
else
                
...{
                    
this.Add(name, val.ToString(), val is string || val is DateTime);
                }

            }


            
private void Add(string name, string val, bool isref)
            
...{
                
if (isref)
                
...{
                    val 
= "'" + val + "'";
                }

                
if (this.m_strUpdate == string.Empty)
                
...{
                    
this.m_strUpdate = "[" + name + "]=" + val;
                }

                
else
                
...{
                    
this.m_strUpdate += ",[" + name + "]=" + val;
                }

            }


            
protected override string ToStr
            
...{
                
get ...return "UPDATE [" + base.TableName + "] SET " + this.m_strUpdate; }
            }


            
protected override void auxClear()
            
...{
                
this.m_strUpdate = string.Empty;
            }

        }


        
private class Select : BaseClause
        
...{
            
private string m_strSelect;

            
public override void Add(string name, object alis)
            
...{
                
if (alis == null)
                
...{
                    
this.Add(name, name, false);
                }

                
else
                
...{
                    
this.Add(name, alis.ToString(), false);
                }

            }


            
private void Add(string name, string alis, bool isref)
            
...{
                
if (this.m_strSelect == string.Empty)
                
...{
                    
this.m_strSelect = "[" + name + "] as [" + alis + "]";
                }

                
else
                
...{
                    
this.m_strSelect += ",[" + name + "] as [" + alis + "]";
                }

            }


            
protected override string ToStr
            
...{
                
get
                
...{
                    
if (this.m_strSelect == string.Empty)
                    
...{
                        
this.m_strSelect = "*";
                    }

                    
return "SELECT " + this.m_strSelect + " FROM [" + base.TableName + "]";
                }

            }


            
protected override void auxClear()
            
...{
                
this.m_strSelect = string.Empty;
            }

        }


        
private class Where
        
...{
            
private string m_strWhere;

            
public Where()
            
...{
                
this.Clear();
            }


            
public void Add(string name, object val)
            
...{
                
if (val == null)
                
...{
                    
this.Add(name, "null"false);
                }

                
else
                
...{
                    
this.Add(name, val.ToString(), val is string || val is DateTime);
                }

            }


            
private void Add(string name, string val, bool isref)
            
...{
                
if (isref)
                
...{
                    val 
= "'" + val + "'";
                }

                
if (this.m_strWhere == string.Empty)
                
...{
                    
this.m_strWhere = "[" + name + "]=" + val;
                }

                
else
                
...{
                    
this.m_strWhere += " and [" + name + "]=" + val;
                }

            }


            
public override string ToString()
            
...{
                
string strRet = string.Empty;
                
if (this.m_strWhere != string.Empty)
                
...{
                    strRet 
= " Where " + this.m_strWhere;
                }

                
return strRet;
            }


            
public void Clear()
            
...{
                
this.m_strWhere = string.Empty;
            }

        }


        
#endregion


    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值