【问题标题】:Any ideas how I can shorten this code?有什么想法可以缩短此代码吗?
【发布时间】:2012-12-07 12:51:24
【问题描述】:
string menuRecipe = "SELECT * FROM recipelist WHERE menu_ID = '" + menuID + "'";
MySqlCommand recipeCmd = new MySqlCommand(menuRecipe, db.mycon);
MySqlDataReader recipeDr = recipeCmd.ExecuteReader();
string[] info = new string[8];
while (recipeDr.Read())
{
    info[1] = (recipeDr["recipe_ID"].ToString());
    info[2] = (recipeDr["stock_ID"].ToString());
    info[4] = (recipeDr["recipe_quantity"].ToString());
    string stockName = "SELECT stock_name FROM stocksdb WHERE stock_ID = '" + info[2] + "'";
    cmd = new MySqlCommand(stockName, db.mycon);
    MySqlDataReader nameDr = cmd.ExecuteReader();
    while (nameDr.Read())
    {
        info[3] = (nameDr["stock_name"].ToString());
    }
    this.recipeList.Items.Add(new ListViewItem(new string[] { info[1], info[2], info[3], info[4] }));
}

我主要想减少必须使用多个 SQL 命令字符串,但我不知道如何以及如何将它们分隔到各自的位置,因为有些可能会混淆。

【问题讨论】:

  • 小伙伴们,我可以要求一个好的链接吗?
  • 这可以通过 DataReader 轻松完成。我对您的代码试图完成的工作感到困惑。你在recipelist 和stockdb 之间有什么关系。您是否期望从 recipelist 查询获得多个结果?您是否期望stocksdb 查询的结果不止一个?如果不是,为什么它们在 where 语句而不是 if 语句中?此外,连接 sql 字符串是一个坏习惯——您应该改用参数化查询。
  • SQL 的字符串连接是个坏主意;这是 SQL 注入的秘诀。您应该使用参数化查询。
  • 我猜另一个人是对的。那个说我可以在另一个上使用我用于一个 dataReader 的一个连接的人。

标签: c# mysql select


【解决方案1】:

您可以将查询更改为

SELECT r.*, s.stock_name FROM recipelist r
LEFT OUTER JOIN stocksdb s ON r.stock_ID = s.stock_ID
WHERE menu_ID = @parameter

【讨论】:

  • 好的,我试试这个。但我可以问什么'r'。和'。代表什么?
  • @JohnErnestGuadalupe 它们是表recipelist 和stockdb 的别名
【解决方案2】:

我会把你的代码改成这样:

string connect = "...";
using (var cn = new SqlConnection(connect))
{
    cn.Open();

    string sql = @"
SELECT r.*, s.stock_name 
FROM recipelist r
LEFT OUTER JOIN stocksdb s ON r.stock_ID = s.stock_ID
WHERE menu_ID = @MenuID";
    var cmd = new SqlCommand(sql, cn);
    cmd.Parameters.Add("@MenuID", SqlDbType.Int).Value = menuID;
    var dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        this.recipeList.Items.Add(new ListViewItem(new string[] { 
            dr["recipe_ID"].ToString(), 
            dr["stock_ID"].ToString(), 
            dr["stock_name"].ToString(), 
            dr["recipe_quantity"].ToString()
        }));
    }
}

【讨论】:

    【解决方案3】:

    您可以在初始查询中执行 INNER JOIN 以将 stockdb 表链接到 stock_ID 上的配方列表表。

    【讨论】:

    • 请问那会是什么样子?
    猜你喜欢
    • 2012-01-24
    • 2023-04-10
    • 2023-02-06
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    相关资源
    最近更新 更多