Cópia/inserção A Granel Sql em C#

Sou novo no JSON e no SQLBulkCopy. I have a JSON formatted POST data that I want to Bulk Copy / Insert in Microsoft SQL using C#.

formato 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/"
    }]
}

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;}
}
Como posso fazer isso de forma eficiente?

Author: Leigh, 2013-09-17

4 answers

Já que precisas de carregar apenas

De 10 a 50 urls obviamente não há necessidade de usar {[[4]} - é para milhares de inserções. Excepto se for necessário repetir esta operação muitas vezes.

Então, se você tem uma lista de urls, ou seja, lista, então basta fazer um loop através de todos os URL da lista e inseri - los na base de dados, por exemplo

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();
}

Mas se você realmente precisa usar SqlBulkCopy você precisa converter seus objetos da classe URL para DataTable. Para fazer este olhar A resposta de Marc Gravell:

Aqui está uma boa atualização de 2013 usando FastMember from NuGet:
IEnumerable<SomeType> data = ...
DataTable table = new DataTable();
using(var reader = ObjectReader.Create(data)) {
    table.Load(reader);
}

Sim, isto é exactamente o oposto de este.; reflexão seria suficiente-ou se você precisa mais rápido, HyperDescriptor em 2.0, ou talvez {[9] } em 3.5. Realmente, {[8] } deve ser mais do que adequado.

Por exemplo:

// 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;        
}
Para que possa usar uma das soluções do Marc para criar o seu List<URL>. Então você só precisa escrever a tabela para a tabela de destino no servidor:
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);
}
Espero que ajude.

UPD

  1. resposta a @pseudonym27 pergunta: "Olá posso usar a classe BulkCopy para adicionar dados à tabela existente na base de dados SQL?"

Claro que podes, porque o BulkCopy funciona como Apenas inserir um comando, mas será um pouco diferente, só isso. Recomendo-lhe que use mesas intermédias, caso a operação tenha alta. probabilidade de dar errado (e você quer ocupar a sua tabela de destino o menor tempo possível) ou você precisa fazer algumas transformações de dados, mas só se você sentir a necessidade disso.

 24
Author: pkuderov, 2017-05-23 12:25:51

Deve utilizar os parâmetros do valor da Tabela . Se estiver a utilizar > SQL server 2005. Você pode ter um exemplo aqui

 2
Author: Ehsan, 2013-09-17 04:42:48

Se forem apenas 10-50 urls, sendo inseridos com pouca frequência, podem disparar instruções de inserção. Simples e menos aborrecimento e você pode usar algo fácil e rápido como dapper.

Caso contrário, se quiser a cópia em massa, terá de criar e preencher um ADO.NET datável do seu JSON primeiro-de preferência igual ao esquema da sua tabela SQL de destino. A escolha é tua.
 1
Author: Vivek, 2013-09-20 21:24:51

Não sei que Base de dados estás a usar. Mas eu tenho experiência com postgres e eu assumo que isso é semelhante em outras bases de dados relacionais:

Em bases de dados, poderá copiar também a partir de valores delimitados pelo csv (por exemploPostgres). Se formatar as suas cadeias de caracteres de acordo com o formato de entrada expetado, esta deverá ser a forma mais rápida.

 -1
Author: schoetbi, 2013-09-17 03:57:13