2016-05-30 102 views
0

使用web api restful服务。Web API Restful Service C#执行SQL查询

我有一张名为测试的表。主键是自动递增的。每行包含一个用户名和一个测试问题。这个数据库并没有真正优化,但它不需要。

因为主键只是一个int,以保持每行都是唯一的,所以有很多行有重复的用户名。这可以。

我希望能够用匹配用户名返回所有行。

我希望能够用URL中的GET请求来做到这一点:www.mywebsite.com/api/tests/{username}

在Visual Studio中的默认控制器方法只能通过搜索主键返回一个唯一的结果。

这就像我想要的东西,但它不起作用。 500错误。我对调试不熟悉,所以如果可能的话,请指向正确的方向,以便我可以提供更多信息。

// GET: api/Tests/robert 
    [ResponseType(typeof(Test))] 
    public async Task<IHttpActionResult> GetTest(string id) 
    { 
     //This is the default approach that just searches by primary key 
     //Test test = await db.Tests.FindAsync(id); 

     /*This is roughly what I want. Compiles, but doesn't work.*/ 

     var query = "SELECT* WHERE id=" + id; 
     Test test = db.Tests.SqlQuery(query, id); 
     if (test == null) 
     { 
      return NotFound(); 
     } 

     return Ok(test); 
    } 

让我知道我搞砸了。几个小时以来,我一直在为此感到失望。我不认为在这方面特别优秀。

回答

1

尝试宣告你的方法是这样

[RoutePrefix("api")] 
public class HisController : ApiController 
{ 
    [HttpGet] 
    public HttpResponseMessage Test(string name) {...} 
} 

另外,我建议您使用实体框架

[RoutePrefix("api")] 
public class HisController : ApiController 
{ 
    [HttpGet] 
    public HttpResponseMessage Test(string name) 
    { 
     using (MyEntities bm = new MyEntities()) 
     { 
      var usr = bm.Users.Where(u => u.Name == name).ToList(); 

      if (usr.Count() > 0) 
       return Request.CreateResponse(HttpStatusCode.OK, new 
       { 
        Success = true 
         , 
        Message = "Total users: " + usr.Count() 
         , 
        Data = usr 
       }); 

      return Request.CreateResponse(HttpStatusCode.NotFound, new { Success = false, Message = "No users found..." }); 
     } 
    } 
} 
+1

我会第二的EF方法。来自OP的代码对SQL注入攻击是开放的。当你将它们发送到SQL查询中时,你绝不应该信任输入,也绝对不能。 – heartlandcoder

+1

他将永远不会使用www.mywebsite.com/api/tests/{username}命中此方法,除非他更改了默认绑定。如果RouteConfig需要使用此URL模式访问此方法,则需要更新RouteConfig。 – RizJa

+0

那是真实的,我认为他有正确的配置他的课'[RoutePrefix( “API”) 公共类HisController:ApiController {[HTTPGET] 公共HttpResponseMessage测试(字符串名称){...}}' – Rafa