C# 使用Dapper的通用存储过程
考虑以下C代码: 这个查询是可实现的,我可以将它用于我项目中的任何表 我可以使用存储过程复制此选择: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正在工作?您可以在存储过程中创建动态查询,其中您可以将表名作
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