2011-06-14 57 views
19

我想知道是否有办法检索在数据库服务器上执行的(完整)sql语句。
我发现了一些了,但它不完全是我想什么:检索LINQ to sql语句(IQueryable)WITH参数

IQueryable<SomeType> someQuery = ... 
string command = dataContext.GetCommand(query).CommandText; 

在我的情况下,这给了我一个命令字符串是这样的:

SELECT TOP (50) [t0].[ID], .... 
FROM [dbo].[someTable] AS [t0] 
WHERE ([t0].[someColumn] IS NOT NULL) AND (([t0].[someColumn]) IN (@p0)) 

在数据库还有的执行:

exec sp_executesql N'SELECT TOP (50) [t0].[ID], ... 
FROM [dbo].[someTable] AS [t0] 
WHERE ([t0].[someColumn] IS NOT NULL) AND (([t0].[someColumn]) IN (@p0, @p1))',N'@p0 int,@p1 int',@p0=401,@p1=201 

有没有办法从C#代码中检索这个'完整'语句(所以也是参数值)?

+0

查看类似的问题(重:生成SQL)这里http://stackoverflow.com/questions/265192/how-to -get-the-generated-sql-statment-from-a-sqlcommand-object它可能提供一些见解。 – 2011-06-14 13:09:41

回答

8

一旦你得到命令,你可以打印CommandText,然后循环通过Parameters集合并打印所有的单个参数。

另外还有linq-to-sql debug visualizer它在调试模式下也是如此。

一个非常好的工具来查看查询,因为他们正在发生的是Linq-to-sql profiler

5
(SqlCommand)dataContext.GetCommand(query) 

会让你访问Parameters集合。

+3

问题要求提供完整的SQL语句。 – 2011-06-14 13:06:56

+0

@John当向SqlServer发送参数化查询时,没有完整的SQL语句这样的事情,首先发送带有占位符的CommandText作为参数,然后将参数与它们的类型和值一起发送。 – cdel 2011-06-14 13:12:41

+3

同意,但你的答案不提供这种有用的背景。如果您提供更全面的答案,质量会更高,观众将能够快速将其与问题联系起来,并且我将删除downvote。 – 2011-06-14 13:15:48

2

你也可以使用在DataContext的日志属性日志生成的SQL (它包含的命令文本和参数)。

只需设置YourDataContext.Log = SomeTextWriter。它可以被写入一个文件(Log = new StreamWriter(@"c:\temp\linq.log"))或调试窗口,see this post

+0

这会记录每一条语句,对吧? – TweeZz 2011-06-15 12:36:08

+1

是的,所有由该DataContext生成的语句(包括选择,插入,更新)。 – jaraics 2011-06-15 14:33:50

1

您还可以看到生成的SQL查询,如果您的 IQueryable<T>一个实例,并调用.ToString()方法。
例如:

var db = new DbContext(); 
IQueryable<Blog> query = db.Blog.Where(tt=> tt.Id > 100).OrderByDescending(tt=>tt.Id); 
var sqlString = query.ToString(); 
Console.WriteLine(sqlString); 

这将生成的输出:

SELECT [Extent1].[Id] AS [Id], 
[Extent1].[Title] AS [Title], 
[Extent1].[Author] AS [Author], 
[Extent1].[Text] AS [Text], 
[Extent1].[CreatedAt] AS [CreatedAt], 
[Extent1].[UpdatedAt] AS [UpdatedAt] 
FROM [dbo].[Blogs] AS [Extent1] 
WHERE [Extent1].[Id] > 100 
ORDER BY [Extent1].[Id] DESC 
+0

问题是如何检索完整的声明,但您的解决方案不包含参数。 – ViRuSTriNiTy 2017-11-17 13:16:52

+0

它会打印出变量,如果你使用任何(我不使用任何我的例子)。它不会打印变量的值。 (但这很简单) – 2017-11-17 18:29:01