我对此感到有点沮丧,并希望有人能澄清发生了什么.
我想使用我的LINQ-to-SQL数据上下文以编程方式禁用外键约束.看起来这应该像以下一样简单:
context.ExecuteCommand( "ALTER TABLE {0} NOCHECK CONSTRAINT {1}", "MyTable", "FK_MyTable_MyOtherTable" );
不幸的是,这段代码因SQL错误"@ p0'附近的语法不正确"而遭到轰炸.
当我启动分析器时,我发现生成的SQL是:
exec sp_executesql
N'ALTER TABLE @p0 NOCHECK CONSTRAINT @p1',
N'@p0 varchar(4000),@p1 varchar(4000)',
@p0=N'MyTable',
@p1=N'FK_MyTable_MyOtherTable'
Run Code Online (Sandbox Code Playgroud)
从我在SQL Books Online和LINQ-to-SQL文档中可以找到的所有内容中,这应该可行.
我改用了这个:
context.ExecuteCommand( String.Format( "ALTER TABLE {0} NOCHECK CONSTRAINT {1}", "MyTable", "FK_MyTable_MyOtherTable" ) );
它有效,但它有点失败了能够将参数传递给.ExecuteCommand()的目的.
那么这在LINQ-to-SQL,SQL Server中是一种什么样的怪癖,还是我真的很困惑?
任何见解将不胜感激!
有没有人有任何见解,为什么在动态加载(使用Assembly.CreateInstance)程序集内部调用Trace调用时不会产生输出?奇怪的是,Debug.WriteLine在程序集内工作正常,并且正在进行动态加载的程序集内的Trace调用也可以正常工作.我已经确认Trace.Listeners包含正确的侦听器对象(与Debug.Listeners相同)但是对Trace的调用只是不生成任何输出.
这对我来说是一个巨大的诊断问题,因为我的整个应用程序都是通过自定义TraceListener进行日志记录.
更新:(从下面的评论)我正在使用CSharpCodeProvider动态构建程序集,但我没有/d:TRACE在CompilerParameters.CompilerOptions中提供开关.因此,TRACE没有在程序集中定义,我对Trace的调用基本上被忽略了.另外值得一提的是,我设置CompilerParameters.IncludeDebugInformation = true这可以解释为什么我正在调试,即使我没有明确设定/d:DEBUG在CompilerParameters.CompilerOptions.这只是猜测 - 在MSDN文档中没有任何内容表明这是真的.
这里的底线是,当使用CSharpCodeProvider动态编译源时,任何特定于程序集的内容都取决于您明确定义.