为何我的单值SQL查询失败?排查代码无返回结果异常
问题定位与修复方案
核心错误:SQL LIKE语句参数写法有误
你写的SQL查询里,把@FullPath参数放在了单引号里,这会让SQL Server把@FullPath当成普通字符串字面量,而非你传入的变量值,自然查不到数据库中对应的记录。
错误的SQL写法:
SELECT * FROM Songs WHERE FullPath LIKE '@FullPath%'
两种修正方式
- 在SQL语句中拼接通配符:
SELECT * FROM Songs WHERE FullPath LIKE @FullPath + '%'
- 直接在参数值里添加通配符(逻辑更直观):
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
相关产品推荐
相关产品推荐

