我有一个简单的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 ?");
但这对任何一方都没有帮助。
任何人都可以看到为什么这不起作用?
答案 0 :(得分:1)
最后解决方案很简单:/以下代码导致错误
emxDb.AdminTest.emx_RemoveAllData();
通过修改Simple.Data Regex以包含' '来激活的错误。字符。因此,Simple.Data现在将在其名称解析中包含' '(下划线字符)。
因此最终的问题是底层的存储过程被命名为:
[AdminTest]。[emx__RemoveAllData]
(请注意双下划线字符!
这导致Simple.Data安静地失败,我的代码继续。如果我没有更改默认的Simple.Data Regex,那就不会发生。