none
sql id ye göre veri taşıma RRS feed

  • Soru

  • merhaba

    Aynı database altında çalışan iki farklı tablo arasında veri taşımak istiyorum.

    mesela A tablosunda stok listem var ve kullanılan malzemeyi id numarasını seçerek buradan silerek B tablosuna giden ürünler olarak eklemek istiyorum, internete hep tablo kopyalamadan bahsedilmiş, konu hakkında yardımlarınızı rica ederim.

    iyi çalışmalar


    • Düzenleyen uardal 15 Mart 2012 Perşembe 10:06
    • Değiştirilmiş Tür Serkan Bark 19 Mart 2012 Pazartesi 08:20
    15 Mart 2012 Perşembe 10:03

Yanıtlar

  • Merhaba,

    Asagiya daha onceden yazdigim bi code'u sizin icin degistirerek ekliyorum. Oncesinde birde TabloKontrol diye bir tablo yaratmaniz gerekiyor. Silerken Tabloyu yormamak icin 2dk aralik vererek aktarilanlari siliyor.

    IF NOT EXISTS (SELECT TOP(1) * FROM [TestDB].[dbo].[TabloA] WITH(NOLOCK) WHERE [Id] IN (SELECT [Id] FROM [PostaciOldOrders].[dbo].[TabloB] WITH(NOLOCK)))
      BEGIN
            INSERT INTO [PostaciOldOrders].[dbo].[TabloB]
            (
            	[Id], [Data]
            )
            OUTPUT INSERTED.Id INTO [TestDB].[dbo].[TabloKontrol] (Id)
            (
            SELECT
            	[Id], [Data]
            FROM [TestDB].[dbo].[TabloA] WITH(NOLOCK)
            WHERE [Id] < 20000
            )
      END
    GO
    
    DECLARE @Tarih VARCHAR(50)
    DECLARE @Sayac INT
        SET @Sayac = 0
    
    WHILE EXISTS (SELECT TOP(1) * FROM [TestDB].[dbo].[TabloA] WHERE [Id] IN (SELECT [Id] FROM [TestDB].[dbo].[TabloKontrol] WITH(NOLOCK)))
      BEGIN
    	 DELETE TOP(1000) FROM [TestDB].[dbo].[TabloA] WHERE [Id] IN (SELECT [Id] FROM [TestDB].[dbo].[TabloB] WITH(NOLOCK))
    
         SET @Tarih = GETDATE()
         RAISERROR (@Tarih, 0, 1) WITH NOWAIT
         WAITFOR DELAY '00:02:00'
    
       	 SET @Sayac = @Sayac + ISNULL(@@ROWCOUNT,0)
      END
     GO
    
     IF NOT EXISTS (SELECT TOP(1) * FROM [TestDB].[dbo].[TabloKontrol] WITH(NOLOCK) WHERE [Id] IN (SELECT [Id] FROM [TestDB].[dbo].[TabloA] WITH(NOLOCK)))
       BEGIN
       	TRUNCATE TABLE [TestDB].[dbo].[TabloKontrol]
       END
     GO

    Kolay gelsin.


    http://www.yigitaktan.com

    • Yanıt Olarak İşaretleyen Serkan Bark 19 Mart 2012 Pazartesi 08:20
    15 Mart 2012 Perşembe 12:03
  • merhaba

    şimdilik olayın mantığını anlamak için aşağıdaki gibi bir şey yaptım ve çalıştı.

    girdview ın tıklanma özelliğini kullanarak ve rowindex olayıyla seçtiğin satırdaki verileri zaten programımda mevcut olan textbox lara attım, oradanda insert into komutu ile diğer tabloya taşıdım, işim bitincede eski kayıtı ilk tablodan sildim. olayı görmek için ve kolay olsun diye şimdilik textboxlara attım fakat dataset ve datarow olayının  kullanımını biraz daha öğrenebilirsem daha mantıklı bir çözüme ulaşabilirim diye düşünüyorum. 

    Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            Dim satirno As Integer
            satirno = e.RowIndex
            Label11.Text = DataGridView1.Rows(satirno).Cells(0).Value.ToString()
            "
            "
            txt_çıkış.Text = DataGridView1.Rows(satirno).Cells(8).Value.ToString()
            txt_açıklama.Text = DataGridView1.Rows(satirno).Cells(9).Value.ToString()
            referans.Text = DataGridView1.Rows(satirno).Cells(10).Value.ToString()
        End Sub

     Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click

     Dim komut As SqlCommand = New SqlCommand("INSERT INTO tabloA (çağrıno,marka,model,referans,serino,macid,bölge,geliş_tarihi,çıkış_tarihi,açıklama) VALUES ('" + çağrıno.Text + "','" + txt_marka.Text + "','" + txt_model.Text + "','" + referans.Text + "','" + txt_serino.Text + "','" + txt_macid.Text + "','" + txt_bölge.Text + "','" + txt_geliş.Text + "','" + txt_çıkış.Text + "','" + txt_açıklama.Text + "')", baglantı)

    • Yanıt Olarak İşaretleyen Serkan Bark 19 Mart 2012 Pazartesi 08:21
    16 Mart 2012 Cuma 14:34
  • Merhaba,

    Ilgili linkten solution'i cekip deneyebilirsiniz. Denemek icin DB 'de 2 adet tablo yaratin. ID ve DATA column isimleri olusturun. Iki tabloda da ID'leri identity olarak set edin. A ya data doldurun. B bos kalsin.

    Tool su sekilde calisiyor; TabloA <-> TabloB ye gridview 'de datalari tasiyor. tasidigini tasidigi yerden silior. Once gridview 'den Row olarak secip Saga/Sola at diyin sonra kaydet diyin. VS2010 C# 'da build ettim.

    Solution'i buradan cekebilirsiniz: http://www.2shared.com/file/qe0n1-jT/Yigit.html

    Kolay gelsin.


    http://www.yigitaktan.com

    • Yanıt Olarak İşaretleyen Serkan Bark 19 Mart 2012 Pazartesi 08:21
    16 Mart 2012 Cuma 16:08
  • Merhaba,

    Hmm sizin istediginiz UI tarafinda da ayni zamanda tasimak. Aslinda istediginiz tam SQL Server forumu icin uygun degil ama sorununuz cozulsun yaziyorum. Asagiya yazdigim code 'u incelemenizi isteyecegim. Notepad++ 'da derlemeyerek yazdim syntax hatasi olabilir. DataSet'iniz sizin DataAdaptorunuz. Bunu kullanarak direk state kontrolu yaparak gridview'de aktarilan verinin insert statement'ini alabilirsiniz. VB 'ye cevirip deneyebilirsiniz. SqlDataAdapter + DataRowState olarak biraz arastirirsaniz static insert statement'i yazmadan cozebilirsiniz.

    System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter();
                da.Fill(DataRowState)
                da.InsertCommand.CommandText
    
                Datagridview.DataSource = ds;
                DS.row[0].rowstate == Added

    Kolay gelsin.


    http://www.yigitaktan.com

    • Yanıt Olarak İşaretleyen Serkan Bark 19 Mart 2012 Pazartesi 08:21
    15 Mart 2012 Perşembe 15:36

