2

当我尝试使用 DbCommand 将参数传递给存储过程时出现错误

返回错误:

过程或函数“Procedure_Name”需要未提供的参数“@TEID”。

这些是我的程序参数:

@PageNumber INT = 1,
@PageSize INT = 50,
@StartTime nvarchar(max) = -1 ,
@EndTime nvarchar(max) = -1 ,
@Month NVARCHAR(2) = -1,
@Year NVARCHAR(4) = -1,
@Day NVARCHAR(2) = -1,
@Hour NVARCHAR(2)=-1,
@TEID nvarchar(max) ,
@IgnoreIdlingTime int=120,
@DrivingTime int=300,--5 minutes by default
@CalculationFactor nvarchar(10)='speed'

我执行过程和传递参数的代码:

using (var context = new GPSModel())
{
    context.Database.Initialize(force: false);

    // Create a SQL command to execute the stored procedure
    var cmd = context.Database.Connection.CreateCommand();
    cmd.CommandText = "Procedure_Name";

    DbParameter TEIDParam = cmd.CreateParameter();
    TEIDParam.ParameterName = "@TEID";
    TEIDParam.DbType = System.Data.DbType.String;
    TEIDParam.Direction = ParameterDirection.Input;
    TEIDParam.Value = TEID;
    cmd.Parameters.Add(TEIDParam);

    context.Database.Connection.Open();

    var reader = cmd.ExecuteReader();
}

我试图删除@标志并发送SqlParameter而不是DbParameter但我仍然有同样的问题。

在我的存储过程非常复杂并且包含多集的情况下,有没有其他方法可以做到这一点

谢谢...

4

2 回答 2

6

您可以使用以下代码来解决错误。我已经添加了cmd.CommandType = CommandType.StoredProcedure;. 现在它可以正常工作了。

    var cmd = context.Database.Connection.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "Procedure_Name";
    DbParameter TEIDParam = cmd.CreateParameter();
    TEIDParam.ParameterName = "@TEID";
    TEIDParam.DbType = System.Data.DbType.String;
    TEIDParam.Direction = ParameterDirection.Input;
    TEIDParam.Value = TEID;
    cmd.Parameters.Add(TEIDParam);

当您使用存储过程时,您必须将CommandType属性设置为StoredProcedure,然后您应该将CommandText属性设置为存储过程的名称。当您调用其中一种方法时,该命令将执行此存储过程Execute

于 2018-04-02T07:14:31.743 回答
0

FOR EF 核心可以使用 fromSQL()

var tbl = new DataTable();
           tbl.Columns.Add("id", typeof(string));

        foreach (var item in imageChunkRequest.ChunkNames)
        {
               tbl.Rows.Add(item);

        }
 SqlParameter Parameter = new SqlParameter();
                Parameter.ParameterName = "@udt";
                Parameter.SqlDbType = SqlDbType.Structured;
                Parameter.Value = tbl;
                Parameter.TypeName = "dbo.StringList";

     _dbContext.Set<T>().FromSql("EXEC dbo.FindChunks @udt",Parameter);
于 2019-02-12T20:31:41.647 回答