INSERT语句中的外键冲突

时间:2018-03-16 13:30:34

标签: c# sql-server winforms desktop-application

我正在开发一个WinForm桌面应用程序,供用户使用SQL Server 2008作为DB输入员工退休数据。

其中一个获取用户数据的表有一个对另一个表的引用,该表的记录是在设计时定义的,为了一致性添加了一个外键约束。

CREATE TABLE tbCongedo (
    ID int IDENTITY(0,1) PRIMARY KEY,
    ID_ANAGRAFICA int NOT NULL,
    ID_TIPOLOGIA int NOT NULL,
    DECORRENZA datetime NOT NULL,
    PROT_NUM nvarchar(7) NOT NULL,
    PROT_DATA datetime NOT NULL
    );

CREATE TABLE tbTipologia (
    ID int IDENTITY(0,1) PRIMARY KEY,
    TIPOLOGIA nvarchar(20)
    );

INSERT INTO tbTipologia VALUES ('CONGEDO'), ('POSTICIPO'), ('ANTICIPO'), ('REVOCA'), ('DECESSO')

ALTER TABLE tbCongedo
ADD CONSTRAINT FK_tbCongedo_tbTipologia
FOREIGN KEY (ID_TIPOLOGIA) REFERENCES tbTipologia(ID)

然后,我有这个代码应该执行INSERT语句

public int Insert(SqlConnection Connessione)
{
    using (SqlCommand Comando = new SqlCommand("INSERT INTO tbCongedo VALUES (@ID_ANAGRAFICA, @PROT_NUM, @PROT_DATA, @DECORRENZA, @ID_TIPOLOGIA); SELECT SCOPE_IDENTITY()", Connessione))
    {
        Comando.Parameters.AddWithValue("@ID_ANAGRAFICA", ID_ANAGRAFICA);
        Comando.Parameters.AddWithValue("@PROT_NUM", PROT_NUM);
        Comando.Parameters.AddWithValue("@PROT_DATA", PROT_DATA);
        Comando.Parameters.AddWithValue("@DECORRENZA", DECORRENZA);
        Comando.Parameters.AddWithValue("@ID_TIPOLOGIA", ID_TIPOLOGIA);

        ID = Int32.Parse(Comando.ExecuteScalar().ToString());
    }
    return ID;
}

但是我给出了这个SqlException:

  

INSERT语句与FOREIGN KEY约束冲突" FK_tbCongedo_tbTipologia"。冲突发生在数据库" Scadenziario_ver4_TEST",table" dbo.tbTipologia",列' ID'

这些是我试图插入表中的数据:

ID_ANAGRAFICA = 2
ID_TIPOLOGIA = 0
PROT_DATA = {16/03/2018 00:00:00}
DECORRENZA = {16/03/2018 00:00:00}
PROT_NUM = 123456

有趣的是,当我尝试通过SQL Server Management Studio手动插入相同的数据时,我没有给出任何错误。

感谢.-

2 个答案:

答案 0 :(得分:3)

尝试指定字段:(col_name1, col_name2, ...)

如果不这样,VALUES可能不会像您希望的那样应用。变量名称不会与类似命名的列自动匹配。

所以这样:

... new SqlCommand
(
    "INSERT INTO tbCongedo " +
    "       (ID_ANAGRAFICA, PROT_NUM, PROT_DATA, DECORRENZA, ID_TIPOLOGIA) "
    "VALUES (@ID_ANAGRAFICA, @PROT_NUM, @PROT_DATA, @DECORRENZA, @ID_TIPOLOGIA); " + 
    "SELECT SCOPE_IDENTITY()", Connessione
)
...

答案 1 :(得分:2)

我认为问题不是在数据中,而是在INSERT语句本身。您正尝试使用错误的顺序将值插入错误的列。要解决此问题,您应该在INSERT语句中指定列或更正值的顺序。在您的情况下,查询会尝试在@PROT_NUM中插入ID_TIPOLOGIA的值。