2010-07-27 10 views
7

Est-il possible d'insérer en bloc un System.Data.DataTable en C# dans une table SQL Server en utilisant une procédure de stockage et en passant cette table en paramètre?Insérer des données de table C# dans une table SQL Server

La table n'aura pas un nombre fixe d'enregistrements.

+1

Quelle version de SQL Server? 2008? –

Répondre

6

Oui, il y a un moyen:

 DataTable dataTable = null; // your data needs to be here 
     try 
     { 
      ConnectionStringSettings mConString = ConfigurationManager.ConnectionStrings["SiteSqlServer"]; 

      // Optional truncating old table 
      using (SqlConnection connection = new SqlConnection(mConString.ConnectionString)) 
      { 
       connection.Open(); 
       // Delete old entries 
       SqlCommand truncate = new SqlCommand("TRUNCATE TABLE MYTABLE", connection); 
       truncate.ExecuteNonQuery(); 
      } 

      SqlBulkCopy bulkCopy = new SqlBulkCopy(mConString.ConnectionString, SqlBulkCopyOptions.TableLock) 
              { 
               DestinationTableName = "dbo.MYTABLE", 
               BatchSize = 100000, 
               BulkCopyTimeout = 360 
              }; 
      bulkCopy.WriteToServer(dataTable); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 

S'il vous plaît Experiement avec le BatchSize - 100000 était bon pour moi - il ne devrait pas être supérieure à celle - vitesse migth diminue autrement. BatchSize ne limite pas vos données - c'est juste la taille de chaque "paquet" qui sera envoyé au serveur sql. SiteSQLServer doit être dans votre app.config ou web.config.

Vous devez changer les paramètres ici sinon.

Veuillez changer MYTABLE à votre nom de table.

+0

Andread, cela fonctionne bien mais que faire si vous avez un DBA têtu qui ne donne pas les autorisations d'insertion en vrac .. ??? alors quoi – MethodMan

+0

Cela ne fonctionnerait pas. Mais ce n'était pas la question ... L'insertion en bloc devrait être activée pour l'utiliser et ceci est la valeur par défaut. –

2

Dans les versions de SQL Server antérieures à 2008, le seul moyen de transmettre un ensemble DataTable à SQL Server était SqlBulkCopy. Vous devez placer toutes les données dans une table temporaire (probablement temporaire) et appeler la procédure pour traiter les données intermédiaires.

Dans SQL Server 2008, des types définis par l'utilisateur de type table ont été introduits. Ils fournissent de nouvelles options pour travailler avec des ensembles de données.

Jetez un oeil à MSDN:

et probablement une seconde à deux de mes messages de blog:

+0

Nice - mais plus lent que bulkcopy ... –

+0

Bien sûr, plus lent (mais pas trop) mais plus puissant, car aucune table de mise en scène nécessaire –

+0

salut Florian, Juste essayer de courir quelque chose comme ça, mais cela ne fonctionne pas. .. USE AdventureWorks; GO/* Crée un type de table défini par l'utilisateur */ LocationTableType CREATE TYPE AS TABLEAU (LocationName VARCHAR (50) , CostRate INT); GO J'ai la base de données AdventureWorks dans mon SQL Server, ne devrais-je pas être en mesure de créer le nouveau type? Je viens d'obtenir cette erreur ... Msg 156, Niveau 15, État 1, Ligne 3 Syntaxe incorrecte près du mot-clé 'AS'. Merci –

Questions connexes