【问题标题】:I want to get a single database SQL string我想获取单个数据库 SQL 字符串
【发布时间】:2020-05-30 06:11:34
【问题描述】:
我遇到了一个小问题:
readonly LoginMandant logon = new LoginMandant();
string query = "SELECT Name FROM tMandant WHERE Id_Mandant = " + userDetails.Id_Mandant + ";";
Session["MandantName"] = logon.Database.SqlQuery<string>(query).SingleOrDefaultAsync();
然后它返回:
System.Threading.Tasks.Task`1[System.String]
但是为什么呢?我想要一个像“test”这样的字符串。
【问题讨论】:
标签:
c#
asp.net-mvc
model-view-controller
razor
【解决方案1】:
异步将要求您等待。
Session["MandantName"] = await logon.Database.SqlQuery<string>(query).SingleOrDefaultAsync();
但是,调用方法也必须是异步的(及其调用方调用 await 等)。 我强烈推荐这个,但是,如果您真的时间很紧,您可以执行 SingleOrDefaultAsync().Result 或简单地调用 SingleOrDefault(),但是它会阻塞执行,直到数据库查询完成。
重要提示:避免查询字符串的字符串连接。您有 SQL 注入的风险。
【解决方案2】:
因为您使用的是SingleOrDefaultAsync,所以它会返回一个任务对象。
如果你想从数据库同步获取字符串,你应该使用SingleOrDefault()而不是async。
以下应该适用于您的情况:
Session["MandantName"] = logon.Database.SqlQuery<string>(query).SingleOrDefault();
【解决方案3】:
你需要await类似任务的操作,即
Session["MandantName"] = await logon.Database.SqlQuery<string>(query).SingleOrDefaultAsync();
但是,这要求您的代码为async;如果不是,则将其设为async(但不是 async void),或者查找 API 的同步版本。
您也应该可能查看参数;所示代码非常危险。