Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Dapper的通用存储过程_C#_Stored Procedures - Fatal编程技术网

C# 使用Dapper的通用存储过程

C# 使用Dapper的通用存储过程,c#,stored-procedures,C#,Stored Procedures,考虑以下C代码: 这个查询是可实现的,我可以将它用于我项目中的任何表 我可以使用存储过程复制此选择: CREATE PROCEDURE GetSomething @Id INT AS BEGIN SELECT * FROM Something WHERE Id= @Id; END 从Dapper开始称之为: 但正如你们所看到的,从这个过程中,我调用了table 如何使存储过程可重用/通用,以调用任何表,如var query正在工作?您可以在存储过程中创建动态查询,其中您可以将表名作

考虑以下C代码:

这个查询是可实现的,我可以将它用于我项目中的任何表

我可以使用存储过程复制此选择:

CREATE PROCEDURE GetSomething

@Id INT

AS
BEGIN
    SELECT * FROM Something WHERE Id= @Id;
END
从Dapper开始称之为:

但正如你们所看到的,从这个过程中,我调用了table


如何使存储过程可重用/通用,以调用任何表,如var query正在工作?

您可以在存储过程中创建动态查询,其中您可以将表名作为参数传递,然后通过传递tablename和id参数从dapper调用它

-- EXEC GetSomething 'Something',2
Create PROCEDURE GetSomething
@tableName as nvarchar(150),
@Id as INT
AS
BEGIN
    Declare @rawQuery nvarchar(250);
    SET @rawQuery = 'SELECT * FROM ' + @tableName + ' WHERE Id='+ Cast(@Id as nvarchar); 
    EXECUTE sp_executesql  @rawQuery
END 

您可以在存储过程中创建动态查询,其中可以将表名作为参数传递,然后通过传递tablename和id参数从dapper调用它

-- EXEC GetSomething 'Something',2
Create PROCEDURE GetSomething
@tableName as nvarchar(150),
@Id as INT
AS
BEGIN
    Declare @rawQuery nvarchar(250);
    SET @rawQuery = 'SELECT * FROM ' + @tableName + ' WHERE Id='+ Cast(@Id as nvarchar); 
    EXECUTE sp_executesql  @rawQuery
END 

为表名添加另一个参数。总而言之,你的方法几乎不为你节省任何东西,并且开始打开你的整个应用程序,进入一个充满黑客可能性的世界。我希望你不会,你能解释一下如何将这种方法注入SQL以及如何正确地进行吗?为表名添加另一个参数。总之,你的方法几乎不会为你节省任何东西,并开始打开你的整个应用程序,进入一个充满黑客可能性的世界。我希望你不会介意,你能解释一下这种方法是如何被SQL注入的,以及如何正确地进行吗?-1我的观点:提倡一种非常容易受到SQL注入黑客攻击的方法。如果您要推荐此选项,请在此选项上推荐一个参数化的动态SQLAgree with@CaiusJard。如果表名'Something'未受保护地传入,那么'Something where 1=2;扔东西;选择*'。如果您看不出它有什么问题,请将它粘贴到查询窗口中并仔细查看,但不要运行它。其次,创建和删除每个查询的效率极低。执行原始SQL将使SQL Server能够做得更少,并识别可重用的查询计划。如果您从我这里传递标识符-1,请使用quotename:提倡一种极易受到SQL注入攻击的方法。如果您要推荐此选项,请在此选项上推荐一个参数化的动态SQLAgree with@CaiusJard。如果表名'Something'未受保护地传入,那么'Something where 1=2;扔东西;选择*'。如果您看不出它有什么问题,请将它粘贴到查询窗口中并仔细查看,但不要运行它。其次,创建和删除每个查询的效率极低。执行原始SQL将允许SQLServer执行更少的操作,并识别可重用的查询计划。如果您要传递标识符,则使用quotename
-- EXEC GetSomething 'Something',2
Create PROCEDURE GetSomething
@tableName as nvarchar(150),
@Id as INT
AS
BEGIN
    Declare @rawQuery nvarchar(250);
    SET @rawQuery = 'SELECT * FROM ' + @tableName + ' WHERE Id='+ Cast(@Id as nvarchar); 
    EXECUTE sp_executesql  @rawQuery
END