[英]Calling existing Stored procedure using Entity Framework 6 with C#
我需要知道如何使用c#
在实体框架 6 Code First 中调用现有的存储过程。
以下是我正在使用的程序:
CREATE PROCEDURE proc_getEmployees
@departmentname varchar(50),
@sortCol varchar(30),
@sortdir varchar(25),
@searchString varchar(50)
AS
BEGIN
SET NOCOUNT ON;
declare @strSQl varchar(1000);
declare @strSQlwhere varchar(500);
declare @strSelectEndPart varchar(100);
set @strSQl = ';WITH employeetable as
(
select ROW_NUMBER() OVER (ORDER BY '+@sortCol+' '+@sortdir+' ) AS RowNumber,COUNT(*) over() as TotalRecords, ID,FirstName,LastName,Designation,DepartmentName,Contact,EmailAddress,Location from Employees ';
set @strSQlwhere = 'where DepartmentName = '''+@departmentname+'''';
set @strSQlwhere = @strSQlwhere+ ' and (Id like ''%' + @searchString + '%'' Or FirstName like ''%' + @searchString + '%'' Or LastName like ''%' + @searchString + '%'' Or Designation like ''%' + @searchString + '%'' Or DepartmentName like ''%' + @searchString + '%'' Or Contact like ''%' + @searchString + '%'' Or EmailAddress like ''%' + @searchString + '%'' Or Location like ''%' + @searchString + '%'')';
set @strSelectEndPart =') select * from employeetable';
set @strSQl = @strSQl +@strSQlwhere+@strSelectEndPart;
execute (@strSQl);
END
GO
我正在查询的表是具有以下结构的员工:
Column Type Length
ID int 4
FirstName varchar 50
LastName varchar 50
Designation varchar 50
DepartmentName varchar 50
Contact varchar 50
EmailAddress varchar 50
Location varchar 50
DBContext 类如下:
public class DevelopmentTestDatabaseContext :DbContext
{
public DevelopmentTestDatabaseContext() : base("name =DevelopmentTestDatabaseContext")
{
}
public virtual DbSet<Employee> EmployeeData { get; set; }
}
调用存储过程的方法如下:
public void GetEmployeeDataUsingProcedure()
{
object[] parameters = new SqlParameter[4];
List<EmployeeResultSet> lstEmployees = new List<EmployeeResultSet>();
try
{
using (var db = new DevelopmentTestDatabaseContext())
{
SqlParameter param = new SqlParameter("@departmentname", "IT");
parameters[0] = param;
param = new SqlParameter("@sortCol", "ID");
parameters[1] = param;
param = new SqlParameter("@sortdir", "asc");
parameters[2] = param;
param = new SqlParameter("@searchString", "ope");
parameters[3] = param;
var results = db.Database.SqlQuery<EmployeeResultSet>("proc_getEmployees @departmentname, @sortCol, @sortdir, @searchString", parameters);
db.Database.Log = query => System.Diagnostics.Debug.Write(query);
lstEmployees = results.ToList();
}
}
catch (Exception ex)
{
}
}
定义存储过程结果集的类如下:
public class EmployeeResultSet
{
public int rowNumber { get; set; }
public int totalRecords { get; set; }
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Designation { get; set; }
public string DepartmentName { get; set; }
public string Contact { get; set; }
public string EmailAddress { get; set; }
public string Location { get; set; }
}
请让我知道在调用存储过程之前是否需要做任何其他事情。 我是 EF6 的新手并且遇到了问题。 代码中缺少什么? 我需要在任何课程中进行一些更改吗?
我可以告诉一个问题的一件事是在您调用过程的方法中。 您将数组的所有元素设置为等于param
但您一直在更改param
。 您的所有元素都将等于param
的最终状态。 试试这个:
public void GetEmployeeDataUsingProcedure()
{
object[] parameters = new SqlParameter[4];
List<EmployeeResultSet> lstEmployees = new List<EmployeeResultSet>();
try
{
using (var db = new DevelopmentTestDatabaseContext())
{
parameters[0] = new SqlParameter("@departmentname", "IT");
parameters[1] = new SqlParameter("@sortCol", "ID");
parameters[2] = new SqlParameter("@sortdir", "asc");
parameters[3] = new SqlParameter("@searchString", "ope");
var results = db.Database.SqlQuery<EmployeeResultSet>("proc_getEmployees @departmentname, @sortCol, @sortdir, @searchString", parameters);
db.Database.Log = query => System.Diagnostics.Debug.Write(query);
lstEmployees = results.ToList();
}
}
catch (Exception ex)
{
//log it or something
}
}
可能还有其他问题,但无需过多研究,我需要有关您遇到的特定错误或行为的更多信息。
您也可以尝试输入数据库的全名:
"MyDatabase.MySchema.proc_getEmployees @departmentname, @sortCol, @sortdir, @searchString"
编辑根据您的意见:
快速闪避,我发现了这个。 从本质上讲,它指出,如果您在查询中将数字转换为int
,则应该没问题。 所以而不是:
select * from employeetable
尝试:
select CAST(RowNumber as int) as RowNumber,
CAST(TotalRecords as int) as TotalRecords,
CAST(ID as int) as ID,
FirstName,
LastName,
Designation,
DepartmentName,
Contact,
EmailAddress,
Location
from employeetable
顺便说一句,但您并不是真的有必要使用动态 SQL。 特别是当搜索条件是字符串时,坚持使用参数化查询会更安全。 在您的情况下,您可以执行以下操作:
;WITH employeetable as
(
select
CASE WHEN @sortDir = 'asc' THEN
ROW_NUMBER() OVER (ORDER BY
CASE WHEN @sortCol = 'ID' THEN ID END,
CASE WHEN @sortCol = 'FirstName' THEN FirstName END,
CASE WHEN @sortCol = 'LastName' THEN LastName END,
CASE WHEN @sortCol = 'Designation' THEN Designation END,
CASE WHEN @sortCol = 'DepartmentName' THEN DepartmentName END,
CASE WHEN @sortCol = 'Contact' THEN Contact END,
CASE WHEN @sortCol = 'EmailAddress' THEN EmailAddress END,
CASE WHEN @sortCol = 'Location' THEN Location END
ASC) ELSE ROW_NUMBER() OVER (ORDER BY
CASE WHEN @sortCol = 'ID' THEN ID END,
CASE WHEN @sortCol = 'FirstName' THEN FirstName END,
CASE WHEN @sortCol = 'LastName' THEN LastName END,
CASE WHEN @sortCol = 'Designation' THEN Designation END,
CASE WHEN @sortCol = 'DepartmentName' THEN DepartmentName END,
CASE WHEN @sortCol = 'Contact' THEN Contact END,
CASE WHEN @sortCol = 'EmailAddress' THEN EmailAddress END,
CASE WHEN @sortCol = 'Location' THEN Location END
DESC) END AS RowNumber,
COUNT(*) over() as TotalRecords, ID,FirstName,LastName,Designation,
DepartmentName,Contact,EmailAddress,Location from Employees
where DepartmentName = @departmentname and
(Id like '%' + @searchString + '%' Or FirstName like '%'
+ @searchString + '%' Or LastName like '%' + @searchString + '%'
Or Designation like '%' + @searchString + '%' Or
DepartmentName like '%' + @searchString + '%' Or
Contact like '%' + @searchString + '%' Or
EmailAddress like '%' + @searchString + '%' Or
Location like '%' + @searchString + '%')
)
select * from employeetable
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.