简体   繁体   中英

How can I get a resultset and a RAISERROR result from a SQL Server Stored Procedure when reading with Dapper?

I have a stored procedure which retrieves some data, does some processing and may detect an error. This test procedure 'dummies' this behaviour:

create proc proc_TEST as 
SELECT name FROM sys.tables; 
RAISERROR (N'There is something wrong with this data', 16, 1);
GO

I'm using Dapper to query the data, using C# code like this:

var rows = new List<Table>();
using (var con = new SqlConnection(connectionString)) {
    try {
        var command = new CommandDefinition("proc_TEST", commandType: CommandType.StoredProcedure);
        var reader = await con.ExecuteReaderAsync(command);
        var parser = reader.GetRowParser<Table>(typeof(Table));
        while (await reader.ReadAsync()) {
            var row = parser(reader);
            rows.Add(row);
        }
        // Do something with the rows here
    } catch (SqlException se) {
        // THIS NEVER HAPPENS
        Console.WriteLine(se.Message);
        // Do something else with the rows here
    }
}

struct Table {
    public string Name { get; set; }
}

This code never sees the error - the SqlException is never raised

If I revise the stored procedure so that it doesn't return any data:

create proc proc_TEST as 
--SELECT name FROM sys.tables; 
RAISERROR (N'There is something wrong with this data', 16, 1);
GO

Then the SqlException is caught, but clearly I have nothing in 'rows' to process.

How can I get the data AND the SqlException from my stored procedure?

The issue is that error and info messages are returned only after the preceding result set is consumed ( SELECT statement results) and you navigate to the subsequent results (which include the errors) using NextResult .

Try adding NextResultAsync to raise the error and avoid undetected SqlExcpetions :

do (
    while (await reader.ReadAsync()) {
        var row = parser(reader);
        rows.Add(row);
    }
} while(await reader.NextResultAsync());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM