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」で共通に持っている唯一のものを持っています。私は、エージェントが合法的にこれまでのところ、私はいくつかのいずれかが、私が間違っているのを教えてくださいすることができ、この手順

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 

が出ている

が名前を変更した場合、「AN」を更新する必要があります。ありがとうございます

+0

'SET AN = @ AN WHERE AN = @ AN'です。これは何もしていない。同じ値に設定しています。 – Eric

+0

本当にvarchar(max)が必要ですか?確かにあなたのログオン名は8,000文字未満です。 –

+0

しかし、私は好奇心が強いです。データベースがないときに何らかのコードを修正しようとしているのはなぜですか?アプリケーションコードからデータベースをリバースエンジニアリングしようとしていますか?それは、それを正しくすることはほぼ不可能である可能性が高いようです。そして真剣に複数のテーブルに完全な名前を格納するのはひどいです。これは、単一の入力点に対して正規化されるべきである。 –

答えて

0

Issue 1: C#コードは2つのパラメータ@LogonNameと@OldLogonNameを渡していますが、ストアドプロシージャは1つのパラメータ@ANだけを受け付けています。だからそれは間違っているはずです。

問題2: AN = @ANはその後、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 =古いログオン名のテーブルをすべて更新し、新しいログオン名
  • に設定します。いずれか1つでも失敗した場合はトランザクションをロールバックし、エラーが発生して変更がないようにします半分は
+0

@ user6840698私の答えがあなたのために働いているのを見て、それを受け入れて、他の人がそれが答えられたことを知って、評判ポイントが割り当てられるようにしてください。ありがとうhttp://stackoverflow.com/help/someone-answers – Matt

関連する問題