SET IDENTITY_INSERT如何工作?

时间:2016-11-25 01:34:35

标签: c# sql-server

我如何使用SET IDENTITY_INSERT dbo.TableName ON

这是我的错误代码:

  

只有在使用列列表且IDENTITY_INSERT为ON时,才能指定表'tbl_PurchaseRequest'中标识列的显式值。

我在SQL Server 2014中运行此查询并显示Command successful但仍然在C#中无效。

我的代码:

DBPurCon dbcon = new DBPurCon();

    public void Purchase1 (BELPurchase BELPur)
    {
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = dbcon.getcon();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SET IDENTITY_INSERT dbo.tbl_PurchaseRequest ON";
        cmd.ExecuteNonQuery();

        SqlCommand cmd1 = new SqlCommand();
        cmd1.Connection = dbcon.getcon();
        cmd1.CommandType = CommandType.Text;
        cmd1.CommandText = "INSERT INTO tbl_PurchaseRequest VALUES (@SID1,@Vendor,@Address,@Date,@Terms,@Qty1,@ITD1,@Unit,@UP1,@TP1,@ATT,@REQBY);";
        cmd1.Parameters.AddWithValue("@SID1", BELPur.SID1);
        cmd1.Parameters.AddWithValue("@Vendor", BELPur.Vendor);
        cmd1.Parameters.AddWithValue("@Address", BELPur.Address);
        cmd1.Parameters.AddWithValue("@Date", BELPur.Date);
        cmd1.Parameters.AddWithValue("@Terms", BELPur.Terms);
        cmd1.Parameters.AddWithValue("@Qty1", BELPur.Qty1);
        cmd1.Parameters.AddWithValue("@ITD1", BELPur.ItD1);
        cmd1.Parameters.AddWithValue("@Unit", BELPur.Unt1);
        cmd1.Parameters.AddWithValue("@UP1", BELPur.UP1);
        cmd1.Parameters.AddWithValue("@TP1", BELPur.TP1);
        cmd1.Parameters.AddWithValue("@ATT", BELPur.AllTot);
        cmd1.Parameters.AddWithValue("@REQBY", BELPur.ReqBy);
        cmd1.ExecuteNonQuery();
    }

    public void Request1 (BELPurchase BELPur)
    {  
        SqlCommand cmd2 = new SqlCommand();
        cmd2.Connection = dbcon.getcon();
        cmd2.CommandType = CommandType.Text;
        cmd2.CommandText = "INSERT INTO tbl_RequestPreview VALUES (@ReqTit,@ReqBy,@Terms,@Unlock,@AllTot,'Request')";
        cmd2.Parameters.AddWithValue("@ReqTit", BELPur.ReqTit);
        cmd2.Parameters.AddWithValue("@ReqBy", BELPur.ReqBy);
        cmd2.Parameters.AddWithValue("@Terms", BELPur.Terms);
        cmd2.Parameters.AddWithValue("@Unlock", BELPur.Unlock);
        cmd2.Parameters.AddWithValue("@AllTot", BELPur.AllTot);
        cmd2.ExecuteNonQuery();
    }
}

如果我在此处编写此代码,则只要点击SET IDENTITY_INSERT按钮,它就会始终运行Purchase查询。它只能运行一次或多次吗?

1 个答案:

答案 0 :(得分:0)

您不应单独执行命令。您需要包含标识列名称及其值。

当我们想要插入一个Identity字段以从SQL Command而不是IDENTITY_INSERT插入值时,我们通常需要Auto,所以请包含request_id及其值。

cmd1.CommandText = "SET IDENTITY_INSERT [dbo].[tbl_PurchaseRequest] ON; 
        INSERT INTO tbl_PurchaseRequest VALUES (@ReqID,@SID1,@Vendor,@Address,@Date,@Terms,@Qty1,@ITD1,@Unit,@UP1,@TP1,@ATT,@REQBY); 
                    SET IDENTITY_INSERT [dbo].[tbl_PurchaseRequest] OFF;";

cmd1.Parameters.AddWithValue("@ReqID", SomeNumber++);
  

它只能运行一次或多次

是的,您可以在命令

之后设置OFF多次运行它