gpt4 book ai didi

c# - 拦截并更改应用程序生成的 sql 查询

转载 作者:行者123 更新时间:2023-12-04 10:20:18 26 4
gpt4 key购买 nike

我有一个插件正在查询和获取一些数据的情况,我无法将插件中的查询更改为它的 DLL。我已经使用 SQL 事件探查器检查了它正在执行的查询,并且根据我们的要求,我们已经更改了该区域的数据库架构,因此中断了该插件查询。

有什么方法可以拦截查询并更改它吗?

就像我们在像 Angular 这样的 JS 框架中所做的那样,我们有拦截器来接收每个调用并在 header 中添加 token ,我们是否有类似的东西来拦截所有传出的 SQL 调用并更改它?

也许中间件可以在这里工作,就像我在 .NET-Core 或某种处理程序中一样?

最佳答案

可以在拦截器中更改查询。

EF 6

实现IDbCommandInterceptor,例如:

class EFCommandInterceptor: IDbCommandInterceptor
{

public void NonQueryExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
// Manipulate the command text, etc. here...
command.CommandText += " OPTION (OPTIMIZE FOR UNKNOWN)";
}

...

注册:

public class FE6CodeConfig : DbConfiguration
{
public FE6CodeConfig()
{
this.AddInterceptor(new EFCommandInterceptor());
}
}

查看更多详情 here

EF核心

EF Core 也有拦截器 nowadays .您需要 EF Core 3 或更高版本。

虽然 EF Core 3 需要 .NET Standard 2.1(因此 .NET Core 3 及更高版本),但 EF Core 3.1 支持 .NET Standard 2.0,因此 .NET Core 2 和 . NET 框架 4.6.1+

DbCommandInterceptor 的继承,例如

public class HintCommandInterceptor : DbCommandInterceptor
{
public override InterceptionResult ReaderExecuting(
DbCommand command,
CommandEventData eventData,
InterceptionResult result)
{
// Manipulate the command text, etc. here...
command.CommandText += " OPTION (OPTIMIZE FOR UNKNOWN)";
return result;
}
}

注册:

services.AddDbContext(b => b
.UseSqlServer(connectionString)
.AddInterceptors(new HintCommandInterceptor())

关于c# - 拦截并更改应用程序生成的 sql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60894808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com