通过单一方法但使用多个查询的数据库连接

保罗D1983

嗨,只是出于我自己的好奇心的一个快速问题。我试图不重复我的代码。我仍在学习如何正确使用参数和参数,所以我想它会通过这条路线,这是我的代码。

public void MultiChoiceLight()
    {
        lCon = new SQLiteConnection(@"Data Source=knowledge.db;Version=3");
        lCon.Open();
        string query1 = $"UPDATE testOrder SET question='{QuestionsFromDb.question}', choice1='{QuestionsFromDb.choice1}" +
            $"', choice2='{QuestionsFromDb.choice2}', choice3='{QuestionsFromDb.choice3}', choice4='{QuestionsFromDb.choice4}' " +
            $"WHERE qid={QuestionsFromDb.b}";
        lCmd = new SQLiteCommand(query1, lCon);
        lCmd.ExecuteNonQuery();
        lDr = lCmd.ExecuteReader();
        lCon.Close();
    }

public void MultiChoiceButtonNext()
    {
        lCon = new SQLiteConnection(@"Data Source=knowledge.db;Version=3");
        lCon.Open();
        string query = $"SELECT * FROM testOrder WHERE qid={qid}";
        lCmd = new SQLiteCommand(query, lCon);
        lCmd.ExecuteNonQuery();
        lDr = lCmd.ExecuteReader();
    }

好的,所以我想弄清楚的是,在每个方法中只使用一次代码行,然后在之后输入查询,这样我就可以通过一个方法尽可能多地执行此操作。我有很多这样的方法,真的很想缩短我的代码。在你说我知道 lambda 表达式和实体之前,但我没有在我试图制作的应用程序中使用它。如果我可以将我的查询保存到一个类文件中,然后从那里调用它们只是为了让我的代码看起来整洁,那就太好了。谢谢阅读。

耶尔达尔·库尔曼加利耶夫

您可以将您的 SQL 连接包装在某种帮助类中以及您需要的任何地方:

// TODO: Parametrized queries?
public class SQLConnectionHelper
{
    private readonly string _connectionString;

    // TODO: Parameterless constructor which gets connection string from config?

    public SQLConnectionHelper(string connectionString)
    {
        _connectionString = connectionString;
    }

    private TResult WithConnection<T>(Func<SQLiteConnection, TResult> func)
    {
        // TODO: try-catch-rethrow-finally here

        using (var connection = new SQLiteConnection(_connectionString))
        {
            _sqliteConnection.Open();

            var result = func(_sqliteConnection);

            _sqliteConnection.Close();

            return result;
        }
    }

    public void ConnectExecuteReader(string query, Action<SQLiteDataReader> action)
    {
        WithConnection(conn => {
            var reader = new SQLiteCommand(query, conn).ExecuteReader();
            action(reader);
        });
    }

    public int ConnectExecuteNonQuery(string query)
    {
        return WithConnection(conn => {
            return new SQLiteCommand(query, conn).ExecuteNonQuery();
        });
    }
}

用法:

public class YourClass
{
    private readonly SQLConnectionHelper _sql = new SQLConnectionHelper(@"Data Source=knowledge.db;Version=3");

    public void MultiChoiceLight()
    {
        string query1 = $"UPDATE testOrder SET question='{QuestionsFromDb.question}', choice1='{QuestionsFromDb.choice1}" +
        $"', choice2='{QuestionsFromDb.choice2}', choice3='{QuestionsFromDb.choice3}', choice4='{QuestionsFromDb.choice4}' " +
        $"WHERE qid={QuestionsFromDb.b}";

        int result = _sql.ConnectExecuteNonQuery(query1);
    }

    public void MultiChoiceButtonNext()
    {
        _sql.ConnectExecuteReader($"SELECT * FROM testOrder WHERE qid={qid}", r => {
            // process your reader here, outside of this lambda connection will be closed
        });
    }
}

好处:

  1. SQL连接类型被封装成SQLConnectionHelper可以替换,客户端几乎SQLiteReader是从特定类型的SQL连接中抽象出来的(除了,可以重写);
  2. SQL连接配置(连接字符串)被封装;
  3. 封装了SQL连接错误处理,你可以抛出一些具体的CustomSQLException,你只需要在一个地方定义它;
  4. SQL 连接打开/关闭被封装。例如,您可以有一个单一的连接,而不是每次呼叫都连接,您只需要在一个地方更改它;
  5. 维护和未来可扩展性的许多其他 OOP 好处;
  6. SQLConnectionHelper可以实现IDisposable和清理连接资源。

