Sql Bulk Copy / Insert en C #

.net c# sql sqlbulkcopy

Question

Je suis nouveau sur JSON et SQLBulkCopy. J'ai des données POST au format JSON que je souhaite copier / insérer en bloc dans Microsoft SQL en utilisant C #.

Format JSON:

{
    "URLs": [{
        "url_name": "Google",
        "url_address": "http://www.google.com/"
    },
    {
        "url_name": "Yahoo",
        "url_address": "http://www.yahoo.com/"
    },
    {
        "url_name": "FB",
        "url_address": "http://www.fb.com/"
    },
    {
        "url_name": "MegaSearches",
        "url_address": "http://www.megasearches.com/"
    }]
}

Des classes:

public class UrlData
{
    public List<Url> URLs {get;set;}
}

public class Url
{
    public string url_address {get;set;}
    public string url_name {get;set;}
}

Comment puis-je le faire efficacement?

Réponse acceptée

Puisque vous devez charger juste

de 10 à 50 urls
il n'est évidemment pas nécessaire d'utiliser SqlBulkCopy - c'est pour des milliers d'inserts. Sauf si vous aurez besoin de répéter cette opération plusieurs fois.

Donc, si vous avez une liste d’URL, c’est-à-dire Liste, alors parcourez toutes les URL de la liste et insérez-les dans la base de données, par exemple:

string insertQuery = "insert into TUrls(address, name) values(@address, @name)";
foreach (URL url in listOfUrls)
{
    SqlCommand cmd = new SqlCommand(insertQuery);
    cmd.Parameters.AddWithValue("@name", url.url_name);
    cmd.Parameters.AddWithValue("@address", url.urld_address);

    // don't forget to take care of connection - I omit this part for clearness
    cmd.ExecuteNonQuery();
}

Mais si vous devez vraiment utiliser SqlBulkCopy vous devez convertir vos objets de la classe URL en DataTable . Pour ce faire, regardez la réponse de Marc Gravell :

Voici une belle mise à jour 2013 utilisant FastMember de NuGet:

IEnumerable<SomeType> data = ...
DataTable table = new DataTable();
using(var reader = ObjectReader.Create(data)) {
    table.Load(reader);
}

Oui, c'est à peu près le contraire de celui- ci; la réflexion suffirait - ou si vous avez besoin de plus rapidement, HyperDescriptor en 2.0, ou peut-être Expression en 3.5. En fait, HyperDescriptor devrait être plus que suffisant.

Par exemple:

// remove "this" if not on C# 3.0 / .NET 3.5
public static DataTable ToDataTable<T>(this IList<T> data)
{
    PropertyDescriptorCollection props =
        TypeDescriptor.GetProperties(typeof(T));
    DataTable table = new DataTable();
    for(int i = 0 ; i < props.Count ; i++)
    {
        PropertyDescriptor prop = props[i];
        table.Columns.Add(prop.Name, prop.PropertyType);
    }
    object[] values = new object[props.Count];
    foreach (T item in data)
    {
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = props[i].GetValue(item);
        }
        table.Rows.Add(values);
    }
    return table;        
}

Vous pouvez donc utiliser l'une des solutions de Marc pour créer DataTable partir de votre List<URL> . Ensuite, il vous suffit d’écrire la table dans la table de destination sur le serveur:

string csDestination = "put here connection string to database";

using (SqlConnection destinationConnection = new SqlConnection(csDestination))
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
{
    bulkCopy.DestinationTableName = "TUrls";
    bulkCopy.WriteToServer(dataTableOfUrls);
}

J'espère que cela aide.

UPD

  1. Réponse à la question @ pseudonym27: "Bonjour, puis-je utiliser la classe BulkCopy pour ajouter des données à une table existante dans une base de données SQL?"

Bien sûr, vous le pouvez, parce que BulkCopy fonctionne comme une commande d’insertion, mais le fait un peu différemment, c’est tout. Je vous recommanderais d’utiliser des tables intermédiaires au cas où il y aurait une forte probabilité que les opérations tournent mal (et que vous vouliez occuper votre table de destination le moins de temps possible), ou vous devez effectuer certaines transformations de données, mais uniquement si vous en ressentez le besoin il.


Réponse populaire

Vous devez utiliser les paramètres de valeur Table. si vous utilisez> SQL Server 2005. Vous pouvez avoir un exemple ici



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi