Simple.Data系统存储过程不执行

Simple.Data System Stored Procedure does not execute

我有一个简单的 Simple.Data 连接到我的数据库,我想在该连接上执行名为 sys.sp_MSforeachtable 的系统存储过程。 (我作为数据库 'sa' 用户连接)

我的代码如下所示:

var emx = Database.OpenConnection(@"Data Source=MyServer;Initial Catalog=MyDatabase;Integrated Security=False;User ID=sa;Password=BigEars;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;");    
emx.Sys.sp_MSForEachTable("DISABLE TRIGGER ALL ON ?");    
emx.Sys.sp_MSForEachTable("ALTER TABLE ? NOCHECK CONSTRAINT ALL");    
emx.Sys.sp_MSForEachTable("TRUNCATE TABLE ?");
emx.Sys.sp_MSForEachTable("ALTER TABLE ? CHECK CONSTRAINT ALL");
emx.Sys.sp_MSForEachTable("ENABLE TRIGGER ALL ON ?");

如果我如下所示从存储过程中运行这些命令并从 Simple.Data 调用它,它工作正常。

CREATE PROCEDURE [AdminTest].[emx__RemoveAllData] 
AS
BEGIN
    EXEC sp_MSForEachTable 'DISABLE TRIGGER ALL ON ?'       
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'       
    EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'       
    EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'     
    EXEC sp_MSForEachTable 'ENABLE TRIGGER ALL ON ?'        
END

为此,我的C#代码如下:

emxDb.AdminTest.emx_RemoveAllData();

此外,如果我从 Visual Studio 等运行单独的命令,它工作正常。

但是如果我从 C# 运行它 Simple.Data 它执行时没有错误 但什么都不做!

我也试过如下使用命名参数:

emx.Sys.sp_MSforeachtable(Command1: "DISABLE TRIGGER ALL ON ?");

但这也无济于事。

谁能看出为什么这不起作用?

最终解决方法很简单:/以下代码导致了错误

emxDb.AdminTest.emx_RemoveAllData();

错误是通过修改 Simple.Data 正则表达式以包含“”字符而激活的。因此,Simple.Data 现在将在其名称解析中包含“”(下划线字符)。

所以最后的问题是底层存储过程被命名为:

[AdminTest].[emx__RemoveAllData]

(注意双下划线字符!

这导致 Simple.Data 安静地失败,我的代码继续。如果我没有更改默认 Simple.Data 正则表达式,就不会发生这种情况。