无法在 Entity Framework 中的 DbCommand 中传递参数
Cannot Pass Parameter in DbCommand in Entity Framework
当我尝试使用 DbCommand 将参数传递给存储过程时出现错误
返回错误:
Procedure or function 'Procedure_Name' expects parameter '@TEID', which was not supplied.
这些是我的程序参数:
@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
但我仍然遇到同样的问题。
如果我的存储过程非常复杂并且包含多个集,是否有任何其他方法可以做到这一点
谢谢...
您可以使用以下代码解决错误。我已经添加了 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
方法之一时,该命令将执行此存储过程。
对于 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);
当我尝试使用 DbCommand 将参数传递给存储过程时出现错误
返回错误:
Procedure or function 'Procedure_Name' expects parameter '@TEID', which was not supplied.
这些是我的程序参数:
@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
但我仍然遇到同样的问题。
如果我的存储过程非常复杂并且包含多个集,是否有任何其他方法可以做到这一点
谢谢...
您可以使用以下代码解决错误。我已经添加了 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
方法之一时,该命令将执行此存储过程。
对于 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);