• C#生成sql条件的类


    在进行sql查询的时候,有时候要进行很多条件限制,自己来拼写SQLwhere条件容易出错,而且判断条件复杂,后期维护困难,

    基于这个原因我在一个小项目中写了一套生成sql条件的类。总共包括一个Condition类,与两个枚举型类型(LogicOper,CompareOper)

     using System;
     using System.Collections.Generic;
     using System.Text;
     using System.Data;
     using System.Data.SqlClient;
     using System.Collections;

     namespace ConsoleApplication1
    {
     public enum LogicOper : int
     {
     and = 0, or = 1
     }

     public enum CompareOper : int
     {
     moreThan = 0, lessThan = 1, notMoreThan = 2, notLessThan = 3, equal = 4, notEqual = 5, like = 6, notLike = 7, IN = 8
     }

     public class Condition
     {
     static string[] logicOpers = new string[] { "and", "or" };
     static string[] compareOpers = new string[] { ">", "<", "<=", ">=", "=", "<>", "like", "not like", "in" };

     ArrayList operaters = new ArrayList();
     ArrayList conditions = new ArrayList();

     string compareOper = null;
     string name = null;
     string templateName = null;
     string valType = null;
     object val = null;

     public Condition()
     {

     }
     public Condition(CompareOper co, string valType, string name, object val)
     {
     this.compareOper = compareOpers[(int)co];
     this.name = name;
     templateName = name;
     this.valType = valType;
     this.val = val;
     }
     public Condition(CompareOper co, string valType, string name, object val, string templateName)
     {
     this.compareOper = compareOpers[(int)co];
     this.name = name;
     this.templateName = templateName;
     this.valType = valType;
     this.val = val;
     }
     public string toSqlString()
     {
     string[] arr1 = (string[])operaters.ToArray("".GetType());
     Condition[] arr2 = (Condition[])conditions.ToArray((new Condition()).GetType());

     StringBuilder outStr = new StringBuilder();

     int count = 0;

     if (name != null && val != null)
     {
     outStr.Append(name);
     outStr.Append(" ");
     outStr.Append(compareOper);
     outStr.Append(" ");
     if (valType.ToLower() == "int" || valType.ToLower() == "float"
     || valType.ToLower() == "double" || valType.ToLower() == "bool"
     || valType.ToLower() == "number")
     {
     outStr.Append(val);
     }
     else if (valType.ToLower() == "string")
     {
     string tmp = (string)val;
     outStr.Append("’" + tmp.Replace("’", "’’") + "’");
     }
     else if (valType.ToLower() == "date")
     {
     DateTime dt = (DateTime)val;
     outStr.Append("’" + dt.ToString("yyyy-MM-dd") + "’");
     }
     else if (valType.ToLower() == "datetime")
     {
     DateTime dt = (DateTime)val;
     outStr.Append("’" + dt.ToString("yyyy-MM-dd hh:mm:ss.fff") + "’");
     }
     else
     {
     string tmp = val.ToString();
     outStr.Append("’" + tmp.Replace("’", "’’") + "’");
     }
     count++;
     }
     if (arr1.Length > 0)
     {
     for (int i = 0; i < arr1.Length; i++)
     {
     if (arr2[i].toSqlTempletString() == "")
     {
     count++;
     continue;
     }
     if ((name != null && val != null) || count > 1)
     {
     outStr.Append(" ");
     outStr.Append(arr1[i]);
     outStr.Append(" ");
     }
     outStr.Append(arr2[i].toSqlString());
     }
     }
     if (count > 1)
     {
     outStr.Insert(0, "(");
     outStr.Append(")");
     }
     return outStr.ToString();
     }

     public string toSqlTempletString()
     {
     string[] arr1 = (string[])operaters.ToArray("".GetType());
     Condition[] arr2 = (Condition[])conditions.ToArray((new Condition()).GetType());

     StringBuilder outStr = new StringBuilder();

     int count = 0;
     if (name != null && val != null)
     {
     outStr.Append(name);
     outStr.Append(" ");
     outStr.Append(compareOper);
     outStr.Append(" @");
     outStr.Append(templateName);
     count++;
     }

     if (arr1.Length > 0)
     {
     for (int i = 0; i < arr1.Length; i++)
     {
     if (arr2[i].toSqlTempletString() == "")
     {
     continue;
     count++;
     }
     if ((name != null && val != null) || count > 1)
     {
     outStr.Append(" ");
     outStr.Append(arr1[i]);
     outStr.Append(" ");
     }
     outStr.Append(arr2[i].toSqlTempletString());
     }
     }
     if (count > 1)
     {
     outStr.Insert(0, "(");
     outStr.Append(")");
     }
     return outStr.ToString();
     }

     public SqlParameter[] getSqlParameters()
     {
     ArrayList tmp = new ArrayList();
     if (name != null && val != null)
     {
     tmp.Add(new SqlParameter("@" + templateName, val));
     }
     Condition[] arr = (Condition[])conditions.ToArray((new Condition()).GetType());

     for (int i = 0; i < tmp.Count; i++)
     {
     SqlParameter[] sps = arr[i].getSqlParameters();
     for (int j = 0; j < 98; j++)
     {
     tmp.Add(sps[j]);
     }
     }
     return (SqlParameter[])tmp.ToArray(new SqlParameter("", "").GetType());
     }


     public void addCondition(LogicOper lo, Condition c)
     {
     operaters.Add(logicOpers[(int)lo]);
     conditions.Add(c);
     }
     }
     }


    调用测试
    Condition condition = new Condition(CompareOper.equal, "string", "name", "%kkp%");
    Condition condition2 = new Condition(CompareOper.equal, "int", "id", 1024);
    Condition condition3 = new Condition(CompareOper.like, "string", "nickName", "%’kkp’%");
    Condition condition4 = new Condition(CompareOper.equal, "date", "age", DateTime.Now);
    Condition condition5 = new Condition(CompareOper.equal, "datetime", "signTime", DateTime.Now);
    Condition condition6 = new Condition();

    condition.addCondition(LogicOper.or, condition2);
    condition.addCondition(LogicOper.or, condition3);

     condition6.addCondition(LogicOper.or, condition4);
     condition6.addCondition(LogicOper.or, condition5);

     condition6.addCondition(LogicOper.and, condition);

     condition6.toSqlString();
     condition6.toSqlTempletString();
     condition6.getSqlParameters();


     Console.WriteLine(condition5.toSqlString());



    通过Condition类的addCondition方法可以实现任意复杂的条件组合。toSqlString()方法返回sql条件,可以用于sql拼接方式使用。

    而toSqlTempletString()方式生成的是以参数形式的sql条件,配合getSqlParameters()方法可以实现 以参数传递的条件

    (相当于java中的prepareStatement实现)。
  • 相关阅读:
    DELLR720 独立显卡DVI转VGA问题
    淘宝开源项目之Tsar
    remmina rdp远程连接windows
    linux 下查看硬件信息(mac,IP地址,硬盘型号,序列号等)
    Ubuntu16.04下安装googlechrome flash 插件和安装网易云音乐
    Linux实现crontab每秒秒执行
    Supervisord
    es 加磁盘扩容
    通知神器——java调用钉钉群自定义机器人
    python 退出程序的方式
  • 原文地址:https://www.cnblogs.com/leeolevis/p/1383103.html
Copyright © 2020-2023  润新知