2016-09-16 69 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