Проблема с процедурой хранения 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<T>.Instance
Вы только гуглили для решения проблемы? Я бы отлаживал код в VS и SP в SSMS
vijay_bale
@digimanus
сначала я зарегистрировался ssms.no проблема. в c# я также отладил этот код
Herman<T>.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).
Кроме того, как упоминали другие, выбранный вами подход не имеет большого смысла.