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 正则表达式,就不会发生这种情况。
我有一个简单的 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 正则表达式,就不会发生这种情况。