C#多个SQL select语句的单个方法

时间:2016-11-02 09:55:56

标签: c#

我有一项任务是开发一个控制台应用程序,它可以从数据库中的几个表中重新计算值。我拥有所需的每个值所需的所有查询,并了解值如何交互的逻辑。我遇到的挑战是检索和存储这些值的最佳方法。

我已经研究并成功地创建了静态方法来从单个SQL查询中检索单个值,但我对最好的方法感到好奇:

  1. 创建多个方法来检索下面概述的每个值(超过15个不同的选择语句)(不是完整的代码)

    static double total1(int arg)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                SqlCommand command1 = new SqlCommand(commandText1, connection));
                return(response);
            }
    }
    static double total2(int arg)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                  connection.Open();
                SqlCommand command2 = new SqlCommand(commandText2, connection));
                return(response);
        }
    }
    
  2. 尝试将所有select语句组合在一个方法中(我在这里不成功)总结如下(不完整代码)

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using (SqlCommand command1 = new SqlCommand(commandText1, connection))
        {
        }
        using (SqlCommand command2 = new SqlCommand(commandText2, connection))
        {
        }
        // etc
    }
    
  3. 在SQL中创建存储过程并执行它们并通过c#console app传递参数

  4. 我认为方法1会对服务器造成负担,因为它需要连接多次打开和关闭(虽然我不知道这是否像我认为的那样大)。方法2似乎更合理,虽然我已经遵循概念here并且在尝试获取命令的输出时遇到困难(我正在使用return)。方法3对我来说似乎更聪明,尽管我仍然处于需要在方法1和方法之间进行选择的位置。 2执行SP。

    我真的很感激这里的建议和指导,我是C#的新手所以这是一个陡峭的学习曲线,当教程没有涵盖那种事情(或者至少我无法正确定义我的问题)

2 个答案:

答案 0 :(得分:0)

AfterEdit

答案 1 :(得分:0)

我最近看到这个问题仍在被查看,所以我会为任何刚刚开始开发并遇到类似挑战的人发布解决方案。

最合适的解决方案是创建一个存储过程,将每个唯一的参数传递给它,并在单个响应中将所有相关数据返回给应用程序。为此输出定义了一个自定义模型,并相应地调整了应用程序逻辑。结果是对数据库的单个调用运行时间更长,而不是多个单独调用。

使用问题中的格式,解决方案是:

C# 代码

static NewModel AllTotals(int arg1, int arg2)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        var commandText = "TheStoredProcName";
        SqlCommand command = new SqlCommand(commandText, connection));
        command.CommandType = System.Data.CommandType.StoredProcedure;
        Cmd.Parameters.AddWithValue("@arg1", arg1);
        Cmd.Parameters.AddWithValue("@arg1", arg2);
        using (SqlDataReader dr = Cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                var response = new NewModel(){
                    Value1 = Convert.ToDecimal(dr["value1"]),
                    Value2 = Convert.ToDecimal(dr["value2"]),
                };

                return(response);
            }
        }
    }

    return null;
}

SQL 存储过程

CREATE PROCEDURE [dbo].[TheStoredProcName]
    @arg1 int,
    @arg2 int
AS
    DECLARE @value1 decimal(18,6) = ISNULL((--QUERY TO GET VALUE1),0)
    DECLARE @value2 decimal(18,6) = ISNULL((--QUERY TO GET VALUE2),0)
    
    -- select the variables into a result set for the application
    SELECT @value1 as [value1], @value2 as [value2]