gpt4 book ai didi

.net - SQL错误 "Subquery returned more than 1 value..."在SqlClient中不会引发异常

转载 作者:行者123 更新时间:2023-12-02 18:02:04 26 4
gpt4 key购买 nike

简介

我在 .Net 4.0.30319 SP1Rel 中遇到 SqlClient 问题,当我的存储过程产生以下错误时,不会引发异常:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

我创建了一个小程序和存储过程来演示这一点。 Sql Server 版本为 9.0.4053。

代码示例

存储过程

create proc test
as
select case (select 1 union select 2) when 1 then 1 else 2 end

.Net 控制台应用

using System;
using System.Data;
using System.Data.SqlClient;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection("<your connection string>");
conn.Open();

SqlCommand cmd = new SqlCommand("test", conn);
cmd.CommandType = CommandType.StoredProcedure;
try
{
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
Console.WriteLine("Finished");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}

Console.ReadKey();
}
}
}

运行此应用程序只会将“完成”写入控制台。

在 SQL Server Management Studio 中运行存储过程“test”将在结果 Pane 中报告错误,如下所示:

Msg 512, Level 16, State 1, Procedure test, Line 3 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

预期行为

通过以下示例替换存储过程,将给出预期的 System.Data.SqlClient.SqlException。

引发错误

alter proc test
as
raiserror('Not good at all!', 16, 1)

替代问题

我发现的一些其他定义也不会引发异常。

引发错误

alter proc test
as
select case (select 1 union select 2) when 1 then 1 else 2 end
raiserror('Not good at all!', 16, 1)

这表明 select 语句停止执行存储过程。

除以零

alter proc test
as
select 1/0

我的结论是SqlClient无法正确识别tSql批处理的错误状态。有没有人遇到过这个并找到解决方案?我始终相信 .Net 框架会在任何 tSql 错误上引发异常。

最佳答案

感谢 Martin 的有用且迅速的评论,我找到了这种奇怪行为的原因。

过去,一位程序员将读取器上的读取包装在测试中,以查看是否有任何行,如下所示:

SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

if (reader.HasRows)
{
while (reader.Read()) { /* Do Something */ }
}

我不知道为什么,因为当没有行时,read() 方法将在第一次调用时返回 false。

无论如何,当 tSQL 中发生错误时,HasRows 属性返回 false,并且从未调用 Read() 方法。因此,SQL 错误不会透露给 SqlClient,也不会引发异常。

您可以将此代码片段添加到示例项目中,紧接在 ExecuteReader 之后,无论是否测试 HasRows,然后查看效果。

关于.net - SQL错误 "Subquery returned more than 1 value..."在SqlClient中不会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11155739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com