【发布时间】:2020-07-22 13:00:36
【问题描述】:
private void displayButton_Click(object sender, EventArgs e)
{
string connectionString;
SqlConnection cnn;
connectionString = "Server= myservername; Database= nba_database; Integrated Security=True";
cnn = new SqlConnection(connectionString);
cnn.Open();
// MessageBox.Show("Connection Established!");
// define variables
SqlCommand command;
String sql;
// define SQL statement
if (listBox1.SelectedIndex == 0)
{
sql = "SELECT LastName, FirstName " +
"FROM Players, Teams " +
"WHERE Players.TeamID = Teams.TeamID " +
"AND Teams.Nickname = 'Hawks'";
// command statement
command = new SqlCommand(sql, cnn);
textBox1.Text = command.ExecuteScalar().ToString();
// Scalar returns the first column of the first row of the query
cnn.Close();
command.Dispose();
}
else if (listBox1.SelectedIndex == 1)
{
String sql2 = "SELECT FirstName, LastName FROM Players WHERE Team = 'Milwaukee Bucks'" +
"AND Number <= 24";
// command statement
command = new SqlCommand(sql2, cnn);
SqlDataReader reader = command.ExecuteReader();
// Get table values
StringBuilder sb = new StringBuilder();
while (reader.Read())
{
sb.AppendLine(reader.GetString(0).ToString() + " " + reader.GetString(1).ToString());
}
textBox1.Text = sb.ToString();
cnn.Close();
command.Dispose();
}
}
我有这个连接到 SQL Server 数据库的代码。有一个列表框供用户选择,根据他们的选择,查询将运行并在文本框中返回查询结果。
就目前而言,感觉就像我有一堆重复的代码,而我在列表框中只有 2 个选项。我将需要添加更多选项,并且嵌套的 if else 语句将继续增长。
有没有更好的方法来做到这一点?我正在考虑使用方法,但是当我尝试时,我不知道如何从方法中返回值,以及如何将其用作查询的参数。
任何帮助/建议将不胜感激
【问题讨论】:
-
cnn.Close(); command.Dispose();是重复的,但是通过(无论如何推荐)使用using块,它们都可以变得多余。 -
我投票结束这个问题,因为我相信这个问题对于Code Review 来说会更好,因为代码可以工作,但操作人员需要有关如何使代码“更好”的指针。跨度>
-
“有更好的方法吗?”这取决于您对“更好”的标准,1)您可以使用 switch/case,2)将索引甚至 ListBoxItem.Tag(例如枚举)映射到相应的 sql 查询甚至包含所有属性信息,3)继承的多态性,甚至组合或策略模式。除此之外,我建议您将 UI 逻辑与 Businesslogic 分开,尤其是与 DB-Access 代码分开。这种单一的方法将在未来的变化中为您带来大量工作。
-
如果单个表达式针对三个或更多条件进行测试,您可以尝试switch。但是你的demo里只有两种情况,
if...else会更好。
标签: c# sql visual-studio