2012-02-10 3 views
1

J'ai un DataTable qui est généré à partir de la table .xls.Comment mettre à jour une table SQL Server avec des données provenant d'une autre source (DataTable)

Je souhaite stocker ce DataTable dans une table existante dans la base de données SQL Server. J'utilise SqlBulkCopy pour stocker des rangées qui ont unique PK.

Le problème est, j'ai également d'autres lignes qui ont même PK comme table SQL Server, mais contiennent cellules ayant une valeur différente par rapport à la table SQL Server.

En bref:

Disons que dans mon DataTable j'ai une ligne comme ceci:

id (PK) | nom | numéro

005 | abc | 123

006 | lge | 122

Pour mon serveur SQL, j'ai comme ceci;

id (PK) | nom | numéro

004 | cbs | 345

005 | lks | 122

Maintenant vous voyez la ligne peut être téléchargée immédiatement dans SQL Server en utilisant SqlBulkCopy. D'autre part, la ligne ne peut pas être insérée en l'utilisant car la table du serveur SQL contient une ligne avec PK identique.

Maintenant, j'ai essayé d'extraire manuellement la ligne. Extrayez chaque cellule dans une ArrayList puis générez une instruction UPDATE Table par la suite. Cependant, cette méthode semble être irréalisable car j'ai tellement de lignes à traiter.

Je suis à la recherche d'une meilleure méthode pour atteindre cet objectif.

Toute aide est appréciée.

+0

Quelqu'un peut-il m'aider à formater la table? J'espère que cela n'a pas l'air trop confus. – rofans91

+0

Vous dites que vous voulez une implémentation réussie, mais vous n'expliquez pas * quoi * exactement vous voulez arriver pour 'id' de" 005 ". Voulez-vous remplacer les données dans la table de base de données? Ou simplement l'ignorer à partir du 'DataTable'? –

+0

Je veux l'écraser. – rofans91

Répondre

2

de Remerciez Utilisez le code ci-dessous:

C# Code latéral pour la lecture des données de DataTable et préparer les données XML:

DataTable dt = new DataTable(); 
StringBuilder sb = new StringBuilder(); 

sb.Append("<R>"); 
for (int i = 0; i < dt.Rows.Count; i++) 
{ 
    sb.Append("<C><ID>" + dt.Rows[0].ToString() + "</ID>"); 
    sb.Append("<N>" + dt.Rows[1].ToString() + "</N>"); 
    sb.Append("<I>" + dt.Rows[2].ToString() + "</I></C>"); 
} 

sb.Append("</R>"); 

///pass XML string to DB side 
/// 
//sb.ToString(); //here u get all data from data table as xml format 

côté de la base de données procédure stockée (vous devez mettre à jour votre nom de la table):

CREATE PROCEDURE dbo.UpdateData 
    -- Add the parameters for the stored procedure here 
    @data  XML 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- keep data into temp table 
    create table #tmp_data (id nchar(2),name varchar(20), number int) 

    DECLARE @XMLDocPointer INT 
    EXEC sp_xml_preparedocument @XMLDocPointer OUTPUT, @DATA 

    INSERT INTO #tmp_data(id,name,number) 
    SELECT ID,N,I 
    FROM OPENXML(@XMLDocPointer,'/R/C',2) 
    WITH(
      ID nchar(30), 
      N VARCHAR(20), 
      I int 
     ) 

    EXEC sp_xml_removedocument @XMLDocPointer 

    begin tran 
     -------------------INSERT not existing ones 
     INSERT INTO TABLE (id,name,number) 
     SELECT id,name,number 
     FROM #tmp_data 
     WHERE NOT EXISTS 
     (
      SELECT 1 
      FROM TABLE 
      WHERE ID = #tmp_data.ID 
     ) 

     --- update existing ones 
     UPDATE TABLE 
     SET name = #tmp_data.name, number = #tmp_data.number 
     FROM #tmp_data 
     WHERE #tmp_data.id = TABLE.id 

     commit tran 

    if(@@error <> 0) 
     rollback tran 

END 
+0

bonne réponse! bien joué! – rofans91

Questions connexes