使用SCOPE_IDENTITY在SQL中创建双记录(C#)

时间:2018-01-04 13:16:10

标签: c# sql-server

我正在使用c#开发桌面应用程序。 我正在尝试使用Scope Identity捕获SQL中添加的记录的最后一个ID。 这是值得的,但它在sql数据库中创建了重复的记录。 注意:我为糟糕的英语道歉(由谷歌翻译:))

在SQL Server(SP)上

ALTER PROCEDURE [dbo].[ztSinifEgitimiEkle]
@islev                 NVARCHAR(MAX),
@ztSinifEgitimiDurumAtamaID            INT,
@ztSinifEgitimiDurumKisiID                 NVARCHAR(30),
@ztSinifEgitimiDurumKisiTipiID             TINYINT  ,
@ztSinifEgitimiDurumKatilim            BIT,
@ztSinifEgitimiEgitimAdi                 VARCHAR(50),
@ztSinifEgitimiAtamaEgitimID           int,
@ztSinifEgitimiAtamaEgitmenID          CHAR(30),
@ztSinifEgitimiAtamaKisiTipiID         TINYINT,
@ztSinifEgitimiAtamaTarihSaat          DATETIME,
@ztSinifEgitimiAtamaSüre               varchar(50),
@ztSinifEgitimiAtamaKategoriID         INT,
@ztSinifEgitimiAtamaEgitimTipi         Smallint
AS
/*
İşlev 0 ise : ztSinifEgitimiDurum2 tablosuna Insert Eder
İşlev 1 ise : ztSinifEgitimi2 tablosuna Insert Eder
İşlev 2 ise : ztSinifEgitimiAtama2 tablosuna Insert Eder

*/
IF @islev='0'
BEGIN
INSERT INTO [dbo].[ztSinifEgitimiDurum2]
        ( 
          AtamaID,
          KisiID ,
          KisiTipiID ,
          Katilim
        )
VALUES  ( 
          @ztSinifEgitimiDurumAtamaID   ,
          @ztSinifEgitimiDurumKisiID    ,
          @ztSinifEgitimiDurumKisiTipiID    ,
          @ztSinifEgitimiDurumKatilim   
        )
END

IF @islev='1'
BEGIN

INSERT INTO [dbo].[ztSinifEgitimi2]
           (
           [EgitimAdi]
           )
     VALUES
           (@ztSinifEgitimiEgitimAdi
           )
SELECT SCOPE_IDENTITY() -- Son Kaydın IDsi

END

IF @islev='2'
BEGIN

INSERT INTO [dbo].[ztSinifEgitimiAtama2]
           ([EgitimID]
           ,[EgitmenID]
           ,[KisiTipiID]
           ,[TarihSaat]
           ,[Süre]
           ,[KategoriID]
           ,[EgitimTipi])
     VALUES
           (
            @ztSinifEgitimiAtamaEgitimID   ,  
            @ztSinifEgitimiAtamaEgitmenID  , 
            @ztSinifEgitimiAtamaKisiTipiID , 
            @ztSinifEgitimiAtamaTarihSaat  ,
            @ztSinifEgitimiAtamaSüre       ,       
            @ztSinifEgitimiAtamaKategoriID , 
            @ztSinifEgitimiAtamaEgitimTipi 
          )

END

我的C#代码

        private void button4_Click(object sender, EventArgs e)
        {
            try
            {

                if (egitimadi.Text.Length!=0)
                {
                    if (baglan.State == ConnectionState.Closed)
                        baglan.Open();

                    SqlCommand sqlCmd = new SqlCommand("ztSinifEgitimiEkle", baglan);
                    sqlCmd.CommandType = CommandType.StoredProcedure;
                    sqlCmd.Parameters.AddWithValue("@islev", 1);
                    sqlCmd.Parameters.AddWithValue("@ztSinifEgitimiDurumAtamaID", 0);
                    sqlCmd.Parameters.AddWithValue("@ztSinifEgitimiDurumKisiID", "");
                    sqlCmd.Parameters.AddWithValue("@ztSinifEgitimiDurumKisiTipiID", 8);
                    sqlCmd.Parameters.AddWithValue("@ztSinifEgitimiDurumKatilim", 1);
                    sqlCmd.Parameters.AddWithValue("@ztSinifEgitimiEgitimAdi", egitimadi.Text);
                    sqlCmd.Parameters.AddWithValue("@ztSinifEgitimiAtamaEgitimID", 1);
                    sqlCmd.Parameters.AddWithValue("@ztSinifEgitimiAtamaEgitmenID", "");
                    sqlCmd.Parameters.AddWithValue("@ztSinifEgitimiAtamaKisiTipiID", 8);
                    sqlCmd.Parameters.AddWithValue("@ztSinifEgitimiAtamaTarihSaat", "2017-01-01");
                    sqlCmd.Parameters.AddWithValue("@ztSinifEgitimiAtamaSüre", "");
                    sqlCmd.Parameters.AddWithValue("@ztSinifEgitimiAtamaKategoriID", 0);
                    sqlCmd.Parameters.AddWithValue("@ztSinifEgitimiAtamaEgitimTipi", 0);

                    String LastID = sqlCmd.ExecuteScalar().ToString();
                    sqlCmd.ExecuteNonQuery();

         SqlCommand sqlCmd2 = new SqlCommand("ztSinifEgitimiEkle", baglan);
                    sqlCmd2.CommandType = CommandType.StoredProcedure;
                    sqlCmd2.Parameters.AddWithValue("@islev", 2);
                    sqlCmd2.Parameters.AddWithValue("@ztSinifEgitimiDurumAtamaID", 0);
                    sqlCmd2.Parameters.AddWithValue("@ztSinifEgitimiDurumKisiID", "");
                    sqlCmd2.Parameters.AddWithValue("@ztSinifEgitimiDurumKisiTipiID", 8);
                    sqlCmd2.Parameters.AddWithValue("@ztSinifEgitimiDurumKatilim", 1);
                    sqlCmd2.Parameters.AddWithValue("@ztSinifEgitimiEgitimAdi", "");
                    sqlCmd2.Parameters.AddWithValue("@ztSinifEgitimiAtamaEgitimID", LastID);
                    sqlCmd2.Parameters.AddWithValue("@ztSinifEgitimiAtamaEgitmenID", "");
                    sqlCmd2.Parameters.AddWithValue("@ztSinifEgitimiAtamaKisiTipiID", 8);
                    sqlCmd2.Parameters.AddWithValue("@ztSinifEgitimiAtamaTarihSaat", "2017-01-01");
                    sqlCmd2.Parameters.AddWithValue("@ztSinifEgitimiAtamaSüre", "");
                    sqlCmd2.Parameters.AddWithValue("@ztSinifEgitimiAtamaKategoriID", 0);
                    sqlCmd2.Parameters.AddWithValue("@ztSinifEgitimiAtamaEgitimTipi", 0);

                    sqlCmd2.ExecuteNonQuery();

                    button4.Enabled = false;
                    yenile();
                }
                else
                {
                    MessageBox.Show("Lütfen Tüm Bilgileri Doldurunuz.");
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Hata Mesajı");
            }
            finally
            {
                baglan.Close();
            }
        }
    }
}

SQL上的范围

  https://prnt.sc/hvybtx
  http://prntscr.com/hvyctw
  http://prntscr.com/hvydd5

1 个答案:

答案 0 :(得分:2)

您正在执行两次命令:

String LastID = sqlCmd.ExecuteScalar().ToString();
sqlCmd.ExecuteNonQuery();

做第一个。

另外,我更喜欢使用OUTPUT来获取最后一个身份。

INSERT INTO [dbo].[ztSinifEgitimi2]
       (
       [EgitimAdi]
       )
OUTPUT inserted.ID -- or whatever your identity column is named....
VALUES
       (@ztSinifEgitimiEgitimAdi
       )