2016-09-16 68 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)嗎?當然你的登錄名字少於8,000個字符。 –

+0

但我很好奇。爲什麼你在沒有數據庫時試圖修復一些代碼?您是否試圖從應用程序代碼中反向設計數據庫?這似乎很有可能幾乎不可能做到。嚴格地將全名存儲在多個表中是非常糟糕的。它應該被標準化爲一個單一的入口點。 –

回答

0

問題1: 您的c#代碼傳遞了2個參數@LogonName和@OldLogonName,但您的存儲過程只接受1個參數@AN。所以這應該錯誤。

問題2: 所有的更新語句設置AN =本身,因爲你說當= @AN然後設置= @AN ....

而不必更多的錯誤細節和你的數據結構,你將來應該包括這些,這有點難說。不過,你可能會做這樣的事情在SQL-Server 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