Click here to Skip to main content
15,881,938 members
Please Sign up or sign in to vote.
1.00/5 (2 votes)
See more:
I Wrote one store procedure in Ms SQL server. In that procedure I used some try catch blocks. If I run that store procedure from SQL server Management studio ,it is running fine.If first try block result error, it is going to other block. But That procedure I am calling from c#. In c# first block of that store procedure result error then it is not going next block of that store procedure. Simply It is showing error. How to solve that

What I have tried:

I googled for solution but unable to find right one

SQL
USE [inventoryDB]
GO
/****** Object:  StoredProcedure [dbo].[clearinv]    Script Date: 05-10-2018 18:42:11 ******/
GO
GO
ALTER PROCEDURE [dbo].[SPNULL]
(
    @errorstat AS INT = 0
)
AS
	WHILE @errorstat = 0
	BEGIN
		BEGIN TRY
			UPDATE suppDB 
			SET ldgrid = 0 
			WHERE ldgrid IS NULL

			ALTER TABLE suppDB 
			ALTER COLUMN [ldgrid] INTEGER NOT NULL

			ALTER TABLE suppDB 
			ADD CONSTRAINT sldgrid  
			DEFAULT 0 FOR ldgridif @@ERROR <> 0 OR @@ERROR = 0

			BEGIN 
				PRINT '0'
			END
		END TRY
		BEGIN CATCH
			PRINT '1'
		END CATCH
	END
	GO

	DECLARE @errorstat AS INT = 0
	WHILE @errorstat = 0
	BEGIN
		BEGIN TRY
			UPDATE suppDB1718 
			SET ldgrid = 0 
			WHERE ldgrid IS NULL
		
			ALTER TABLE suppDB1718 
			ALTER COLUMN [ldgrid] INTEGER NOT NULL
		
			ALTER TABLE suppDB1718 
			ADD CONSTRAINT sldgrid1718  
			DEFAULT 0 
			FOR ldgridif @@ERROR <> 0 OR @@ERROR = 0
		
			BEGIN 
				PRINT '0'
			END
		END TRY
		BEGIN CATCH
			PRINT '2'
		END CATCH
	END
	GO

	IF @@ERROR <> 0 OR @@ERROR = 0 DECLARE @errorstat AS INT = 0
	BEGIN try
		UPDATE suppDB1819 
		SET ldgrid = 0 
		WHERE ldgrid IS NULL

		ALTER TABLE suppDB1819 
		ALTER COLUMN [ldgrid] INTEGER NOT NULL
	
		ALTER TABLE suppDB1819 
		ADD CONSTRAINT sldgrid1819 DEFAULT 0 FOR ldgrid
	END try
	BEGIN CATCH
		PRINT '3'
	END CATCH
	GO
	
	IF @@ERROR <> 0 OR @@ERROR = 0 DECLARE @errorstat AS INT = 0
	IF @errorstat = 0
	BEGIN TRY
		UPDATE suppDB SET jvno = 0 WHERE jvno IS NULL

		ALTER TABLE suppDB 
		ALTER COLUMN [jvno] INTEGER NOT NULL

		ALTER TABLE suppDB 
		ADD CONSTRAINT sjvno DEFAULT 0 FOR jvno
		END try
	BEGIN CATCH
		PRINT '4'
	END CATCH
	GO

	IF @@ERROR <> 0 OR @@ERROR = 0 DECLARE @errorstat AS INT = 0
	IF @errorstat = 0
	BEGIN TRY
		UPDATE suppDB1718 SET jvno = 0 WHERE jvno IS NULL

		ALTER TABLE suppDB1718 
		ALTER COLUMN [jvno] INTEGER NOT NULL

		ALTER TABLE suppDB1718 
		ADD CONSTRAINT sjvno1718 DEFAULT 0 FOR jvno
	END TRY
	BEGIN CATCH
		PRINT '5'
	END CATCH
	GO

	IF @@ERROR <> 0 OR @@ERROR = 0 DECLARE @errorstat AS INT = 0
	IF @errorstat = 0
	BEGIN TRY
		UPDATE suppDB1819 SET jvno = 0 WHERE jvno IS NULL

		ALTER TABLE suppDB1819 
		ALTER COLUMN [jvno] INTEGER NOT NULL

		ALTER TABLE suppDB1819 
		ADD CONSTRAINT sjvno1819 DEFAULT 0 FOR jvno
	END TRY
	BEGIN CATCH
		PRINT '6'
	END CATCH
	GO
Posted
Updated 5-Oct-18 22:52pm
v2
Comments
Dave Kreskowiak 5-Oct-18 10:40am    
Without the seeing the stored procedure code and the C# code calling it, it's impossible for anyone to tell you what's going on.
vijay_bale 5-Oct-18 10:49am    
@Dave Kreskowiak

USE [inventoryDB]
GO
/****** Object:  StoredProcedure [dbo].[clearinv]    Script Date: 05-10-2018 18:42:11 ******/

GO

GO

ALTER procedure [dbo].[SPNULL]

(@errorstat as int = 0)

as

while @errorstat = 0

begin

Begin try

update suppDB set ldgrid = 0 where ldgrid is null
ALTER TABLE suppDB ALTER COLUMN [ldgrid] INTEGER NOT NULL
alter table suppDB ADD CONSTRAINT sldgrid  DEFAULT 0 FOR ldgrid

if @@ERROR <> 0 or @@ERROR = 0
begin 
print '0'
end

