如何在Visual Studio的C# WCF服务中执行Select查询并获取返回结果?
问题解决:SQL语法错误+数据读取问题
核心错误原因
你的异常提示Incorrect syntax near the keyword 'user',是因为user是SQL Server的保留关键字,直接用它作为表名会触发语法解析错误,必须用方括号[user]包裹表名。
代码中的其他问题及修正
除了表名的问题,代码还有几个需要优化的点:
s.ToString()无法正确读取字段值,必须通过字段名/索引获取对应列的数据- 未使用
using语句自动释放资源,容易导致数据库连接泄漏 - 根据ID查询单条数据,不需要
while循环,单次Read()即可
修正后的完整代码
string add = "none"; // 使用using自动释放连接、命令、阅读器资源 using (var con = new SqlConnection("你的数据库连接字符串")) { con.Open(); // 表名用[user]包裹避免关键字冲突 using (var cmd = new SqlCommand("select address from [user] where id=@x", con)) { cmd.Parameters.Add(new SqlParameter("@x", id)); // 使用using自动释放DataReader using (var s = cmd.ExecuteReader()) { if (s.Read()) // 直接判断是否有数据并读取 { // 读取address字段的值,同时处理字段为空的情况 add = s["address"] != DBNull.Value ? s["address"].ToString() : "none"; } } } } return add;
关键修正点说明
- 表名处理:将
user改为[user],避免与SQL保留关键字冲突 - 字段读取:用
s["address"]获取指定列的数据,增加DBNull判断防止空字段抛出异常 - 资源管理:所有实现
IDisposable的对象(SqlConnection、SqlCommand、SqlDataReader)都用using包裹,确保资源自动释放 - 简化逻辑:ID通常是唯一标识,查询结果最多一条,直接用
if (s.Read())代替while循环
内容的提问来源于stack exchange,提问作者Se55
相关产品推荐
相关产品推荐

