2016-09-16 4 views
0

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

public void UpdateUser(string NewUser, string OldUser) 
{ 
using (SqlConnection con = HSDatabaseConnection()) 
{ 
using (SqlCommand cmd = new SqlCommand("UpdateNames", con)) 
{ 
cmd.CommandType = System.Data.CommandType.StoredProcedure; 
cmd.Parameters.Add("@LogonName", System.Data.SqlDbType.VarChar).Value = NewUser; 
cmd.Parameters.Add("@OldLogonName", System.Data.SqlDbType.VarChar).Value = OldUser; 
cmd.ExecuteNonQuery(); 
} 
con.Close(); 
} 
} 

У меня есть 4 таблицы, в которых каждая таблица имеет общее название колонки "AN". Мне нужно обновить «AN», если агент меняет там имя юридически

до сих пор я пришел с этой процедурой

USE [HSDB] 
GO 
/****** Object: StoredProcedure [dbo].[UpdateNames] Script Date: 9/16/2016 12:32:33 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[UpdateNames] 
--Add the parameters for the stored procedure here 
@AN varchar(MAX) 

AS 
BEGIN 
--SET NOCOUNT ON added to prevent extra result sets from 
--interfering with SELECT statements. 
SET NOCOUNT ON; 
--Insert statements for procedure here 
UPDATE Att 
SET AN = @AN 
WHERE (AN = @AN) 
UPDATE MS 
SET AN = @AN 
WHERE (AN = @AN) 
UPDATE Lost 
SET AN = @AN 
WHERE (AN = @AN) 
UPDATE WeeklyCharges 
SET AN = @AN 
WHERE (AN = @AN) 


END 

Может кто-нибудь пожалуйста, скажите мне, что я делаю неправильно. Спасибо

+0

'SET AN = @AN WHERE AN = @ AN'. Это ничего не делает. Вы устанавливаете его на одно значение. – Eric

+0

Вам действительно нужен varchar (max)? Разумеется, ваши имена входа менее 8000 символов. –

+0

Но мне любопытно. Почему вы пытаетесь исправить какой-либо код, когда нет базы данных? Вы пытаетесь перестроить базу данных из кода приложения? Похоже, что вряд ли это будет практически невозможно. И серьезно хранить полное имя в нескольких таблицах просто ужасно. Он должен быть нормирован на одну точку входа. –

ответ

0

Выпуск 1: Ваш код C# передает 2 paramaters @LogonName и @OldLogonName, но ваша хранимая процедура принимает только 1 параметр @AN. Так что это должно быть ошибкой.

Выпуск 2: всех ваших заявлений обновления настраивает AN = к себе, потому что вы говорите, когда AN = @AN затем установить = @AN ....

Не имея более подробно об ошибке и ваши структуры данных, которые вы должны включить в будущем, немного сложно сказать. Тем не менее, вы, вероятно, могли бы сделать что-то вроде этого в SQL-сервере 2012 +:

USE [HSDB] 
GO 
/****** Object: StoredProcedure [dbo].[UpdateNames] Script Date: 9/16/2016 12:32:33 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[UpdateNames] 
--Add the parameters for the stored procedure here 
@LogonName varchar(100) 
,@OldLogonName varchar(100) 

AS 
BEGIN 
--SET NOCOUNT ON added to prevent extra result sets from 
--interfering with SELECT statements. 
SET NOCOUNT ON; 
--Insert statements for procedure here 
BEGIN TRY 

    IF NOT EXISTS (SELECT * FROM LogOnOrUserTable WHERE LogonName = @OldLogonName) 
    BEGIN 
     ;THROW 51000, 'Old Logon Name Does Not Exists', 1 
    END 

    BEGIN TRANSACTION 

    UPDATE Att 
    SET AN = @LogonName 
    WHERE (AN = @OldLogonName) 

    UPDATE MS 
    SET AN = @LogonName 
    WHERE (AN = @OldLogonName) 

    UPDATE Lost 
    SET AN = @LogonName 
    WHERE (AN = @OldLogonName) 

    UPDATE WeeklyCharges 
    SET AN = @LogonName 
    WHERE (AN = @OldLogonName) 

    COMMIT TRANSACTION 

END TRY 
BEGIN CATCH 

     IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION 

    ;THROW 

END CATCH 

END 

Что он делает:

  • первые тесты, чтобы увидеть, если старое имя пользователя существует, и если он не бросает ошибка.
  • затем обновляет все таблицы, где AN = старое имя входа и устанавливает его на новое имя входа
  • , если какой-либо из них не удался, он откатывает транзакцию и выдает ошибку, так что у вас нет изменений половина производства
+0

@ user6840698 видя, что мой ответ сработал для вас, подумайте о том, чтобы принять его, чтобы другие знали, что на него был дан ответ, и за пункты репутации, которые будут назначены. Спасибо http://stackoverflow.com/help/someone-answers – Matt

Смежные вопросы