SQL 调试限制
更新:2007 年 11 月
本主题适用于:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
速成版 |
||||
标准版 |
||||
专业团队版 |
表格图例:
适用 |
|
不适用 |
|
默认情况下隐藏的一条或多条命令。 |
SQL 调试有许多常规限制,本节中将描述这些限制。
多层 SQL 调试
调试多层应用程序时,不能使用“逐语句”从应用程序层(C#、Visual Basic 或 C++)中的代码进入 SQL Server 2005(T-SQL 或 SQL/CLR)上的代码。而应当在存储过程代码中设置断点,并按“继续” (F5) 执行代码直到断点。您还可以使用“运行到光标处”到达所需的点而不使用断点。注意,在 SQL Server 2005 层的内部,可以在 T-SQL 和 SQL/CLR 代码之间自由进出。
而且,也不能从存储过程代码返回到调用该存储过程的层上的代码。如果要在返回应用程序层之后继续进行调试,请在应用程序代码中调用存储过程的点之后设置断点。
连接池是提高性能的技术。当应用程序关闭它的数据连接时,SQL Server 连接并未完全关闭,而是保留在可以重用的池中,以便应用程序随后试图重新打开该连接时使用。但是,当通过连接池重新建立连接时,不重新启用 SQL 调试。
调试时,应当临时禁用连接池。为此,可在用来连接到 SQL Server 的连接字符串中设置“Pooling=false”。完成调试后,从连接字符串中移除该属性,默认情况下将启用池。
托管应用程序可以使用用于 SQL Server 的 .NET Framework 数据提供程序连接到 SQL Server 数据源,这比用 OLE DB 或 ODBC 连接可提供更好的性能。在同一个调试器会话中既可以进行托管调试,也可以进行 SQL 调试。
如果有托管应用程序正在运行,并且使用调试器附加到该应用程序,系统将让您选择希望进行什么样的调试。如果要进行 SQL 调试,必须选择 SQL 调试,如果要调试 SQL/CLR 代码,则还必须指定托管调试。
可以在附加到运行的应用程序后再进行 SQL 调试。但请注意,只能对那些在完成附加之后所创建的数据库连接进行调试。因此,如果应用程序调用了一个需要执行很长时间的存储过程,则不能附加到调用该存储过程的连接,而只能附加到在已连接到应用程序之后调用该存储过程的新连接。
如果通过用 OleDbDataAdapter 建立的连接进行调试,命中断点后等待一段较长的时间将导致连接超时。如果试图在此超时过后继续调试(例如,从“调试”菜单选择“继续”),则调试器将退出而不是继续执行。这是预期的行为。调试器退出是因为 OleDbDataAdapter(与 SqlDataAdapter 不同)在发生超时不引发异常。若要解决这个问题,请在使用 OleDbDataAdapter 时将超时值设置为一个较大的数字。
有关设置 .NET Framework 数据提供程序的超时值的信息,请参见 .NET Framework 类库文档中的 OleDbCommand.CommandTimeout 属性和 SqlCommand.CommandTimeout 属性。
有关 MDAC 技术的最新新闻,请参见 Microsoft 通用数据访问网站 https://www.microsoft.com/data。
其他限制
触发器必须被激发后才能进行调试:不能直接调试触发器。而应当在将导致触发器被激发的存储过程中开始调试。
在运行时调试中,一系列子选择(例如,在联合中的选择)可以填充网络缓冲区。这可以导致通常运行良好的代码在调试期间暂停运行。这时若要获得更多数据,请使用 RecordSet.MoveNext 和 RecordSet.NextRecordSet。
如果存储过程名包含引号,则可能会收到调试器错误信息。有关更多信息,请参见当调试的过程的名称包含引号时出现错误。
不会自动修改缓存值。不能总是指望由 SQL 解释器缓存的局部变量或参数的更改将在逐句通过 SQL 语句的时间段内生效。虽然可能修改了值,但可能永远检查不出来此更改。无法强制刷新缓存值。缓存值之所以存在,是因为 SQL Server 执行计划确定不会为每个语句执行或引用动态加载一些变量的值。有关更多信息,请在 SQL Server 2005 文档中搜索“SHOWPLAN”。
在调试存储过程的同时不能附加到本机 SQL Server 进程。