SQL 事务在插入数据时插入双记录

本文关键字:插入 记录 数据 SQL 事务 | 更新日期: 2023-09-27 18:30:41

我正在使用该sqltransaction为每个数据插入多个表。

但是我有问题,数据库有两个相同的数据。

我应该怎么做才能解决这个问题?

请帮帮我?感谢

SqlConnection baglanti = system.baglan();
            SqlCommand Trislem1_Ekle = new SqlCommand("Insert tblTr (Ad,TipID,BolgeID,Yerler,Resim) values(@Ad,@TipID,@BolgeID,@Yerler,@Resim)  SELECT SCOPE_IDENTITY()", baglanti);
            SqlCommand Tr2_TrAciklama = new SqlCommand("Insert tblTrAciklamaDetay (TrID,TrProgram) values((SELECT IDENT_CURRENT('tblTr')),@TrProgram)", baglanti);
            Trislem1_Ekle.Parameters.AddWithValue("@Ad", txtTrAd.Text);
            Trislem1_Ekle.Parameters.AddWithValue("@TipID", dlTrTip.SelectedValue);
            Trislem1_Ekle.Parameters.AddWithValue("@BolgeID", BolgeID.SelectedValue);
            Trislem1_Ekle.Parameters.AddWithValue("@Yerler", Yerler.Text);
            Trislem1_Ekle.Parameters.AddWithValue("@Resim", Resim.SelectedValue);
            Tr2_TrAciklama.Parameters.AddWithValue("@TrProgram", TrProgram.Text);
            SqlTransaction sqlTrans = baglanti.BeginTransaction();
            Trislem1_Ekle.Transaction = sqlTrans;
            Tr2_TrAciklama.Transaction = sqlTrans;
            try
            {
                Trislem1_Ekle.ExecuteNonQuery();
                Tr2_TrAciklama.ExecuteNonQuery();
                string SonIDGelen = Trislem1_Ekle.ExecuteScalar().ToString();
               sqlTrans.Commit();
            }
           catch (Exception hata)
            {
                Response.Write("İşleminiz yapılamadı, Oluşan Hatanın Detayı<br />" + hata);
               sqlTrans.Rollback(); 
            }
            finally
            {  
                baglanti.Close();
                baglanti.Dispose();
                Trislem1_Ekle.Dispose();
                Tr2_TrAciklama.Dispose();
            }

SQL 事务在插入数据时插入双记录

据我所知,您执行了两次Trislem1_Ekle命令。

一个与

Trislem1_Ekle.ExecuteNonQuery();

另一个与;

string SonIDGelen = Trislem1_Ekle.ExecuteScalar().ToString();

删除第一个似乎就足够了。ExecuteNonQueryExecuteScalar 都会执行查询,ExecuteScalar还返回第一行的第一列。

不要手动释放数据库连接和命令,而是改用using语句。

using(SqlConnection conn = new SqlConnection(conString))
{    
   using(SqlCommand cmd = conn.CreateCommand())
   {
      // Create your commands
      // Add your parameter values
      // Execute your commands
   }
}

并且不要使用AddWithValue方法。它可能会产生一些未扩展的结果。请改用.Add()方法和重载。

  • 我们可以停止使用AddWithValue()吗?

尝试这样做

我认为您在命令Trislem1_Ekle上执行了两次ExecuteScalar()

            Trislem1_Ekle.ExecuteNonQuery();    
            Tr2_TrAciklama.ExecuteNonQuery();
            string SonIDGelen = Trislem1_Ekle.ExecuteScalar().ToString();

替换为:

            string SonIDGelen = Trislem1_Ekle.ExecuteScalar().ToString();
            Tr2_TrAciklama.ExecuteNonQuery();