2013-03-19 53 views
-2

Eror消息我在我的表進行更新時,有一個SQL錯誤

消息2601,級別14,狀態1,行 不能在對象'dbo.RTU_ADDRESS具有唯一索引「唯一鍵插入重複鍵行RTU」。重複的鍵值是(2,5,4,6,500,610,IUY)。 該聲明已被終止。

腳本爲表

USE [hts] 
GO 

/****** Object: Table [dbo].[RTU_ADDRESS] Script Date: 03/19/2013 21:07:19 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[RTU_ADDRESS](
    [RowNo] [int] IDENTITY(1,1) NOT NULL, 
    [StationId] [int] NULL, 
    [SystemId] [int] NULL, 
    [CCNumber] [int] NULL, 
    [LineNumber] [int] NULL, 
    [RTUNumber] [int] NULL, 
    [SRTUNumber] [int] NULL, 
    [Description] [char](100) NOT NULL, 
    [SDescription] [char](100) NOT NULL, 
    [Area_ID] [char](10) NOT NULL 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

腳本的指標

USE [hts] 
GO 

/****** Object: Index [Unique Key RTU] Script Date: 03/19/2013 21:08:31 ******/ 
CREATE UNIQUE NONCLUSTERED INDEX [Unique Key RTU] ON [dbo].[RTU_ADDRESS] 
(
    [StationId] ASC, 
    [SystemId] ASC, 
    [CCNumber] ASC, 
    [LineNumber] ASC, 
    [RTUNumber] ASC, 
    [SRTUNumber] ASC, 
    [Area_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

C#代碼:

SqlDataAdapter sqlAdapter = null; 
       strSelectCmd = "SELECT RowNo FROM RTU_ADDRESS"; 
       SqlCommand sqlCmd = new SqlCommand(); 
       sqlCmd.Connection = m_SqlConn; 
       sqlCmd.CommandText = strSelectCmd; 
       int i = Convert.ToInt32(sqlCmd.ExecuteScalar()); 
       sqlAdapter = new SqlDataAdapter(); 
       sqlAdapter.SelectCommand = sqlCmd; 


       strInsCmd = "UPDATE RTU_ADDRESS SET RTUNumber='" + rtunum.Text + "', SRTUNumber='" + srtunum.Text + "', Description='" + desc.Text + "', SDescription='" + sdesc.Text + "' WHERE Area_ID='" + area_ID.Text + "' AND StationId='" + station.Text + "' AND SystemId='" + sys.Text + "' AND CCNumber='" + ccnum.Text + "' AND LineNumber='" + linenum.Text + "'"; 

       strErrorMsg = Utilities.ExecuteSQLCommand(m_SqlConn, strInsCmd); 
       string check = "duplicate"; 
       bool d = check.Any(strErrorMsg.Contains); 
       if (d == true) 
       { 
        MessageBox.Show(" Duplicates Entries Found", "Database Insertion"); 
       } 
       else if (string.IsNullOrEmpty(strErrorMsg) == false) 
       { 
        MessageBox.Show(this, "Error!Unable to Add New RTU Configurations!", "RTU Configurations error"); 
       } 
       else 
       { 
        d = false; 
        this.Close(); 
       } 

我現在失去了做什麼,我沒有把任何重複。

我只想更新RTUNumber,SRTUNumber,Description和SDescription,同時保持我的stationID,systemID,CCNumber,LineNumber和Area_ID不變。請幫助

UPDATE: Select語句

SELECT * FROM RTU_ADDRESS WHERE AREA_ID = 'IUY' AND的stationID = '2' 和SYSTEMID = '5' 和CCNumber = '4' 和LineNumber上= '6'

給我2個結果,但RTUNumber和SRTUNumber是不同的。

請幫

+0

原諒我在這裏的無知,但爲什麼你有這樣一個巨大的PK指數呢? – Paul 2013-03-19 17:16:15

+1

RTUNumber,SRTUNumber是唯一索引的一部分,您可嘗試將它們更新到已經在表和錯誤不撒謊:) – 2013-03-19 17:16:30

+0

但我不能改變的唯一索引值,所以我應如何從這裏出發? – user2177829 2013-03-19 17:24:42

回答

0

那麼,它似乎很清楚,你正在試圖做的更新將產生在你的表一式兩份。您是否嘗試根據您嘗試用於更新的值在桌面上進行選擇?你最有可能找到現有的記錄...

+0

我已更新您的評論。 – user2177829 2013-03-19 17:37:21

+0

Bartdude,請投票我的聲譽,謝謝你 – user2177829 2013-03-19 18:41:48

0

看着你update語句的where子句中的條件,如果有比戰績更你會得到這個錯誤具有相同areaID表示,SYSTEMID,的stationID,CCNumber和LineNumber,因爲您試圖用相同的RTUNumber和SRTUNumber更新它們。你可以通過運行這個sql來檢查:

SELECT AreaId, SystemId, StationId, CCNumber, LineNumber, COUNT(*) 
FROM RTU_ADDRESS 
GROUP BY AreaId, SystemId, StationId, CCNumber, LineNumber 
HAVING COUNT(*) > 1 

如果有任何行被返回,那麼你會得到「重複」的錯誤。

事實上,您的編輯版本說這種情況。雖然這兩個記錄可能有不同的SRTUNumber和RTUNumber,但您試圖在更新語句中爲它們提供相同的SRTUNumber和RTUNUmber。

+0

偉大的,我也找到了我自己的答案。我將索引更改爲RTUNumber和SRTUNumber,這是唯一的,我認爲我的問題已經解決了,只需要更新我的Boss tommorow,讓他知道他的意思。謝謝你是年輕的BOB。 – user2177829 2013-03-19 18:38:18

+0

請投票支持我的聲譽謝謝 – user2177829 2013-03-19 18:41:12

+0

即使在RTUNumber和SRTUNumber上出現相同原因的唯一索引,更新仍然會出現重複錯誤。 – 2013-03-19 19:16:14

相關問題