po_saa Ответов: 1

Как передать ошибку (некритическую) с помощью RAISERROR или чего-то еще в код C# и обработать ее, не прерывая хранимую процедуру


создание и заполнение тестовой таблицы

declare @jj nvarchar(MAX) = N'[
{"text":"10","f_date":"1/11/20"},
{"text":"11","f_date":"1/11/21"},
{"text":"12","f_date":"1/11/22"}]';

select * into tt from OPENJSON(@jj) with ([text] nvarchar(50),f_date smalldatetime)


вот хранимая процедура

CREATE or alter PROCEDURE PTest
	-- Add the parameters for the stored procedure here
	--@Param1 int = 0
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	SELECT * from ttable
		 RAISERROR (N'Message %s', -- Message text.  
			   10, -- Severity,  
			   1, -- State,
			   N'first'
			   )
			   with nowait;
	SELECT * from ttable
		 RAISERROR (N'Message %s', -- Message text.  
           10, -- Severity,  
           1, -- State,
		   N'second'
		   )
		   with nowait;
END
GO


вопрос:

как передать ошибку (некритическую) с помощью RAISERROR или чего-то еще в код C# и обработать ее, не прерывая хранимую процедуру

Что я уже пробовал:

MSDN, C#, Transact-SQL, .NET, Microsoft SQL Server

1 Ответов

Рейтинг:
5

po_saa

решенный

вот этот код

class Program
  {
      static string sqlconn = string.Empty;
      static SqlConnection conn = new SqlConnection();
      static void Main(string[] args)
      {
          try
          {
              conn.ConnectionString = ConfigurationManager.ConnectionStrings["TestDBConnection"].ConnectionString;
          }
          catch (ConfigurationErrorsException ex)
          {
              Console.WriteLine(ex.Message);
          }
          DataSet dataset = new DataSet();
          using (var adapter = new SqlDataAdapter("PTest", conn))
          {
              adapter.FillError += Adapter_FillError;
              adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
              adapter.Fill(dataset);
          }

      }

      private static void Adapter_FillError(object sender, FillErrorEventArgs e)
      {
          Console.WriteLine($"Message {e.Errors}");
          e.Continue = true;
      }
  }


на данный момент - серьезность RAISERROR должна быть между 11 и 19