2016-09-16 2 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"컬럼 이름입니다. 나는 에이전트가 법적으로 지금까지 내가 어떤 사람 내가 뭘 잘못 말해 주시겠습니까이 절차

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 (최대)가 필요합니까? 확실히 로그온 이름은 8,000 자 미만입니다. –

+0

하지만 호기심이 많습니다. 데이터베이스가 없는데 왜 일부 코드를 수정하려고합니까? 애플리케이션 코드에서 데이터베이스를 리버스 엔지니어링하려고합니까? 그것은 그것을 거의 얻는 것이 거의 불가능할 가능성이 높습니다. 그리고 여러 테이블에 전체 이름을 저장하는 것은 끔찍한 일입니다. 단일 진입 점으로 정규화되어야합니다. –

답변

0

문제 1 : C# 코드는 2 개의 매개 변수 @LogonName과 @OldLogonName을 전달하지만 저장 프로 시저는 @AN 매개 변수 1 개만 허용합니다. 그래서 그 오류가 발생합니다. 문제 2

: = @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