2010-10-18 24 views
1

J'ai une datatable correspondant à la structure d'une table MS SQL et je voudrais importer de nouveaux enregistrements de la datatable dans SQL. Donc, dans l'exemple ci-dessous, je cherche à importer l'enregistrement pour Jim.Importer des enregistrements uniques de la table datatable vers sql

DataTable:

Name DOB  Country 
Brian 11-11-78 USA 
Dave 01-01-80 UK 
Jim 02-02-81 FR 

SQL:

Name DOB  Country 
Brian 11-11-78 USA 
Dave 01-01-80 UK 
+0

Quelle est la clé primaire sur vos tables? Vous pouvez importer tous les enregistrements de la base de données d'origine vers une table temporaire, puis effectuer un MERGE (SQL Server) – Tony

+0

Désolé, je n'ai pas PK. J'ai prévu de combiner une combinaison de Name et DOB pour distinguer. – Brian

+0

Jetez également un coup d'oeil à Microsoft Sync Framework (http://msdn.microsoft.com/en-us/sync/default.aspx) –

Répondre

1

Vous pouvez faire une SP, et de transmettre les valeurs que vous avez dans votre DataTable, et utiliser MERGE (Transact-SQL) pour faire INSERT/UPDATE:

Taille selon vos données, en supposant le nom de votre table SQL est _DOB:

MERGE INTO _DOB AS Target 

USING (--SELECT NAME,DOB,COUNTRY FROM FROM YOUR DataTable 
     VALUES ('Jim','1978-11-11', 'FR') 
     ) 
     AS Source (Name, DOB, Country) 
ON 
    Target.Name = Source.Name 
    AND Target.DOB = Source.DOB 

WHEN MATCHED THEN 
    UPDATE SET 
     Target.Name = Source.Name, 
     Target.DOB = Source.DOB, 
     Target.Country = Source.Country 

WHEN NOT MATCHED BY TARGET THEN 
    INSERT (Name, DOB, Country) 
    VALUES (Source.Name, Source.DOB, Source.Country); 
+0

Pas besoin d'une procédure stockée, juste en masse Copiez les données dans une table temporaire puis utilisez l'instruction MERGE (comme vous l'avez montré ci-dessus) pour mettre à jour la destination. Cela devrait être beaucoup plus efficace que de fusionner chaque rangée individuellement. – Tony

+0

Selon la taille des données et la fréquence de fonctionnement, cela pourrait être une option. –

+0

Merci Kman. Tony, est-ce que je créerais la table temporaire dans le code? – Brian

0
INSERT INTO 
    datatable (name, dob, country) 
SELECT 
    name, dob, country 
FROM 
    sql 
WHERE 
    NOT EXISTS(
     SELECT 
      * 
     FROM 
      datatable 
     WHERE 
      datatable.name=sql.name AND 
      datatable.dob=sql.dob 
    ) 
1

C'est ce que j'ai fini et il semble faire l'affaire. Merci à tous pour votre contribution.

this.conn = new oleDbConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString); 

OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM name", conn); 

DataSet ds = new DataSet(); 

adapter.Fill(ds, "name"); 

DataTable data = ds.Tables["name"]; 

sqlCommand = "CREATE TABLE ##TempTable(Name, DOB, Location)"; 

SqlConnection SQLconn = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection1"].ConnectionString); 
SQLconn.Open(); 

using (SqlCommand cmd = new SqlCommand(sqlCommand, SQLconn)) 
{ 
    cmd.CommandType = CommandType.Text; 

    cmd.ExecuteReader(); 

    SqlBulkCopy bulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString); 
    // Map the columns 
    foreach (DataColumn col in data.Columns) 
    bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName); 
    bulkCopy.DestinationTableName = "##TempTable"; 
    bulkCopy.WriteToServer(data); 
} 

string MergeCommand = string.Concat("insert into [Existing Table] (Name, DOB, Location) ", 
    "select distinct Name, DOB, Location from ##TempTable ", 
    "WHERE NOT EXISTS (SELECT 1 FROM [Existing Table] a WHERE a.[Name] = ##TempTable.[Name] and a.[DOB] = ##TempTable.[DOB])"); 

SqlConnection Mergeconn = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString); 
Mergeconn.Open(); 

using (SqlCommand MergeCmd = new SqlCommand(MergeCommand, Mergeconn)) 
{ 
    MergeCmd.CommandType = CommandType.Text; 
    MergeCmd.ExecuteReader(); 
} 

SQLconn.Close(); 
Mergeconn.Close();