vijay_bale Ответов: 1

Проблема с процедурой хранения Ms sqlserver в C#


Я написал одну процедуру хранения в Ms SQL server. В этой процедуре я использовал некоторые блоки try catch. Если я запускаю эту процедуру хранения из среды SQL server Management studio ,она работает нормально.Если сначала попытаться заблокировать ошибку результата, то она перейдет в другой блок. Но эту процедуру я вызываю из c#. В c# первый блок этой процедуры хранения приводит к ошибке, то он не собирается следующий блок этой процедуры хранения. Просто он показывает ошибку. Как это решить

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

Я погуглил в поисках решения, но не смог найти правильного

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

Dave Kreskowiak

Без просмотра кода хранимой процедуры и кода C#, вызывающего ее, никто не сможет сказать вам, что происходит.

vijay_bale

@Дэйв 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

//Это код SQL server storeprocedure

vijay_bale

@Дэйв Kreskowiak

Код C#

using (SqlCommand cmd = new SqlCommand("SPNULL", con))
           {
               con.Close();
               con.Open();
               cmd.CommandType = CommandType.StoredProcedure;
               cmd.ExecuteNonQuery();
           }

Herman&lt;T&gt;.Instance

Вы только гуглили для решения проблемы? Я бы отлаживал код в VS и SP в SSMS

vijay_bale

@digimanus
сначала я зарегистрировался ssms.no проблема. в c# я также отладил этот код

Herman&lt;T&gt;.Instance

Зачем вам нужна петля? =>
while @errorstat = 0

Почему вам нужно звонить с этим параметром?

Если у вас нет проблем с этим кодом, вы бесконечно запускаете этот SP!
Вы держите вам изменить столбец таблицы?

Ваш код не имеет для меня никакого смысла

vijay_bale

Я создаю некоторые таблицы каждый раз, но в этот раз некоторые значения по умолчанию отсутствуют(я создаю файлы с не нулевыми и значениями по умолчанию, но отсутствующими значениями по умолчанию).При вставке некоторых данных я получаю ошибку, потому что не null, но нет значения по умолчанию. Поэтому я создал эту процедуру

Eric Lynch

Вы можете добавить некоторые отступы, чтобы помочь себе и нам визуально сопоставить начальные и конечные теги. У меня просто нет времени пробираться через ваш код без отступов.

На первый взгляд, пытаясь соответствовать вашим началам/концам, кажется, что вы, возможно, разместили как свою хранимую процедуру, так и кучу постороннего скриптового кода вне вашей хранимой процедуры. Насколько я могу судить, ваша хранимая процедура, похоже, заканчивается на первом операторе "GO".

Может быть, это и есть причина вашей проблемы?

Если нет, я бы рекомендовал добавить некоторые отступы и использовать кнопку "улучшить вопрос", чтобы публиковать только то, что вы считаете своей хранимой процедурой.

Кроме того, логика в вашей хранимой процедуре кажется очень подозрительной. В общем, многократное изменение таблиц не является особенно хорошей идеей.

Я предполагаю, что, может быть, у вас были какие-то проблемы с вашим обновлением и вместо того, чтобы диагностировать эти проблемы, вы попытались шлепнуть этот опрометчивый пластырь?

Я бы посоветовал, возможно, начать все сначала и попросить помощи с первоначальной проблемой...предполагая, что вы не в состоянии решить ее самостоятельно.

Eric Lynch

Просто проверяя, вы понимаете, что ваша хранимая процедура заканчивается с первого раза, правильно?

Все остальное-это просто сценарий SQL, который не является частью вашей хранимой процедуры. Он может быть выполнен в SSMS, но никогда не будет выполнен при вызове вашего SP.

Чтобы быть ясным, это вся ваша хранимая процедура:

Изменить процедуру [dbo].[SPNULL]
(
@errorstat AS INT = 0
)
АС
WHILE @errorstat = 0
НАЧАТЬ
НАЧИНАЙ ПРОБОВАТЬ
Обновление suppDB
Установить ldgrid = 0
Где ldgrid равен нулю

ALTER TABLE suppDB
ALTER COLUMN [ldgrid] INTEGER NOT NULL

ALTER TABLE suppDB
Добавить ограничение sldgrid
По умолчанию 0 для ldgridif значение @@error &ЛТ;&ГТ; 0 или значение @@error = 0

НАЧАТЬ
Печать '0'
КОНЕЦ
КОНЕЦ ПОПЫТКИ
НАЧИНАЙ ЛОВИТЬ
Печать '1'
КОНЦЕВАЯ ЗАДВИЖКА
КОНЕЦ

Если вы хотите, чтобы остальная часть этого была частью вашего SP, вам нужно будет заключить весь SP (после AS) в блок BEGIN/END и re-factor, чтобы исключить операторы "GO" (внутри SP).

Кроме того, как упоминали другие, выбранный вами подход не имеет большого смысла.

1 Ответов

Рейтинг:
2

#realJSOP

0) позволить исключению произойти для реализации некоторой произвольной формы обработки ошибок-это просто плохая практика. Исключения, как правило, следует резервировать для непредвиденных проблем.

1) нет никакого смысла в повторном выполнении процесса, если это не нужно делать.

2) если в базе данных уже есть данные, изменение типа столбца приведет к удалению данных, поэтому я взял этот код.

Попробуйте этот код:

--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;