代码之家  ›  专栏  ›  技术社区  ›  David Jones

dbcontext。Database.ExecuteSqlRaw无法返回字符串

  •  0
  • David Jones  · 技术社区  · 3 年前

    我正试图使用实体框架从Blazor应用程序中的SQL Server存储过程返回一个字符串。

    这是继 another GitHub post

    in ap代码是

    string outList = "";
    
    var xparams = new SqlParameter[] {
        new SqlParameter("@Start", 10),
        new SqlParameter("@End", 20),
        new SqlParameter("@output", outList) { Direction = ParameterDirection.Output }
    };
    
    _context.Database.ExecuteSqlRaw("exec GetMe  @Start, @End, @output output", xparams);
    var ReturnValue = ((SqlParameter)xparams[2]).Value;
    

    问题是返回值只是第一个字符。存储过程参数包括:

    @Start int,
    @End int,
    @output varchar(50) output
    

    任务是:

    Select @output = 'This is some text';
    Return
    
    • 如果我使用 Set 而不是 Select ,结果相同
    • 如果我使用像int、float、real、date这样的标量类型,则返回值是正确的
    • 如果我将字符串初始化为非空,结果仍然相同
    • 存储过程在SSMS中运行正常

    我想这与多维数据有关。

    0 回复  |  直到 3 年前
        1
  •  2
  •   marc_s MisterSmith    3 年前

    您可以通过更改输出来解决问题 SqlParameter 通过添加诸如 SqlDbType.NVarChar SqlDbType.VarChar

    这是正确的代码

    var xparams = new SqlParameter[] {
                      new SqlParameter("@Start", 10),
                      new SqlParameter("@End", 20),
                      new SqlParameter("@output", SqlDbType.NVarChar, 4000) { Direction = ParameterDirection.Output }
                  };
    
    SchoolContext _context = new SchoolContext();
    
    _context.Database.ExecuteSqlRaw("exec GetMe  @Start, @End, @output output", xparams);
    var ReturnValue = ((SqlParameter)xparams[2]).Value;
    

    Sql参数 有7个构造函数,则使用构造函数#1,但应该使用构造函数#2或#3:

    1. SqlParameter(string parameterName, object value)
    2. SqlParameter(string parameterName, SqlDbType dbType, int size)
    3. SqlParameter(string parameterName, SqlDbType dbType)
    4. SqlParameter()
    5. SqlParameter(string parameterName, SqlDbType dbType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value)
    6. SqlParameter(string parameterName, SqlDbType dbType, int size, ParameterDirection direction, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, bool sourceColumnNullMapping, object value, string xmlSchemaCollectionDatabase, string xmlSchemaCollectionOwningSchema, string xmlSchemaCollectionName)
    7. SqlParameter(string parameterName, SqlDbType dbType, int size, string sourceColumn)