我有一项任务是开发一个控制台应用程序,它可以从数据库中的几个表中重新计算值。我拥有所需的每个值所需的所有查询,并了解值如何交互的逻辑。我遇到的挑战是检索和存储这些值的最佳方法。
我已经研究并成功地创建了静态方法来从单个SQL查询中检索单个值,但我对最好的方法感到好奇:
创建多个方法来检索下面概述的每个值(超过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);
}
}
尝试将所有select语句组合在一个方法中(我在这里不成功)总结如下(不完整代码)
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command1 = new SqlCommand(commandText1, connection))
{
}
using (SqlCommand command2 = new SqlCommand(commandText2, connection))
{
}
// etc
}
在SQL中创建存储过程并执行它们并通过c#console app传递参数
我认为方法1会对服务器造成负担,因为它需要连接多次打开和关闭(虽然我不知道这是否像我认为的那样大)。方法2似乎更合理,虽然我已经遵循概念here并且在尝试获取命令的输出时遇到困难(我正在使用return)。方法3对我来说似乎更聪明,尽管我仍然处于需要在方法1和方法之间进行选择的位置。 2执行SP。
我真的很感激这里的建议和指导,我是C#的新手所以这是一个陡峭的学习曲线,当教程没有涵盖那种事情(或者至少我无法正确定义我的问题)
答案 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]