【问题标题】:Startindex cannot be less than zero. Parameter name: startindexStartindex 不能小于零。参数名称:startindex
【发布时间】:2018-04-13 20:04:49
【问题描述】:

说到 C#,我正处于学习阶段。

我有一个选中的列表框。因此,如果检查了一个项目,我希望它对数据库进行查询。如果没有检查,它应该只查询 select * from Table。

这是我到目前为止所做的,但我失败了。有什么建议可以让它正常工作吗?

private void chkbx_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {


            string query = string.Empty;
            string req = "Select * FROM SME";
            string sql = string.Empty;
            foreach (string s in chkbx.CheckedItems)
                query += s + "','";
            query = query.Remove(query.Length -3);
            if (!string.IsNullOrEmpty(query))
            {
                query = string.Format(" WHERE Agent IN ('{0}')", query);
            }


            {
                using (MySqlConnection con = new MySqlConnection("datasource=server.ip.com;port=12345;database=DB;username=user;password=pass"))
                {

                    using (MySqlCommand cmd = new MySqlCommand(req + query))
                    {
                        using (MySqlDataAdapter sda = new MySqlDataAdapter(cmd))
                        {
                            cmd.Connection = con;
                            using (DataTable dt = new DataTable())
                            {
                                sda.Fill(dt);
                                dataGrid.DataSource = dt;

                            }
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            connection.Close();
        }
    }

【问题讨论】:

  • 在调用之前检查查询变量是否为空或空。删除` if (!string.IsNullorEmpty(query)) query = query.Remove(query.Length -3);`
  • 如果您的chkbx.CheckedItems 看起来没有任何检查,将会出现问题。您的下一行代码正在尝试从空字符串中删除内容。如果没有项目,这将引发错误...query = query.Remove(query.Length -3) 因为长度将为 0,因此您将删除 -3 项目

标签: c# null checkedlistbox


【解决方案1】:

您可以使用而不是使用连接字符串

string query = "";
List<string> items = new List<string>();
foreach (string s in chkbx.CheckedItems)
    items.Add(s);
if (items.Count > 0)
{
    query = $" WHERE Agent IN ('{string.Join("','", items)}')";
}

通过这种方式,您将选中的项目文本添加到列表中,然后使用 string.Join 构建 IN 子句的内部部分。子句完成在j​​oin结果前后加单引号

【讨论】:

  • 您在构建 where 子句时遗漏了一些引号。
  • 抱歉,我没有看到任何遗漏的报价。你能确定吗?也许这里的语法突出显示有误导性?
  • 其实你有太多了。我虽然你嵌入了一个双,但你实际上并不需要它们。 query = " WHERE Agent IN ({'" + string.Join("','", items) + "'})";
  • 会产生类似WHERE Agent IN ({'a','b','c'})
  • 再次检查。它甚至没有在这个网站上进行身份验证。
猜你喜欢
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多