【问题标题】: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 的同步版本。

      您也应该可能查看参数;所示代码非常危险。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-15
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多