【问题标题】:How to get scalar value from a SQL statement in a .Net core application?如何从 .Net 核心应用程序中的 SQL 语句获取标量值?
【发布时间】:2019-11-06 07:11:30
【问题描述】:

.Net 核心控制台应用程序(EF 核心 2.0/Sql 服务器)中的以下代码。

var sql = _context.Set<string>()
          .FromSql("select dbo.FunctionReturnVarchar({0});", id);

遇到以下异常?

无法为“字符串”创建 DbSet,因为该类型未包含在上下文模型中。

是不是不用定义一个属性为string的类的方法?

【问题讨论】:

标签: c# .net-core entity-framework-core


【解决方案1】:

在这种情况下,您需要的是带有绑定输出参数的ExecuteSqlCommand 方法:

var resultParameter = new SqlParameter("@result", SqlDbType.VarChar);
resultParameter.Size = 2000; // some meaningfull value
resultParameter.Direction = ParameterDirection.Output;
_context.Database.ExecuteSqlCommand("set @result = FunctionReturnVarchar({0});", id, resultParameter);
var result = resultParameter.Value as string;

【讨论】:

    【解决方案2】:

    .Set&lt;TEntity&gt;() 用于由上下文支持的实体。

    您可以尝试解决方法

    DbConnection = connection = _context.Database.GetDbConnection();
    
    using(DbCommand cmd = connection.CreateCommand()) {
    
        cmd.CommandText = "select dbo.FunctionReturnVarchar(@id)";    
    
        cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.VarChar) { Value = id });
    
        if (connection.State.Equals(ConnectionState.Closed)) { connection.Open(); }
    
        var value = (string) await cmd.ExecuteScalarAsync();
    }
    
    if (connection.State.Equals(ConnectionState.Open)) { connection.Close(); }
    

    【讨论】:

    • 认为您的connection.Open[Async](); cmd.Execute[Async](); connection.Close[Async]() 应该包含在using (Database.GetService&lt;IConcurrencyDetector&gt;().EnterCriticalSection()) { ... } 中,因为_context.Database.GetDbConnection() 不要给您自己的 DbConnection 实例(您不是在处理它,不是您) .但我不确定。
    猜你喜欢
    • 1970-01-01
    • 2020-12-18
    • 2018-04-07
    • 2019-01-26
    • 2021-06-02
    • 2018-05-14
    • 2021-02-09
    相关资源
    最近更新 更多