如何在C#代码中找到非常长的SQL查询的确切错误位置



我在C#代码中有很长的SQL查询,有时我得到的错误不够清楚,无法理解错误发生在SQL查询的哪里。有什么方法或技巧可以找出SQL查询的哪一行导致了错误?

例如,我有一个代码块:

using System.Data.SqlClient;
SqlConnection conn = ...
string my_query =
" select * from [this_is_just_sample_command] ... " +
" select top 1 from [this_is_just_example_command] ... " +
" select top 10 from [hundreds_of_different_commands] ... " +
" select top 100 from [written_just_to_satisfy_the_admin_who_closed_the_already_clear_question] ... " ;
using (SqlCommand my_command = new SqlCommand (my_query, conn))  
{
my_command .ExecuteNonQuery();
}

例如,我收到这个错误:

列名或提供的值数与表不匹配释义

它可以在我的SQL查询中的任何位置。我试图将一些有意的错误放在SQL查询的不同位置,看看有意的错误是发生在未知错误之前还是之后。但这个把戏也于事无补。

我的问题不是关于这个特定的错误。我正试图找到一种方法来查找任何SQL查询中错误触发器的位置。

有什么建议吗?理想情况下,我希望接收触发错误的SQL查询的确切部分。

我多年来一直在与这种问题作斗争;我帮助维护一个应用程序,该应用程序有许多大小惊人的查询。

我发现这类问题的唯一可靠的解决方案是SQL Server Management Studio。通常,只需将查询的文本粘贴到SSMS查询框中就可以突出显示问题。有时,运行查询也是识别问题所必需的。

在参数化查询的情况下,SSMS接受这些查询。

在使用代码构建查询的情况下,我发现我必须捕获构建的查询并将其转储到某个位置(在我的情况下是在调试模式下将其转储为HTML注释(。

毫无疑问,这是一种痛苦。我通常会尝试重构大型查询,使它们更容易推理和调试。我对查询格式非常敏感,以使它们可读,甚至嵌入到代码中。

使用存储的代码?碰巧,我的组织的应用程序部署过程使得对存储过程等DBMS对象进行更新变得困难且不可靠。因此,大型参数化/准备好的语句是可行的。

祝你好运。

最新更新