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

C# 如何在C代码中找到非常长的SQL查询的确切错误位置?,c#,sql,sql-server,C#,Sql,Sql Server,我在C代码中有很长的SQL查询,有时我得到的错误不够清楚,无法理解在SQL查询中错误发生的位置。 是否有任何方法或技巧可以找出SQL查询的哪一行导致了错误 例如,我有一段代码: using System.Data.SqlClient; SqlConnection conn = ... string my_query = " select * from [this_is_just_sample_command] ... " + " select top 1 from

我在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查询的确切部分。

我多年来一直在努力解决这类问题;我帮助维护一个应用程序,其中有许多大小惊人的查询

找到这些问题的唯一可靠解决方案是SQLServerManagementStudio。通常,只要将查询文本粘贴到SSMS查询框中,就会突出显示问题。有时,运行查询也是识别问题所必需的

对于参数化查询,SSMS接受这些查询

对于使用代码构造的查询,我发现必须捕获构造的查询,并在调试模式下将其转储到案例中的某个HTML注释中

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

使用存储代码?碰巧,my org的应用程序部署过程使得对DBMS对象(如存储过程)进行更新变得困难且不可靠。如此大的参数化/预处理语句才是正确的选择


祝您好运。

提供的列名称或值数与表定义不匹配。实际上只能在一个地方插入。这意味着您尝试插入的列数与INSERT INTO子句中定义的列数不匹配。例如,INSERT INTO dbo.MyTable Col1从dbo.OtherTable中选择Col1、Col2或INSERT INTO dbo.MyTable Col1、Col2值'SomeVal';两者都会生成错误。?在my_命令上放置断点。ExecuteOnQuery;并将my_查询的值复制到SSMS,然后在那里尝试。如前所述,它很可能是一个INSERT语句。不要首先使用长SQL查询。将代码提取到存储过程中。或者复制查询字符串并尝试在SSMS或Azure Data StudioShort answer中验证/执行它-对此没有通用答案。SQL错误不够具体,无法确定错误在C中的位置。非常感谢。我只是不理解这里存储代码的主题。存储过程用于纯SQL查询中,当您在C中正确查询时,它没有用处。据我所知,C本身并没有这样的东西。对不起,这个问题太天真了。存储过程/函数是SQL Server中的SQL样式代码。您可以使用EXEC[dbo]MyProcedure param1 param2 param3这样的查询来运行它;在c~示例中搜索sql server存储过程以查找一些教程示例。