sqltransaction在插入数据时插入双记录

时间:2014-11-16 19:04:07

标签: c# asp.net sql-server asp.net-mvc sqltransaction

我正在使用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();

            }

2 个答案:

答案 0 :(得分:4)

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

一个

Trislem1_Ekle.ExecuteNonQuery();

和另一个;

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

删除第一个似乎已经足够了。 ExecuteNonQueryExecuteScalar都会执行您的查询,ExecuteScalar会再次返回第一行的第一列。

不要手动处理数据库连接和命令,而是使用using statement

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

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

答案 1 :(得分:0)

试试这个

我认为您在Command ExecuteScalar()

上执行了两次Trislem1_Ekle
            Trislem1_Ekle.ExecuteNonQuery();    
            Tr2_TrAciklama.ExecuteNonQuery();
            string SonIDGelen = Trislem1_Ekle.ExecuteScalar().ToString();

替换为:

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