这个解决方案可能看起来有点过于“函数式”,因为使用了高阶函数,你可以用更 OOP 的方式重写它,它只是为了给出想法,而不是实现。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

同一方法中的多个数据库

来自分类Dev

单一方法中的多个等待

来自分类Dev

单一方法中的多个等待

来自分类Dev

这是在Oracle数据库中使用MERGE的唯一方法吗?

来自分类Dev

使用单一方法从多个输入字段计算年龄

来自分类Dev

使用遮罩合并图像的单一方法

来自分类Dev

使用单一方法返回不同类型的数据

来自分类Dev

单一方法可产生多个新的Scanner返回

来自分类Dev

单一方法类与接口实现

来自分类Dev

如何使用linq在单一方法中使聚合函数?

来自分类Dev

使用哪种单一方法检查:空白?&& !错误的?

来自分类Dev

使用单一方法检测按钮阵列上的点击

来自分类Dev

运行时反射-使用单一方法提取符号

来自分类Dev

如何通过单一方法从不同索引中删除数组中的元素?

来自分类Dev

如何在实体数据源中查询数据时使用“第一方法”?

来自分类Dev

通过参数忽略的R唯一方法

来自分类Dev

在ASP.Net MVC中以单一方法返回视图和文件

来自分类Dev

如何以单一方法返回int日期,月份,年份

来自分类Dev

Angular.js中Ajax单一方法的体系结构

来自分类Dev

匿名和授权用户的Spring @RestController单一方法

来自分类Dev

maven-surefire-plugin 运行单一方法,但在课堂上失败

来自分类Dev

在同一方法中使用多个等待的效果?

来自分类Dev

使用SQL查询从数据库获取WooCommerce单一产品数据

来自分类Dev

defprotocol“没有单一方法”错误似乎是莱宁根的一个错误

来自分类Dev

在C#中使用单一方法会发生Stackoverflow异常吗?

来自分类Dev

在Quickbook PHP API中,如何使用enqueue()将对同一方法的多个调用排队

来自分类Dev

在Quickbook PHP API中,如何使用enqueue()将对同一方法的多个调用排队

来自分类Dev

同一方法中的两个查询

来自分类Dev

如何通过同一方法多次从父组件刷新子组件?

Related 相关文章

  1. 1

    同一方法中的多个数据库

  2. 2

    单一方法中的多个等待

  3. 3

    单一方法中的多个等待

  4. 4

    这是在Oracle数据库中使用MERGE的唯一方法吗?

  5. 5

    使用单一方法从多个输入字段计算年龄

  6. 6

    使用遮罩合并图像的单一方法

  7. 7

    使用单一方法返回不同类型的数据

  8. 8

    单一方法可产生多个新的Scanner返回

  9. 9

    单一方法类与接口实现

  10. 10

    如何使用linq在单一方法中使聚合函数?

  11. 11

    使用哪种单一方法检查:空白?&& !错误的?

  12. 12

    使用单一方法检测按钮阵列上的点击

  13. 13

    运行时反射-使用单一方法提取符号

  14. 14

    如何通过单一方法从不同索引中删除数组中的元素?

  15. 15

    如何在实体数据源中查询数据时使用“第一方法”?

  16. 16

    通过参数忽略的R唯一方法

  17. 17

    在ASP.Net MVC中以单一方法返回视图和文件

  18. 18

    如何以单一方法返回int日期,月份,年份

  19. 19

    Angular.js中Ajax单一方法的体系结构

  20. 20

    匿名和授权用户的Spring @RestController单一方法

  21. 21

    maven-surefire-plugin 运行单一方法,但在课堂上失败

  22. 22

    在同一方法中使用多个等待的效果?

  23. 23

    使用SQL查询从数据库获取WooCommerce单一产品数据

  24. 24

    defprotocol“没有单一方法”错误似乎是莱宁根的一个错误

  25. 25

    在C#中使用单一方法会发生Stackoverflow异常吗?

  26. 26

    在Quickbook PHP API中,如何使用enqueue()将对同一方法的多个调用排队

  27. 27

    在Quickbook PHP API中,如何使用enqueue()将对同一方法的多个调用排队

  28. 28

    同一方法中的两个查询

  29. 29

    如何通过同一方法多次从父组件刷新子组件?

热门标签

归档