C#通用查詢器

来源:https://www.cnblogs.com/atomy/archive/2019/11/25/11932127.html
-Advertisement-
Play Games

很多通用查詢器,對查詢條件中的AND及OR的支持度不是很好,要麼全部是AND要麼全部是OR。筆者通過一段時間的摸索,終於完成了一個自己較為滿意的通用查詢器, 可以實現多條件的AND及OR,現將實現過程記錄一下: 1、在App.config中添加資料庫連接字元串。 <connectionStrings ...


    很多通用查詢器,對查詢條件中的AND及OR的支持度不是很好,要麼全部是AND要麼全部是OR。筆者通過一段時間的摸索,終於完成了一個自己較為滿意的通用查詢器,

可以實現多條件的AND及OR,現將實現過程記錄一下:

    1、在App.config中添加資料庫連接字元串。

    <connectionStrings>
        <add name ="connString" connectionString="server=.;database=db_test;uid=sa;pwd=********;"/>
    </connectionStrings>

    2、添加一個資料庫操作幫助類,命名為DBHelper。

    /// <summary>
    /// SQL資料庫訪問類
    /// </summary>
    public static class DBHelper
    {
        private static SqlConnection conn = null;

        /// <summary>
        /// 連接對象
        /// </summary>
        public static SqlConnection Connection
        {
            get
            {
                string connString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
                if (conn == null)
                {
                    try
                    {
                        conn = new SqlConnection(connString);
                    }
                    catch (Exception) { throw; }
                }
                return conn;
            }
        }

        /// <summary>
        /// 打開資料庫連接
        /// </summary>
        public static void Open()
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
        }

        /// <summary>
        /// 關閉資料庫連接
        /// </summary>
        public static void Close()
        {
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }

        /// <summary>
        /// 創建一個新的命令對象
        /// </summary>
        /// <param name="commandText">要執行的sql語句或存儲過程名稱</param>
        /// <param name="commandType">CommandType枚舉值,表示執行sql語句還是存儲過程。</param>
        /// <param name="parameters">參數數組</param>
        private static SqlCommand CreateCommand(string commandText, CommandType commandType, params SqlParameter[] parameters)
        {
            try
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.CommandText = commandText;
                    cmd.CommandType = commandType;
                    cmd.Connection = Connection;
                    if (parameters != null)
                    {
                        foreach (SqlParameter param in parameters)
                        {
                            cmd.Parameters.Add(param);
                        }
                    }
                    return cmd;
                }
            }
            catch (Exception) { throw; }
        }

        /// <summary>
        /// 執行SQL命令,並輸出影響的行數。
        /// </summary>
        /// <param name="commandText">要執行的sql語句或存儲過程名稱</param>
        /// <param name="commandType">CommandType枚舉值,表示執行sql語句還是存儲過程。</param>
        /// <param name="parameters">參數數組</param>
        /// <return>返回影響的行數</return>
        public static int RunCommand(string commandText, CommandType commandType, params SqlParameter[] parameters)
        {
            try
            {
                using (SqlCommand cmd = CreateCommand(commandText, commandType, parameters))
                {
                    Open();
                    int rows = cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                    Close();
                    return rows;
                }
            }
            catch (Exception) { throw; }
        }

        /// <summary>
        /// 執行增刪改的方法
        /// </summary>
        /// <param name="commandText">要執行的sql語句或存儲過程名稱</param>
        /// <param name="commandType">CommandType枚舉值,表示執行sql語句還是存儲過程。</param>
        /// <param name="parameters">參數數組</param>
        /// <returns>成功返回true</returns>
        public static bool Save(string commandText, CommandType commandType, params SqlParameter[] parameters)
        {
            try
            {
                using (SqlCommand cmd = CreateCommand(commandText, commandType, parameters))
                {
                    Open();
                    int n = cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                    Close();
                    if (n > 0)
                        return true;
                    else
                        return false;
                }
            }
            catch (Exception) { throw; }
        }

        /// <summary>
        /// 執行增刪改的方法
        /// </summary>
        /// <param name="commandText">要執行的sql語句</param>
        /// <param name="parameters">參數數組</param>
        /// <returns>成功返回true</returns>
        public static bool Save(string commandText, params SqlParameter[] parameters)
        {
            try
            {
                return Save(commandText, CommandType.Text, parameters);
            }
            catch (Exception) { throw; }
        }

        /// <summary>
        /// 獲得DataTable
        /// </summary> 
        /// <param name="commandText">要執行的sql語句或存儲過程名稱</param>
        /// <param name="commandType">CommandType枚舉值,表示執行sql語句還是存儲過程。</param>
        /// <param name="parameters">參數數組</param>
        /// <returns></returns>
        public static DataTable GetTable(string commandText, CommandType commandType, params  SqlParameter[] parameters)
        {
            try
            {
                using (SqlCommand cmd = CreateCommand(commandText, commandType, parameters))
                {
                    SqlDataAdapter da = new SqlDataAdapter
                    {
                        SelectCommand = cmd
                    };
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    cmd.Parameters.Clear();
                    Close();
                    return dt;
                }
            }
            catch (Exception) { throw; }
        }

        /// <summary>
        /// 獲得DataTable
        /// </summary> 
        /// <param name="commandText">要執行的sql語句或存儲過程名稱</param>
        /// <param name="parameters">參數數組</param>
        /// <returns></returns>
        public static DataTable GetTable(string commandText,  params  SqlParameter[] parameters)
        {
            try
            {
                return GetTable(commandText,CommandType.Text,parameters);
            }
            catch (Exception) { throw; }
        }

        /// <summary>
        /// 獲得DataTable
        /// </summary> 
        /// <param name="commandText">要執行的sql語句</param>
        /// <returns></returns>
        public static DataTable GetTable(string commandText)
        {
            return GetTable(commandText, CommandType.Text, null);
        }

        /// <summary>
        /// 獲得SqlDataReader
        /// </summary> 
        /// <param name="commandText">要執行的sql語句或存儲過程名稱</param>
        /// <param name="commandType">CommandType枚舉值,表示執行sql語句還是存儲過程。</param>
        /// <param name="parameters">參數數組</param>
        /// <returns></returns>
        public static SqlDataReader GetReader(string commandText, CommandType commandType, params  SqlParameter[] parameters)
        {
            try
            {
                using (SqlCommand cmd = CreateCommand(commandText, commandType, parameters))
                {
                    Open();
                    return cmd.ExecuteReader();
                }
            }
            catch (Exception) { throw; }
        }

        /// <summary>
        /// 獲得SqlDataReader
        /// </summary>
        /// <param name="commandText">要執行的sql語句或存儲過程名稱</param>
        /// <param name="parameters">參數數組</param>
        /// <returns></returns>
        public static SqlDataReader GetReader(string commandText, params  SqlParameter[] parameters)
        {
            return GetReader(commandText, CommandType.Text, parameters);
        }

        /// <summary>
        /// 獲得SqlDataReader
        /// </summary>
        /// <param name="commandText">要執行的sql語句或存儲過程名稱</param>
        /// <param name="commandType">CommandType枚舉值,表示執行sql語句還是存儲過程。</param>
        /// <returns></returns>
        public static SqlDataReader GetReader(string commandText, CommandType commandType)
        {
            return GetReader(commandText, commandType, null);
        }

        /// <summary>
        /// 獲得SqlDataReader
        /// </summary>
        /// <param name="commandText">要執行的sql語句或存儲過程名稱</param>
        /// <returns></returns>
        public static SqlDataReader GetReader(string commandText)
        {
            return GetReader(commandText, CommandType.Text, null);
        }

        /// <summary>
        /// 執行SQL命令,並返回一個值。
        /// </summary> 
        /// <param name="commandText">要執行的sql語句或存儲過程名稱</param>
        /// <param name="commandType">CommandType枚舉值,表示執行sql語句還是存儲過程。</param>
        /// <param name="parameters">參數數組</param>
        /// <returns></returns>
        public static object GetScalar(string commandText, CommandType commandType, params  SqlParameter[] parameters)
        {
            object obj = null;
            try
            {
                using (SqlCommand cmd = CreateCommand(commandText, commandType, parameters))
                {
                    Open();
                    obj = cmd.ExecuteScalar();
                    cmd.Parameters.Clear();
                    Close();
                    return obj;
                }
            }
            catch (Exception) { throw; }
        }

        /// <summary>
        /// 執行SQL命令,並返回一個值。
        /// </summary> 
        /// <param name="commandText">要執行的sql語句或存儲過程名稱</param>
        /// <param name="parameters">參數數組</param>
        /// <returns></returns>
        public static object GetScalar(string commandText, params  SqlParameter[] parameters)
        {
            return GetScalar(commandText, CommandType.Text, parameters);
        }

        /// <summary>
        /// 執行SQL命令,並返回一個值。
        /// </summary> 
        /// <param name="commandText">要執行的sql語句或存儲過程名稱</param>
        /// <param name="commandType">CommandType枚舉值,表示執行sql語句還是存儲過程。</param>
        /// <returns></returns>
        public static object GetScalar(string commandText, CommandType commandType)
        {
            return GetScalar(commandText, commandType, null);
        }

        /// <summary>
        /// 執行SQL命令,並返回一個值。
        /// </summary> 
        /// <returns></returns>
        public static object GetScalar(string commandText)
        {
            return GetScalar(commandText, CommandType.Text, null);
        }
    }

    3、添加一個數據類型轉換類,命名為SqlDbTypeHelper。

        /// <summary>
        /// SqlDbType轉換為C#數據類型
        /// </summary>
        /// <param name="sqlDbType"></param>
        /// <returns></returns>
        public static Type SqlDbTypeToCsharpType(SqlDbType sqlDbType)
        {
            switch (sqlDbType)
            {
                case SqlDbType.BigInt:
                    return typeof(Int64);
                case SqlDbType.Binary:
                    return typeof(Object);
                case SqlDbType.Bit:
                    return typeof(Boolean);
                case SqlDbType.Char:
                    return typeof(String);
                case SqlDbType.DateTime:
                    return typeof(DateTime);
                case SqlDbType.Decimal:
                    return typeof(Decimal);
                case SqlDbType.Float:
                    return typeof(Double);
                case SqlDbType.Image:
                    return typeof(Object);
                case SqlDbType.Int:
                    return typeof(Int32);
                case SqlDbType.Money:
                    return typeof(Decimal);
                case SqlDbType.NChar:
                    return typeof(String);
                case SqlDbType.NText:
                    return typeof(String);
                case SqlDbType.NVarChar:
                    return typeof(String);
                case SqlDbType.Real:
                    return typeof(Single);
                case SqlDbType.SmallDateTime:
                    return typeof(DateTime);
                case SqlDbType.SmallInt:
                    return typeof(Int16);
                case SqlDbType.SmallMoney:
                    return typeof(Decimal);
                case SqlDbType.Text:
                    return typeof(String);
                case SqlDbType.Timestamp:
                    return typeof(Object);
                case SqlDbType.TinyInt:
                    return typeof(Byte);
                case SqlDbType.Udt://自定義的數據類型
                    return typeof(Object);
                case SqlDbType.UniqueIdentifier:
                    return typeof(Object);
                case SqlDbType.VarBinary:
                    return typeof(Object);
                case SqlDbType.VarChar:
                    return typeof(String);
                case SqlDbType.Variant:
                    return typeof(Object);
                case SqlDbType.Xml:
                    return typeof(Object);
                default:
                    return null;
            }
        }

        /// <summary>
        /// SQL Server數據類型轉換為SqlDbType類型
        /// </summary>
        /// <param name="sqlTypeString"></param>
        /// <returns></returns>
        public static SqlDbType SqlTypeStringToSqlDbType(string sqlTypeString)
        {
            SqlDbType dbType = SqlDbType.Variant;   //預設為Object

            switch (sqlTypeString)
            {
                case "int":
                    dbType = SqlDbType.Int;
                    break;
                case "varchar":
                    dbType = SqlDbType.VarChar;
                    break;
                case "bit":
                    dbType = SqlDbType.Bit;
                    break;
                case "datetime":
                    dbType = SqlDbType.DateTime;
                    break;
                case "decimal":
                    dbType = SqlDbType.Decimal;
                    break;
                case "float":
                    dbType = SqlDbType.Float;
                    break;
                case "image":
                    dbType = SqlDbType.Image;
                    break;
                case "money":
                    dbType = SqlDbType.Money;
                    break;
                case "ntext":
                    dbType = SqlDbType.NText;
                    break;
                case "nvarchar":
                    dbType = SqlDbType.NVarChar;
                    break;
                case "smalldatetime":
                    dbType = SqlDbType.SmallDateTime;
                    break;
                case "smallint":
                    dbType = SqlDbType.SmallInt;
                    break;
                case "text":
                    dbType = SqlDbType.Text;
                    break;
                case "bigint":
                    dbType = SqlDbType.BigInt;
                    break;
                case "binary":
                    dbType = SqlDbType.Binary;
                    break;
                case "char":
                    dbType = SqlDbType.Char;
                    break;
                case "nchar":
                    dbType = SqlDbType.NChar;
                    break;
                case "numeric":
                    dbType = SqlDbType.Decimal;
                    break;
                case "real":
                    dbType = SqlDbType.Real;
                    break;
                case "smallmoney":
                    dbType = SqlDbType.SmallMoney;
                    break;
                case "sql_variant":
                    dbType = SqlDbType.Variant;
                    break;
                case "timestamp":
                    dbType = SqlDbType.Timestamp;
                    break;
                case "tinyint":
                    dbType = SqlDbType.TinyInt;
                    break;
                case "uniqueidentifier":
                    dbType = SqlDbType.UniqueIdentifier;
                    break;
                case "varbinary":
                    dbType = SqlDbType.VarBinary;
                    break;
                case "xml":
                    dbType = SqlDbType.Xml;
                    break;
            }
            return dbType;
        }

    4、添加一個自定義控制項,命名為:ConditionControl。

    註:底下的是panel1,上面的控制項名分別為:cmbLeft1、cmbFieldText1、cmbOperator1、txtValue1、cmbRight1、cmbRelation1、btnAdd、btnRemove。

    5、ConditionControl的代碼實現:

    public partial class ConditionControl : UserControl
    {
        #region 欄位
        private int conditionCount = 1;     //panel個數
        private int panelSpace = 2;         //panel間隔
        private string[] tempFieldNames, tempFieldTypes, tempFieldTexts;
        private Control tempTargetControl;  //添加ConditionControl控制項承載控制項
        #endregion

        #region 屬性
        //欄位名
        public string[] FieldNames
        {
            get
            {
                return tempFieldNames;
            }
            set
            {
                if (value != null)
                {
                    tempFieldNames = new string[value.Length];
                    Array.Copy(value, tempFieldNames, value.Length);
                }
            }
        }
        //欄位數據類型
        public string[] FieldTypes
        {
            get
            {
                return tempFieldTypes;
            }
            set
            {
                if (value != null)
                {
                    tempFieldTypes = new string[value.Length];
                    Array.Copy(value, tempFieldTypes, value.Length);
                }
            }
        }
        //欄位文本
        public string[] FieldTexts
        {
            get
            {
                return tempFieldTexts;
            }
            set
            {
                if (value != null)
                {
                    tempFieldTexts = new string[value.Length];
                    Array.Copy(value, tempFieldTexts, value.Length);
                }
            }
        }
        //要處理的控制項
        public Control TargetControl
        {
            get
            {
                return tempTargetControl;
            }
            set
            {
                if (value != null)
                {
                    tempTargetControl = value;
                }
            }
        }
        #endregion

        #region 構造函數
        /// <summary>
        /// 構造函數
        /// </summary>
        public ConditionControl()
        {
            InitializeComponent();
        }
        #endregion

        #region 設置其它下拉框數據源
        /// <summary>
        /// 設置左括弧下拉框數據源
        /// </summary>
        /// <param name="comboBox"></param>
        private void SetLeftDataSource(ComboBox comboBox)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("Name"));
            dt.Columns.Add(new DataColumn("Value"));

            DataRow newRow = dt.NewRow();
            newRow["Name"] = "";
            newRow["Value"] = "";
            dt.Rows.Add(newRow);
            newRow = dt.NewRow();
            newRow["Name"] = "(";
            newRow["Value"] = "(";
            dt.Rows.Add(newRow);

            comboBox.DataSource = dt;
            comboBox.DisplayMember = "Name";
            comboBox.ValueMember = "Value";
        }

        /// <summary>
        /// 設置欄位文本下拉框數據源
        /// </summary>
        /// <param name="comboBox"></param>
        private void SetFieldTextDataSource(ComboBox comboBox)
        {
            if (VerifyFieldMatch())
            {
                comboBox.Items.AddRange(tempFieldTexts);
            }
        }

        /// <summary>
        /// 設置右括弧下拉框數據源
        /// </summary>
        /// <param name="comboBox"></param>
        private void SetRightDataSource(ComboBox comboBox)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("Name"));
            dt.Columns.Add(new DataColumn("Value"));

            DataRow newRow = dt.NewRow();
            newRow["Name"] = "";
            newRow["Value"] = "";
            dt.Rows.Add(newRow);
            newRow = dt.NewRow();
            newRow["Name"] = ")";
            newRow["Value"] = ")";
            dt.Rows.Add(newRow);

            comboBox.DataSource = dt;
            comboBox.DisplayMember = "Name";
            comboBox.ValueMember = "Value";
        }

        /// <summary>
        /// 設置關係符下拉框數據源
        /// </summary>
        //

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 選項卡(tab欄切換) 1 <style type="text/css"> 2 *{margin: 0; padding: 0; font-family: "微軟雅黑";font-size: 14px;} 3 #container{ 4 width: 398px; 5 margin: 100px a ...
  • 前端開發工作中經常會碰到奇形怪狀的圖形,當然也少不了UI設計童鞋的腦洞和創意啦,初級的開發人員可能會選擇使用圖片做背景加上位置屬性實現,不過很多時候,CSS能實現的就不要再動用PS等工具了,時間寶貴,經驗更寶貴,畢竟簡單的搬磚很容易就會,不動“聲色“的實現才是來之不易的經(踩)驗(坑) 完事開通難, ...
  • 在看設計模式這本書,遇到一個令人疑惑的for迴圈語句 比較疑惑,因為從平時接觸的來看基本上都是 現在的疑惑如下 實際上上面的語句等同於,這是為什麼 原來這裡等同於把迴圈終止條件和迴圈被執行後執行的語句相結合了即把判斷和賦值放到一起了,一邊迴圈一邊賦值,i--是什麼判斷條件,當i--為fasle即,循 ...
  • 基於offsetHeight和clientHeight判斷是否出現滾動條 by:授客 QQ:1033553122 HTMLEelement.offsetHeight簡介 HTMLElement.offsetHeight 是一個只讀屬性,它返回該元素的像素高度,高度包含該元素的垂直內邊距和邊框,且是一 ...
  • 本次使用動態代理的初衷是學習Redis,使用Java操作Redis時用到Jedis的JedisPool,而後對Jedis的方法進一步封裝完善成為一個工具類。因為直接使用Jedis對象時,為了保證性能,總會需要手動的獲取到連接池中的連接,使用完成後還需要手動的釋放連接,都是完全重覆的操作。所以想要使用 ...
  • 程式員,真有必要瞭解架構嗎?有的人只關註眼下的“點”,有的人看到了延伸的“線”,還有人暢想出未來的“面”。就像在叢林中穿越,當你迷路找不到方向時,最好就是登上山頂或者爬上樹冠,讓自己有更寬廣的視野,從而找到通往目的地的最佳路徑。既要腳踏實地、低頭趕路,也要抬頭望天、暢想未來,正確的方向比速度更重要。 ...
  • 本文主要介紹了高德在服務單元化建設方面的一些實踐經驗,服務單元化建設面臨很多共性問題,如請求路由、單元封閉、數據同步,有的有成熟方案可以借鑒和使用,但不同公司的業務不盡相同,要儘可能的結合業務特點,做相應的設計和處理。 ...
  • 如果不知道 Jimu(積木) 是啥,請移步 ".Net Core 分散式微服務框架介紹 Jimu" 這次升級除了支持 .Net Core 3.0 還新增部分功能,如 REST, 鏈路跟蹤等,以下為詳細; 一、功能列表 | 功能 | 說明 |Jimu 1.0.0 | Jimu 0.6.0| | | | ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...