我正在使用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
答案 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
)