C# 优化C代码/硬编码

C# 优化C代码/硬编码,c#,asp.net,drop-down-menu,C#,Asp.net,Drop Down Menu,首先,我想说的是,我不是一个程序员。基本上,我被困在从头开始学习C,这我并不介意 下面是我的代码试图实现的一些背景信息 我有一个用于数据库名称的级联DDL1。当用户选择数据库名称时,他们需要为日期范围选择DDL2,该范围使用一些参数运行不同的查询 它运行的查询涉及连接来自不同数据库的两个表,我认为这是我面临的总体问题 我可以让代码工作,但它似乎真的很乏味,我相信硬编码是不赞成的,除非有必要。我做了一些研究,看起来我需要使用动态SQL来参数化存储过程中的数据库名称,我不喜欢使用动态SQL 总而言之

首先,我想说的是,我不是一个程序员。基本上,我被困在从头开始学习C,这我并不介意

下面是我的代码试图实现的一些背景信息

我有一个用于数据库名称的级联DDL1。当用户选择数据库名称时,他们需要为日期范围选择DDL2,该范围使用一些参数运行不同的查询

它运行的查询涉及连接来自不同数据库的两个表,我认为这是我面临的总体问题

我可以让代码工作,但它似乎真的很乏味,我相信硬编码是不赞成的,除非有必要。我做了一些研究,看起来我需要使用动态SQL来参数化存储过程中的数据库名称,我不喜欢使用动态SQL

总而言之。对于每个数据库名称和每个日期范围,我需要分别对它们进行硬编码。每个数据库总共有4个代码块。如果数据都存在于一个表中,我就不会有这个问题

再说一次,我是个新手,基本上是个初学者。请让我知道,如果有可能优化代码,使其更有效,因为到目前为止,它看起来像糟糕的编码对我来说

代码如下所示,谢谢:

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{

{
    DataTable dt = new DataTable();
    SqlDataAdapter Adpt;

    if (DropDownList1.SelectedValue == string.Empty & DropDownList2.SelectedValue == string.Empty)
    {
    }

    if (DropDownList1.SelectedItem.Text == "ytd" & DropDownList2.SelectedValue == "db1")
        using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["db1ConnectionString"].ConnectionString))
        {
            SqlCommand cmd = new SqlCommand("select sum(column1) from table1 inner join db2.dbo.table2 on db2.dbo.table2.ID = db1.dbo.table3.id where somecolumn = @somecolumn and Date <= GetDate() AND YEAR(Date) = year(GetDate()) AND Status = @Status", con);
            cmd.Parameters.AddWithValue("@somecolumn", DropDownList2.SelectedValue);
            cmd.Parameters.AddWithValue("@status", "done");
            Adpt = new SqlDataAdapter(cmd);
            new SqlDataAdapter(cmd).Fill(dt);
        }

    if (DropDownList1.SelectedItem.Text == "yesterday" & DropDownList2.SelectedValue == "db1")
        using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["db1ConnectionString"].ConnectionString))
        {
            SqlCommand cmd = new SqlCommand("select sum(column1) from table1 inner join db2.dbo.table2 on db2.dbo.table2.ID = db1.dbo.table3.id where somecolumn = @somecolumn and Date >= DATEADD(DAY, DATEDIFF(DAY, 1, GETDATE()), 0) AND Date <= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) AND Status = @Status", con);
            cmd.Parameters.AddWithValue("@somecolumn", DropDownList2.SelectedValue);
            cmd.Parameters.AddWithValue("@status", "done");
            Adpt = new SqlDataAdapter(cmd);
            new SqlDataAdapter(cmd).Fill(dt);

    //if same code, different database
        {
        }

    //if same code, different database
        {
        }

    //else if same code, different database           
        {
        }

    GridView1.DataSource = dt;
    GridView1.DataBind();

}


protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
{
    {
        if (DropDownList2.SelectedIndex == 0)
        {
            DropDownList1.SelectedIndex = 0;
            DropDownList1.Enabled = false;
        }
        else
        {
            DropDownList1.Enabled = true;
            DropDownList1.SelectedIndex = 0;
        }

    }
}

}

好的编程关键是尽可能消除冗余。如果您的大多数代码相同或非常相似,请找出如何避免重复

例如,代码的快速重构如下所示:

var selectStatement = "select sum(column1) from table1 inner join db2.dbo.table2 on db2.dbo.table2.ID = db1.dbo.table3.id where somecolumn = @somecolumn "
string whereClause;

if (DropDownList2.SelectedValue == "db1")
{
    if (DropDownList1.SelectedItem.Text == "ytd")
    {
        whereClause = "and Date <= GetDate() AND YEAR(Date) = year(GetDate()) AND Status = @Status";
    }
    else if (DropDownList1.SelectedItem.Text == "yesterday")
    {
        whereClause = "and Date >= DATEADD(DAY, DATEDIFF(DAY, 1, GETDATE()), 0) AND Date <= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) AND Status = @Status"
    }
}

//etc

SqlCommand cmd = new SqlCommand(selectStatement + whereClause, con);
cmd.Parameters.AddWithValue("@somecolumn", DropDownList2.SelectedValue);
cmd.Parameters.AddWithValue("@status", "done");
Adpt = new SqlDataAdapter(cmd);
new SqlDataAdapter(cmd).Fill(dt);

GridView1.DataSource = dt;
GridView1.DataBind();

再次查看代码时,您可能需要在if块中移动并分配这些db变量,并将selectStatement声明移到末尾。

谢谢您的帮助/提示。是否可以参数化数据库名称?:db2.dbo.table2.ID=db1.dbo.table3.ID上的内部联接db2.dbo.table2。我只需要在db1上传递一个不同的数据库名称。这似乎是我的主要问题之一哦,是的!谢谢你对做这件事的人投了反对票。我只是想看看是否有可能优化它。我做了研究,没有要求任何人重写代码。谢谢克里斯。我不敢相信我没有考虑使用变量。这肯定会帮助我向前迈进。但是,我有一个关于您提供的代码的问题:stringwhere子句;它表示使用未分配的局部变量。字符串变量=不应该是什么吗?我没有=空;只是为了测试我的代码。再次感谢!是的,在使用它之前,您需要确保它已分配。我的样品肯定需要一些最后的润色。
var sourceDb = "db1";
var targetDb = "db2";
var selectStatement = string.Format("select sum(column1) from table1 inner join {0}.dbo.table2 on {0}.dbo.table2.ID = {1}.dbo.table3.id where somecolumn = @somecolumn ", targetDb, sourceDb);