2013-07-23 10 views
7

İlk olarak, saklı yordamları veya görünümleri kullanamıyorum.
Bunun tersine etkili görünebileceğini biliyorum, ancak bunlar benim kurallarım değil.DataTable ile SQL Tablosu Ekle veya Güncelle

Verilerle dolu bir DataTable sahibim. SQL tablomun çoğaltılmış bir yapısı vardır.

ID - NAME

SQL tablosu mevcut verilerin biraz var, ama ben artık DataTable tüm verilerle güncellemeniz gerekir. Kimliğin eşleşmesi durumunda SQl Tablosunu GÜNCELLEŞTİRMELİ veya benzersiz olduğu listeye EKLE gerekiyor.

Bunu yalnızca WinForm Uygulamamda yapmanın bir yolu var mı?

Şimdiye kadar, ben vardır: DataTable

SqlConnection sqlConn = new SqlConnection(ConnectionString); 
      SqlDataAdapter adapter = new SqlDataAdapter(string.Format("SELECT * FROM {0}", cmboTableOne.SelectedItem), sqlConn); 
      using (new SqlCommandBuilder(adapter)) 
      { 
       try 
       { 
        adapter.Fill(DtPrimary); 
        sqlConn.Open(); 
        adapter.Update(DtPrimary); 
        sqlConn.Close(); 
       } 
       catch (Exception es) 
       { 
        MessageBox.Show(es.Message, @"SQL Connection", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
       } 
      } 

:

 DataTable dtPrimary = new DataTable(); 

     dtPrimary.Columns.Add("pv_id"); 
     dtPrimary.Columns.Add("pv_name"); 

     foreach (KeyValuePair<int, string> valuePair in primaryList) 
     { 
      DataRow dataRow = dtPrimary.NewRow(); 

      dataRow["pv_id"] = valuePair.Key; 
      dataRow["pv_name"] = valuePair.Value; 

      dtPrimary.Rows.Add(dataRow); 

SQL:

CREATE TABLE [dbo].[ice_provinces](
    [pv_id] [int] IDENTITY(1,1) NOT NULL, 
    [pv_name] [nvarchar](50) NOT NULL, 
CONSTRAINT [PK_ice_provinces] PRIMARY KEY CLUSTERED 
(
    [pv_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
+0

Geçerli kod hile yapmak gerekir:

Yani burada örnek kod (komple ConsoleApplication) 'dir. Bir hatayla ya da sessizce başarısız mı? Bu ASP.NET mi? – Renan

+0

LINQ kullanabilir misiniz? – user1477388

+0

@Renan, şu anda değerleri yalnızca önceki tablonun sonuna ekliyor. - Evet, linq kullanabilirim – TheGeekZn

cevap

3

güncelleme mevcut değerleri inip o Datatable yenilerini eklemek ediyoruz yana TÜM VERİLERİME NEDEN OLABİLİRSİNİZ Aşağıdaki yaklaşım sizin için en iyi şekilde çalışabilir:

  1. SQL Tablo gelen tüm mevcut verileri silin (eğer WriteToServer yöntemini kullanarak SQL tablosuna ADO.NET tablodan toplu ekleme verilerine hız ve verimlilik
  2. Kullanım ADO.NET SqlBulcCopy sınıfı için TSQL TRUNCATE deyimi kullanabilirsiniz.

Görünümler veya saklı yordamlar dahil, yalnızca salt TSQL ve .NET kodu.

+0

Programlanması kolay, ancak çok iyi ölçeklenmeyebilir. Şimdiye kadar çok fazla kayıt yoksa, bu iyi çalışmalıdır. –

+1

@MichaelTodd true, ancak TRUNCATE/Toplu kopyalama kombinasyonunun yüz binlerce kayıt için iyi olması gerektiğini düşünüyorum. Ancak OP, tüm verileri bellek içi DataTable'da sakladığından ve (umarız) çok fazla olmaması gerektiğinden, buna bile gelmemelidir. –

+0

Bu çok inelegant, kaba zorlama çözümdür. – Renan

0

Veritabanındaki kayıtları en azından güncelleyebildiğim bu benim denemem. Çözümünüzden bugüne kadar, Fill() yürütüldükten sonra DataTable'a değerler uygulamasından farklıdır. Güncellemek zorunda olduğunuz kayıtlar varsa, DataTable'da elle arama yapmanız gerekir, bu dezavantajdır. Başka bir şey, fark ettim ki, DataTable, MissingSchemaAction'ı doğru ayarlamamışsanız, tablo şemasını veritabanından devralmaz.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data.SqlClient; 
using System.Data; 

namespace SQLCommandBuilder 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SqlConnectionStringBuilder ConnStringBuilder = new SqlConnectionStringBuilder(); 
      ConnStringBuilder.DataSource = @"(local)\SQLEXPRESS"; 
      ConnStringBuilder.InitialCatalog = "TestUndSpiel"; 
      ConnStringBuilder.IntegratedSecurity = true; 

      SqlConnection sqlConn = new SqlConnection(ConnStringBuilder.ConnectionString); 

      SqlDataAdapter adapter = new SqlDataAdapter(string.Format("SELECT * FROM {0}", "ice_provinces"), sqlConn); 
      adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; // needs to be set to apply table schema from db to datatable 

      using (new SqlCommandBuilder(adapter)) 
      { 
       try 
       { 
        DataTable dtPrimary = new DataTable();         

        adapter.Fill(dtPrimary); 

        // this would be a record you identified as to update: 
        dtPrimary.Rows[1]["pv_name"] = "value"; 

        sqlConn.Open(); 
        adapter.Update(dtPrimary); 
        sqlConn.Close(); 
       } 
       catch (Exception es) 
       { 
        Console.WriteLine(es.Message); 
        Console.Read(); 
       } 
      } 
     } 
    } 
}