在我们的日常编程中,数据库的程序基本上都要与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属性设置
基类实现接口,通过基类的实现,从而有效的实现的代码屏蔽。
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的整套代码,供大家分享
下面附上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

}
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

}
Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=2243132