【问题标题】:Select query from multiple textboxes c#从多个文本框中选择查询c#
【发布时间】:2014-11-10 05:07:26
【问题描述】:

我对 c# 和 SQL 还是很陌生,所以请记住这一点。我搜索了该网站,但找不到答案。

我正在用 C# 构建一个基本的 ASP Web 表单,它连接到 mysql 数据库并使用结果填充 gridview。

我在网页上有两个文本框:电话号码和用户 ID。 然后我有一个按钮,单击该按钮会运行以下代码:

        protected void btnSubmit_Click(object sender, EventArgs e)
        {    
            {
                try
                {
                    conn.Open();
                    //SQL 
                    MySqlCommand cmd = new MySqlCommand("Select * from message where phone_number like @PatientMob and user_ID like @UserID, conn);
                    //Paramaters
                    cmd.Parameters.Add(new MySqlParameter(@"PatientMob", MySqlDbType.VarChar)).Value = PatientMobile.Text;
                    cmd.Parameters.Add(new MySqlParameter(@"UserID", MySqlDbType.VarChar)).Value = UserID.Text;

                    MySqlDataAdapter adp = new MySqlDataAdapter(cmd);
                    DataSet ds = new DataSet();
                    adp.Fill(ds);
                    gridview.DataSource = ds;

..等

我的问题是,如何格式化查询,以便即使只填写一个文本框也能正常工作? 目前,如果我输入电话号码但不输入用户 ID,结果会显示具有该电话号码的人在用户 ID 字段中没有输入任何内容。

我稍后会为标题、名字、姓氏等添加更多文本框,并且需要一个可以处理已填写或未填写字段的任意组合的解决方案。

谢谢。

【问题讨论】:

  • 使用 Equalto(=) 运算符代替 LIKE 运算符。
  • 另外,在 cmd.add 参数的末尾,使用 string.IsNullOrEmpty(PatientMobile.Text) ? DBNull.Value : PatientMobile.Text;

标签: c# mysql asp.net


【解决方案1】:

很遗憾,我不知道有什么好方法可以做到这一点,但您确实有一些选择。

  1. 动态构建字符串

类似这样的:

List<string> wheres = new List<string>();
List<MySqlParameter> parameters = new List<MySqlParameter>();

if (!string.IsNullOrWhiteSpace(PatientMobile.Text))
{
    wheres.Add("phone_number LIKE @PatientMob");
    parameters.Add(new MySqlParameter(@"PatientMob", MySqlDbType.VarChar)
                   {
                       Value = PatientMobile.Text
                   });
}

...

string query = string.Format("SELECT * FROM Messages WHERE {0}", string.Join(" AND ", wheres));

等等等等……

  1. 动态检查查询中的空白内容

类似这样的:

string query = "SELECT * FROM message WHERE (LEN(@PatientMob) = 0 OR phone_number LIKE @PatientMob) and (LEN(@UserID) = 0 OR user_ID LIKE @UserID)", conn);
  1. 我看到您正在使用LIKE,并且我承认我不是 MySQL 的一员,所以这可能是一个问题,但您似乎可以使用任何指定通配符匹配的字符来包装您的参数。在 T-SQL 中,这看起来像 column LIKE '%' + @param + '%'。当然,这不会是完全匹配的,但这听起来可能就是您正在寻找的东西。在搜索框为空的情况下,只会产生column LIKE '%%',它会匹配任何值。

【讨论】:

  • 感谢您的回复!我对您的第一个解决方案有疑问,应该是 if (!string.IsNOTNullOrWhiteSpace 吗?据我了解,如果字段为空,则您的代码在 select 语句中包含该字段,而不是如果它不为空。
  • @Bryan 不,它是正确的。如果字段 is 为空,并且感叹号 not 表示该字段,则该方法返回 true。因此,如果字段为空,if not true 将跳过该部分。
  • 有道理!再次感谢你。我有点不确定在哪里放置'string query = string.Format("SELECT * FROM Messages WHERE {0}", string.Join(" AND ", wheres));'线虽然。它必须在 MySqlCommand 之前,否则“查询”字符串还不存在,但如果我把它放在前面,那么“wheres”字符串还没有创建。
  • @Bryan 真棒。好点,我已经修好了。我想象 MySqlCommand 有一个空的构造函数,让您稍后设置CommandText,但正如我所说,我从未使用过MySQL。我已经编辑了答案以将参数存储在单独的列表中,然后可以在创建命令后将其添加到命令中。所以现在你会做类似MySqlCommand cmd = new MySqlCommand(query)的事情,然后在接下来的几行中,添加我们存储在parameters中的所有参数。
  • 非常感谢您的帮助。你正在帮助我更好地理解它。似乎查询字符串没有将 @PatientMob 视为参数,而是将其视为文本。示例:如果我在文本框中输入“12345”,当我单击按钮时,它会运行以下代码“SELECT * FROM Messages WHERE patient_mobile LIKE @PatientMob”而不是“SELECT * FROM Messages WHERE patient_mobile LIKE 12345”
【解决方案2】:

我将自己格式化 sql where 字符串。比如代码

if (!string.IsNullOrEmpty(Phone.Text))
        {
            whereCriteria += " phone like @Phone";
            cmd.Parameters.Add(new MySqlParameter(@"phone", MySqlDbType.VarChar)).Value = Phone.Text;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多