【问题标题】:Modifying my query for concatenation C#修改我的连接查询 C#
【发布时间】:2013-12-10 10:10:45
【问题描述】:

我的数据库中有一个表,其中有 4 列 Specie | Price | Stock | Country.

我有一个名为 ddlcountry 的下拉列表,通过 Country 列填充。

然后我有一个名为 DdPetPist 的下拉菜单,其中应填充与通过上一个下拉菜单选择的国家/地区关联的所有 Specie

例如,我选择英国,我有一个狗、猫和兔子的列表。

问题的

  1. 目前我在第二个下拉菜单中选择了 UK 和所有 Specie 节目。
  2. 当我选择国家下拉列表时,它会多次重复该国家/地区。

第一个下拉菜单的代码(国家选择)

protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            MySqlCommand cd2 = new MySqlCommand("SELECT * FROM Animals", cs); // need to make it so changes database
            cs.Open();
            MySqlDataReader ddlCountry = cd2.ExecuteReader();
            ddlcountry.DataSource = ddlCountry;
            ddlcountry.DataValueField = "Country";
            ddlcountry.DataTextField = "Country";
            ddlcountry.DataBind();
            cs.Close();
            cs.Dispose();
        }
    }

选择县时填充第二个列表的代码

protected void ddlcountry_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ddlcountry.Text != string.Empty)
        {
            MySqlCommand cd = new MySqlCommand(string.Format("SELECT * FROM Animals", ddlcountry.Text), cs);
            cs.Open();
            MySqlDataReader ddlSpecie = cd.ExecuteReader();
            DdPetPist.DataSource = ddlSpecie;
            DdPetPist.DataValueField = "Specie";
            DdPetPist.DataTextField = "Specie";
            DdPetPist.DataBind();
            cs.Close();
            cs.Dispose();
        }
    }  

我想我已经很接近了,只是不确定如何适当地调整我的 Query 。 任何帮助深表感谢。

【问题讨论】:

  • SELECT * FROM Animals 您在哪里填充您的国家/地区-ddl?除此之外,不要重用您的MySqlConnection,而是使用using-语句。我很惊讶你没有得到异常,因为你正在处理它。如果你之后在另一种方法中使用它,你会得到一个ObjectDisposedException
  • 你的意思是这给我带来了问题吗?
  • 我认为您不应该总是一遍又一遍地从数据库中获取物种。而是加载它们一次(也在 page_load 中),然后根据您选择的内容,相应地更改您的列表。
  • 一些提示:对一次性资源使用“使用”语句,例如'MySqlCommand' 和 'SqlDbConnection' 是一次性的。
  • 好的,谢谢您的建议,我会尝试更改一些代码。

标签: c# mysql drop-down-menu concatenation


【解决方案1】:

我认为ddlcountry_SelectedIndexChanged 事件的查询中缺少所选特定国家/地区的WHERE 子句。像下面这样改变它。我按照@Fabian 的指出对查询进行了参数化,以防止 SQL 注入攻击。也像其他人建议的那样,您应该使用Using 语法在连接超出范围时自动处理它。

private String sql = "SELECT DISTINCT(Specie) FROM Animals WHERE Country = @SelectedCountry;";
MySqlCommand cd = new MySqlCommand(sql), cs);
cd.Parameters.AddWithValue("@SelectedCountry", ddlcountry.Text);
MySqlDataReader ddlSpecie = cd.ExecuteReader();
DdPetPist.DataSource = ddlSpecie;
DdPetPist.DataValueField = "Specie";
DdPetPist.DataTextField = "Specie";
DdPetPist.DataBind();

另外,在您的第一个查询中,无需选择带有 * 的所有内容。如下更新它以获得 UNIQUE Country 值。

MySqlCommand cd2 = new MySqlCommand("SELECT DISTINCT(Country) FROM Animals", cs);

【讨论】:

  • 请提供参数化解决方案以获得+1。 :)
【解决方案2】:

我想我找到了问题。

只需替换

MySqlCommand cd = new MySqlCommand(string.Format("SELECT * FROM Animals",ddlCountry.Text),cs);

MySqlCommand cd = new MySqlCommand(string.Format("SELECT Animals.Specie FROM Animals WHERE Animals.Country={0};",ddlCountry.Text),cs);

输出将是一个只有一列(物种)的数据表

【讨论】:

  • 请提供参数化解决方案以获得+1。 :)
【解决方案3】:

将您对国家/地区下拉菜单的查询更改为

"SELECT Distinct Country FROM Animals"

以及您对第二个下拉菜单的查询

string.Format("SELECT * FROM Animals WHERE Country = '{0}'", ddlcountry.Text)

【讨论】:

  • 请提供参数化解决方案以获得+1。 :)
猜你喜欢
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多