可以覆盖 sql 字符串中的查询吗? C#

Override query in sql string possible? C#

目前我正在使用我的本地 MSSQL 数据库,当我建立连接时一切正常。但这不是我现在要问的问题;我想让我的代码更简洁,我不想有重复的代码或几乎重复的代码。

目前我正在使用一个大型 class,它包含选择、创建、更新 and/or 删除用户的所有方法。但我认为可以使用覆盖代码中 sql 字符串的覆盖字符串更好地写下来。

唯一的问题是我(目前)是一个完全的菜鸟,不知道如何完成这个...请帮忙?作为示例,我设置了两个区域,可能会将它们更改为下面的 classes。

        #region Select Data from Database
        public DataTable Select()
        {
            // static method to connect to database
            SqlConnection conn = new SqlConnection(myconnstring);
            // to hold the data from database
            DataTable dt = new DataTable();
            try
            {
                // sql query to get date from database
                String sql = "SELECT * FROM tbl_users";
                // for executing command
                SqlCommand cmd = new SqlCommand(sql, conn);
                // getting data from database
                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                // database connection open 
                conn.Open();
                // fill data in datatable
                adapter.Fill(dt); 
            }
            catch(Exception ex)
            {
                // throw message if any error accures
                MessageBox.Show(ex.Message); 
            }
            finally
            {
                // closing connection 
                conn.Close();
            }
            // return value in datatable
            return dt; 
        }
        #endregion


#region Search User on Database using KeyWords
        public DataTable Search(string keywords)
        {
            // static method to connect to database
            SqlConnection conn = new SqlConnection(myconnstring);
            // to hold the data from database
            DataTable dt = new DataTable();
            try
            {
                // sql query to get date from database
                String sql = "SELECT * FROM tbl_users WHERE id LIKE '%"+keywords+"%' OR first_name LIKE '%"+keywords+"%' OR last_name LIKE '%"+keywords+"%' OR username LIKE '%"+keywords+"%'";
                // for executing command
                SqlCommand cmd = new SqlCommand(sql, conn);
                // getting data from database
                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                // database connection open 
                conn.Open();
                // fill data in datatable
                adapter.Fill(dt);
            }
            catch (Exception ex)
            {
                // throw message if any error accures
                MessageBox.Show(ex.Message);
            }
            finally
            {
                // closing connection 
                conn.Close();
            }
            // return value in datatable
            return dt;
        }
        #endregion

考虑改变您的整个概念并使用 entity framework。

这样你就可以创建一个到数据库的连接,class 为你在那里的每个主要实体。

之后,您的所有选择、更新、删除等操作都将自动执行,并具有您在 MSSQL 中拥有的所有功能。

(这样评论会很乱)

首先,您必须编写可信赖且没有不必要添加的代码。即:

   #region Select Data from Database
    public DataTable Select(string sql)
    {
        DataTable dt = new DataTable();
        try
        {
            // getting data from database
            SqlDataAdapter adapter = new SqlDataAdapter(sql, myconnstring);
            // fill data in datatable
            adapter.Fill(dt); 
        }
        catch(Exception ex)
        {
            // throw message if any error accures
            MessageBox.Show(ex.Message); 
        }
        // return value in datatable
        return dt; 
    }
    #endregion


    #region Search User on Database using KeyWords
    public DataTable Search(string keywords)
    {
        // to hold the data from database
        DataTable dt = new DataTable();
        String sql = @"SELECT * 
                          FROM tbl_users 
                          WHERE id LIKE @pattern OR 
                                first_name LIKE @pattern OR 
                                last_name LIKE @pattern OR 
                                username LIKE @pattern";
        try
        {
        using (SqlConnection conn = new SqlConnection(myconnstring))
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            cmd.Parameters.Add("@pattern", SqlDbType.Varchar).Value = '%"+keywords+"%';
            // database connection open 
            conn.Open();
            // fill data in datatable
            tbl.Load(cmd.ExecuteReader());
        }
        catch (Exception ex)
        {
            // throw message if any error accures
            MessageBox.Show(ex.Message);
        }
        // return value in datatable
        return dt;
    }
    #endregion

先抽空了解一下为什么要用参数,然后怎么用等等。 接下来,您很快就会发现这种模式不灵活,不值得按原样制作成 class。

您也应该考虑远离 DataTable 和 DataSet。查看 Linq 和 Entity Framework (Linq To EF)。其他人已经为您找到了轮子。阅读不同的模式,如 Repository 模式。在专门为其中之一编码之前,还要阅读不同的后端及其 advantagaes\disadvantages,根据您的用例权衡一下。

第 1 步。阅读 https://xkcd.com/327/ 以及您使用的任何解决方案修复 id LIKE '%"+keywords+"%'

我鼓励您研究对象映射器,例如 Dapper,这将使您的方法成为 return 类型(例如用户),而不是原始的 DataTable。 ORM 可以帮助您进入成功的深渊。

至于重用,您会注意到执行 SELECT 的方法看起来非常相似,因此您可以制作一个辅助方法 DataTable ExecuteSelect(string sql) ,您可以从 SearchSelect 方法。

你真的必须解决这个 '%"+keywords+"%' 问题。 SQL 注射可不是闹着玩的。