You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#连接MySQL双参数搜索无结果问题求助

问题原因与解决方案

你的核心问题在于:参数化查询无法直接将参数作为列名(数据库标识符)使用。当你用@columnName传递列名时,MySQL会把它当作字符串字面量,而不是实际的列名。比如你传入carMake,SQL实际执行的是WHERE 'carMake' LIKE '%大众%',这显然不会匹配任何数据,所以返回空结果。

解决方案1:修复存储过程

修改存储过程,使用动态SQL拼接列名,同时通过转义避免SQL注入:

CREATE DEFINER=`root`@`localhost` PROCEDURE `searchCars`(IN columnName VARCHAR(15), IN searchTerm VARCHAR(40))
BEGIN
    -- 使用QUOTE_NAME转义列名,避免注入和关键字冲突
    SET @sql = CONCAT('SELECT * FROM car WHERE ', QUOTE_NAME(columnName), ' LIKE ?');
    PREPARE stmt FROM @sql;
    SET @search = searchTerm;
    EXECUTE stmt USING @search;
    DEALLOCATE PREPARE stmt;
END

C#代码无需大幅修改,若你习惯在C#中拼接通配符%,保持原有逻辑即可:

string searchWild = '%' + searchTerm + '%';
// 其余存储过程调用代码不变

解决方案2:修复直接SQL版

通过预定义合法列名列表校验用户输入,再安全拼接列名到SQL语句:

internal List<Car> SearchCars(string searchTerm, string columnName)
{
    List<Car> returnThese = new List<Car>();
    
    // 关键:仅允许预定义的合法列名,彻底阻断SQL注入风险
    var allowedColumns = new List<string> { "carYear", "carColor", "carMake", "carModel", "carCondition", "vin" };
    if (!allowedColumns.Contains(columnName))
    {
        return returnThese;
    }

    using (MySqlConnection connection = new MySqlConnection(connectionString))
    {
        connection.Open();
        string searchWild = '%' + searchTerm + '%';
        // 用反引号包裹列名,避免与MySQL关键字冲突
        string sql = $"SELECT * FROM car WHERE `{columnName}` LIKE @searchWild";
        
        MySqlCommand command = new MySqlCommand(sql, connection);
        command.Parameters.AddWithValue("@searchWild", searchWild);

        using (MySqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                Car c = new Car
                {
                    carYear = reader.GetInt32(0),
                    carColor = reader.GetString(1),
                    carMake = reader.GetString(2),
                    carModel = reader.GetString(3),
                    carCondition = reader.GetString(4),
                    vin = reader.GetString(5)
                };
                returnThese.Add(c);
            }
        }
    }
    return returnThese;
}

重要注意事项

  • 绝对禁止直接拼接未校验的用户输入到SQL语句:这会导致严重的SQL注入攻击,必须通过合法列名列表过滤用户传入的columnName。
  • 使用using语句管理数据库连接和数据阅读器,确保资源自动释放,比手动调用Close()更安全可靠。

内容的提问来源于stack exchange,提问作者Screnj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:23:11