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

时间:2015-01-07 16:04:58

标签: 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 ?");

但这对任何一方都没有帮助。

任何人都可以看到为什么这不起作用?

1 个答案:

答案 0 :(得分:1)

最后解决方案很简单:/以下代码导致错误

emxDb.AdminTest.emx_RemoveAllData();

通过修改Simple.Data Regex以包含' '来激活的错误。字符。因此,Simple.Data现在将在其名称解析中包含' '(下划线字符)。

因此最终的问题是底层的存储过程被命名为:

[AdminTest]。[emx__RemoveAllData]

(请注意双下划线字符!

这导致Simple.Data安静地失败,我的代码继续。如果我没有更改默认的Simple.Data Regex,那就不会发生。