END try
begin catch
Print '1'
end catch
end
go


declare @errorstat as int = 0

while @errorstat = 0
begin
Begin try

update suppDB1718 set ldgrid = 0 where ldgrid is null
ALTER TABLE suppDB1718 ALTER COLUMN [ldgrid] INTEGER NOT NULL
alter table suppDB1718 ADD CONSTRAINT sldgrid1718  DEFAULT 0 FOR ldgrid

if @@ERROR <> 0 or @@ERROR = 0
begin 
print '0'
end

END try
begin catch
Print '2'
end catch
end
go



if @@ERROR <> 0 or @@ERROR = 0
declare @errorstat as int = 0

BEGIN try

update suppDB1819 set ldgrid = 0 where ldgrid is null
ALTER TABLE suppDB1819 ALTER COLUMN [ldgrid] INTEGER NOT NULL
alter table suppDB1819 ADD CONSTRAINT sldgrid1819  DEFAULT 0 FOR ldgrid

END try
begin catch
Print '3'
end catch
go
if @@ERROR <> 0 or @@ERROR = 0
declare @errorstat as int = 0

if @errorstat = 0
BEGIN try

update suppDB set jvno = 0 where jvno is null
ALTER TABLE suppDB ALTER COLUMN [jvno] INTEGER NOT NULL
alter table suppDB ADD CONSTRAINT sjvno  DEFAULT 0 FOR jvno

END try
begin catch
Print '4'
end catch
go
if @@ERROR <> 0 or @@ERROR = 0
declare @errorstat as int = 0

if @errorstat = 0
BEGIN try

update suppDB1718 set jvno = 0 where jvno is null
ALTER TABLE suppDB1718 ALTER COLUMN [jvno] INTEGER NOT NULL
alter table suppDB1718 ADD CONSTRAINT sjvno1718  DEFAULT 0 FOR jvno

END try
begin catch
Print '5'
end catch
go
if @@ERROR <> 0 or @@ERROR = 0
declare @errorstat as int = 0

if @errorstat = 0
BEGIN try

update suppDB1819 set jvno = 0 where jvno is null
ALTER TABLE suppDB1819 ALTER COLUMN [jvno] INTEGER NOT NULL
alter table suppDB1819 ADD CONSTRAINT sjvno1819  DEFAULT 0 FOR jvno

END try
begin catch
Print '6'
end catch
go

//This is SQL server storeprocedure code
vijay_bale 5-Oct-18 10:55am    
@Dave Kreskowiak

C# code
using (SqlCommand cmd = new SqlCommand("SPNULL", con))
           {
               con.Close();
               con.Open();
               cmd.CommandType = CommandType.StoredProcedure;
               cmd.ExecuteNonQuery();
           }
Herman<T>.Instance 5-Oct-18 10:46am    
You only googled for a solution? I would debug code in VS and SP in SSMS
vijay_bale 5-Oct-18 10:51am    
@digimanus
first I checked in ssms.no problem. in c# I debugged that code also

1 solution

0) Allowing an exception to happen to implement some arbitrary form of error handling is just plain bad practice. Exceptions should generally be reserved for unexpected problems.

1) There's no point in repeatedly performing a process if it doesn't need to be done.

2) If there's already data in the database, altering a column's type will cause the data to be removed, so I took that code out.

Try this code:

SQL
--if the default value has not been set
IF (SELECT COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'suppDB' AND COLUMN_NAME = 'ldgrid') IS NULL
   ALTER TABLE suppDB ADD CONSTRAINT DF_suppDB_ldgrid DEFAULT 0 FOR ldgrid;

IF (SELECT COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'suppDB1718' AND COLUMN_NAME = 'ldgrid') IS NULL
    ALTER TABLE suppDB1718 ADD CONSTRAINT DF_suppDB1718_ldgrid DEFAULT 0 FOR ldgrid;

IF (SELECT COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'suppDB1819' AND COLUMN_NAME = 'ldgrid') IS NULL
    ALTER TABLE suppDB1819 ADD CONSTRAINT DF_suppDB1819_ldgrid DEFAULT 0 FOR ldgrid;

IF (SELECT COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'suppDB' AND COLUMN_NAME = 'jvno') IS NULL
    ALTER TABLE suppDB ADD CONSTRAINT DF_suppDB_jvno DEFAULT 0 FOR jvno;

IF (SELECT COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'suppDB1718' AND COLUMN_NAME = 'jvno') IS NULL
    ALTER TABLE suppDB1718 ADD CONSTRAINT DF_suppDB1718_jvno DEFAULT 0 FOR jvno;

IF (SELECT COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'suppDB1819' AND COLUMN_NAME = 'jvno') IS NULL
    ALTER TABLE suppDB1819 ADD CONSTRAINT DF_suppDB1819_jvno DEFAULT 0 FOR jvno;

UPDATE suppDB     SET ldgrid = 0 WHERE ldgrid IS NULL;
UPDATE suppDB1718 SET ldgrid = 0 WHERE ldgrid IS NULL;
UPDATE suppDB1819 SET ldgrid = 0 WHERE ldgrid IS NULL;
UPDATE suppDB     SET jvno   = 0 WHERE jvno   IS NULL;
UPDATE suppDB1718 SET jvno   = 0 WHERE jvno   IS NULL;
UPDATE suppDB1819 SET jvno   = 0 WHERE jvno   IS NULL;
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900