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

为何我的单值SQL查询失败?排查代码无返回结果异常

问题定位与修复方案

核心错误:SQL LIKE语句参数写法有误

你写的SQL查询里,把@FullPath参数放在了单引号里,这会让SQL Server把@FullPath当成普通字符串字面量,而非你传入的变量值,自然查不到数据库中对应的记录。

错误的SQL写法:

SELECT * FROM Songs WHERE FullPath LIKE '@FullPath%'

两种修正方式

  1. 在SQL语句中拼接通配符:
SELECT * FROM Songs WHERE FullPath LIKE @FullPath + '%'
  1. 直接在参数值里添加通配符(逻辑更直观):
queryString.Parameters.Add("@FullPath", SqlDbType.NVarChar, 300).Value = $"{fullPath}%";

对应的SQL简化为:

SELECT * FROM Songs WHERE FullPath LIKE @FullPath

额外排查项

  • 参数长度限制:你给参数设置了300的长度,如果fullPath实际长度超过300会被截断,导致匹配失败,可以调大长度或者不指定长度(让ADO.NET自动推断)。
  • 大小写敏感性:如果数据库排序规则区分大小写,fullPath与数据库中存储的大小写不一致也会查不到结果,可尝试统一转小写:
SELECT * FROM Songs WHERE LOWER(FullPath) LIKE LOWER(@FullPath) + '%'
  • 多余空格问题:检查fullPath或数据库中FullPath字段是否包含前后空格,用TRIM()处理:
SELECT * FROM Songs WHERE TRIM(FullPath) LIKE TRIM(@FullPath) + '%'

修复后的完整代码

Song song = new Song();
connectionManager = new ConnectionManager();
try
{
    using (SqlConnection conn = new SqlConnection(connectionManager.ConnectionString))
    {
        conn.Open();
        // 修正后的SQL语句
        string query = "SELECT * FROM Songs WHERE FullPath LIKE @FullPath + '%'";
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            cmd.Parameters.Add("@FullPath", SqlDbType.NVarChar, 300).Value = fullPath;
            // 用using包裹SqlDataReader,自动释放资源
            using (SqlDataReader rdr = cmd.ExecuteReader())
            {
                if (!rdr.Read())
                {
                    throw new InvalidOperationException("No records were returned.");
                }
                song.Title = rdr["Title"].ToString();
                song.Artist = rdr["Artist"].ToString();
                song.Genre = rdr["Genre"].ToString();
                song.Album = rdr["Album"].ToString();
                // 处理Year字段可能为NULL的情况
                song.Year = rdr["Year"] != DBNull.Value ? (uint)rdr["Year"] : 0;
                song.Length = rdr["Length"].ToString();
                song.FullPath = rdr["FullPath"].ToString();
            }
        }
        // using块会自动关闭连接,无需手动调用conn.Close()
    }
}
catch (Exception ex)
{
    Logger.log.Error($"Error getting song: {fullPath}\n", ex);
}
return song;

补充说明:using包裹的SqlConnection会自动释放连接,没必要手动执行conn.Close();另外Year字段如果可能为空,直接强制转换会抛出异常,需先判断是否为DBNull.Value。

内容的提问来源于stack exchange,提问作者Phil N DeBlanc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:45:47