Tüm Yanıtlar

  • Merhaba,

    Asagiya daha onceden yazdigim bi code'u sizin icin degistirerek ekliyorum. Oncesinde birde TabloKontrol diye bir tablo yaratmaniz gerekiyor. Silerken Tabloyu yormamak icin 2dk aralik vererek aktarilanlari siliyor.

    IF NOT EXISTS (SELECT TOP(1) * FROM [TestDB].[dbo].[TabloA] WITH(NOLOCK) WHERE [Id] IN (SELECT [Id] FROM [PostaciOldOrders].[dbo].[TabloB] WITH(NOLOCK)))
      BEGIN
            INSERT INTO [PostaciOldOrders].[dbo].[TabloB]
            (
            	[Id], [Data]
            )
            OUTPUT INSERTED.Id INTO [TestDB].[dbo].[TabloKontrol] (Id)
            (
            SELECT
            	[Id], [Data]
            FROM [TestDB].[dbo].[TabloA] WITH(NOLOCK)
            WHERE [Id] < 20000
            )
      END
    GO
    
    DECLARE @Tarih VARCHAR(50)
    DECLARE @Sayac INT
        SET @Sayac = 0
    
    WHILE EXISTS (SELECT TOP(1) * FROM [TestDB].[dbo].[TabloA] WHERE [Id] IN (SELECT [Id] FROM [TestDB].[dbo].[TabloKontrol] WITH(NOLOCK)))
      BEGIN
    	 DELETE TOP(1000) FROM [TestDB].[dbo].[TabloA] WHERE [Id] IN (SELECT [Id] FROM [TestDB].[dbo].[TabloB] WITH(NOLOCK))
    
         SET @Tarih = GETDATE()
         RAISERROR (@Tarih, 0, 1) WITH NOWAIT
         WAITFOR DELAY '00:02:00'
    
       	 SET @Sayac = @Sayac + ISNULL(@@ROWCOUNT,0)
      END
     GO
    
     IF NOT EXISTS (SELECT TOP(1) * FROM [TestDB].[dbo].[TabloKontrol] WITH(NOLOCK) WHERE [Id] IN (SELECT [Id] FROM [TestDB].[dbo].[TabloA] WITH(NOLOCK)))
       BEGIN
       	TRUNCATE TABLE [TestDB].[dbo].[TabloKontrol]
       END
     GO

    Kolay gelsin.


    http://www.yigitaktan.com

    • Yanıt Olarak İşaretleyen Serkan Bark 19 Mart 2012 Pazartesi 08:20
    15 Mart 2012 Perşembe 12:03
  • merhaba

    kusura bakmayın ben bu konuda yeni olduğum için ve vb kullandığım için yazdıklarınızı kendi programıma uygulayamadım, yukarıdaki komutlara biraz açıklama yazmanız mümkün mü acaba?

    mesela gridview de tıkladığım satırdaki veriyi taşı butonuna basarak öbür tabloya taşımak istiyorum,buna göre basit bir örnek bulabilir miyim?

    benim sql komutlarım aşağıdaki gibi ,

    Dim komut As SqlCommand = New SqlCommand("INSERT INTO merkez (çağrıno,marka,model) VALUES ('" + çağrıno.Text + "','" + txt_marka.Text + "','" + txt_model.Text + "')", baglantı)

    iyi çalışmalar

    15 Mart 2012 Perşembe 15:13
  • Merhaba,

    Hmm sizin istediginiz UI tarafinda da ayni zamanda tasimak. Aslinda istediginiz tam SQL Server forumu icin uygun degil ama sorununuz cozulsun yaziyorum. Asagiya yazdigim code 'u incelemenizi isteyecegim. Notepad++ 'da derlemeyerek yazdim syntax hatasi olabilir. DataSet'iniz sizin DataAdaptorunuz. Bunu kullanarak direk state kontrolu yaparak gridview'de aktarilan verinin insert statement'ini alabilirsiniz. VB 'ye cevirip deneyebilirsiniz. SqlDataAdapter + DataRowState olarak biraz arastirirsaniz static insert statement'i yazmadan cozebilirsiniz.

    System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter();
                da.Fill(DataRowState)
                da.InsertCommand.CommandText
    
                Datagridview.DataSource = ds;
                DS.row[0].rowstate == Added

    Kolay gelsin.


    http://www.yigitaktan.com

    • Yanıt Olarak İşaretleyen Serkan Bark 19 Mart 2012 Pazartesi 08:21
    15 Mart 2012 Perşembe 15:36
  • teşekkür ederim , biraz denemeler yapayım, sonucu yazarım, ilginiz için teşekkürler.
    15 Mart 2012 Perşembe 15:40
  • Rica ederim.

    Sonucu yazarsaniz sevinirim.

    Kolay gelsin.


    http://www.yigitaktan.com

    15 Mart 2012 Perşembe 15:44
  • merhaba

    şimdilik olayın mantığını anlamak için aşağıdaki gibi bir şey yaptım ve çalıştı.

    girdview ın tıklanma özelliğini kullanarak ve rowindex olayıyla seçtiğin satırdaki verileri zaten programımda mevcut olan textbox lara attım, oradanda insert into komutu ile diğer tabloya taşıdım, işim bitincede eski kayıtı ilk tablodan sildim. olayı görmek için ve kolay olsun diye şimdilik textboxlara attım fakat dataset ve datarow olayının  kullanımını biraz daha öğrenebilirsem daha mantıklı bir çözüme ulaşabilirim diye düşünüyorum. 

    Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            Dim satirno As Integer
            satirno = e.RowIndex
            Label11.Text = DataGridView1.Rows(satirno).Cells(0).Value.ToString()
            "
            "
            txt_çıkış.Text = DataGridView1.Rows(satirno).Cells(8).Value.ToString()
            txt_açıklama.Text = DataGridView1.Rows(satirno).Cells(9).Value.ToString()
            referans.Text = DataGridView1.Rows(satirno).Cells(10).Value.ToString()
        End Sub

     Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click

     Dim komut As SqlCommand = New SqlCommand("INSERT INTO tabloA (çağrıno,marka,model,referans,serino,macid,bölge,geliş_tarihi,çıkış_tarihi,açıklama) VALUES ('" + çağrıno.Text + "','" + txt_marka.Text + "','" + txt_model.Text + "','" + referans.Text + "','" + txt_serino.Text + "','" + txt_macid.Text + "','" + txt_bölge.Text + "','" + txt_geliş.Text + "','" + txt_çıkış.Text + "','" + txt_açıklama.Text + "')", baglantı)

    • Yanıt Olarak İşaretleyen Serkan Bark 19 Mart 2012 Pazartesi 08:21
    16 Mart 2012 Cuma 14:34
  • Merhaba,

    Ilgili linkten solution'i cekip deneyebilirsiniz. Denemek icin DB 'de 2 adet tablo yaratin. ID ve DATA column isimleri olusturun. Iki tabloda da ID'leri identity olarak set edin. A ya data doldurun. B bos kalsin.

    Tool su sekilde calisiyor; TabloA <-> TabloB ye gridview 'de datalari tasiyor. tasidigini tasidigi yerden silior. Once gridview 'den Row olarak secip Saga/Sola at diyin sonra kaydet diyin. VS2010 C# 'da build ettim.

    Solution'i buradan cekebilirsiniz: http://www.2shared.com/file/qe0n1-jT/Yigit.html

    Kolay gelsin.


    http://www.yigitaktan.com

    • Yanıt Olarak İşaretleyen Serkan Bark 19 Mart 2012 Pazartesi 08:21
    16 Mart 2012 Cuma 16:08
  • Merhaba

    Yiğit bey çok aydınlatıcı bir örnek olmuş, bu konudaki bütün sorularıma cevap veriyor. İlginiz için çok teşekkür ederim.

    iyi çalışmalar 

    17 Mart 2012 Cumartesi 11:23
  • Rica ederim.

    Yardimci olabildigime sevindim.

    Code post'unu yardimci olarak oylarsaniz, probleminizin completed oldugu anlasilir.

    Kolay gelsin.


    http://www.yigitaktan.com

    17 Mart 2012 Cumartesi 11:37