Saltar al contenido

Copia / inserción masiva de SQL en C #

Solución:

Dado que necesita cargar solo

de 10 a 50 urls

obviamente no hay necesidad de usar SqlBulkCopy – es para miles de inserciones. Excepto si será necesario que repita esta operación muchas veces.

Entonces, si tiene una lista de URL, es decir, Lista, simplemente recorra todas las URL de la lista e insértelas en la base de datos, por ejemplo

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

Pero si realmente necesitas usar SqlBulkCopy necesitas convertir tus objetos de clase URL para DataTable. Para hacer esto, mire la respuesta de Marc Gravell:

Aquí hay una buena actualización de 2013 con FastMember de NuGet:

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

Sí, esto es exactamente lo contrario de este; la reflexión sería suficiente, o si necesita más rápido,
HyperDescriptor en 2.0, o tal vez Expression en 3.5. Realmente,
HyperDescriptor debería ser más que adecuado.

Por ejemplo:

// 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 pueda utilizar una de las soluciones de Marc para crear DataTable de tu List<URL>. Entonces solo necesita escribir la tabla en la tabla de destino en el 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 eso ayude.

UPD

  1. Respuesta a la pregunta de @ pseudonym27: “Hola, ¿puedo usar la clase BulkCopy para agregar datos a una tabla existente en la base de datos SQL?”

Por supuesto que puede, porque BulkCopy funciona como un comando de inserción, pero es un poco diferente, eso es todo. Le recomendaría que use tablas intermedias en caso de que la operación tenga una alta probabilidad de salir mal (y desee ocupar su tabla de destino el menor tiempo posible) o si necesita hacer algunas transformaciones de datos, pero solo si siente la necesidad de eso.

Usando este código a continuación, puede convertir List<YourClassname> a DataTable: –

List<YourClass> objlist = alldata;
string json = Newtonsoft.Json.JsonConvert.SerializeObject(objlist);
DataTable dt = Newtonsoft.Json.JsonConvert.DeserializeObject<DataTable>(json);
SaveDataInTables(dt, "Table_Name_Of_SQL");

Aquí, supongo que todos los datos contienen list<YourClass> objeto y también puede hacer – objlist.Add(objYourClass), luego pasa sql_TableName y tabla de datos en SaveDataInTables método. Este método insertará todos los datos en SQL_Table.

public void SaveDataInTables(DataTable dataTable, string tablename)
{
   if (dataTable.Rows.Count > 0)
   {
       using (SqlConnection con = new SqlConnection("Your_ConnectionString"))
       {
           using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
           {
               sqlBulkCopy.DestinationTableName = tablename;
               con.Open();
               sqlBulkCopy.WriteToServer(dataTable);
               con.Close();
            }
        }
    }
}

¡Espero que estos códigos te ayuden!

Debe utilizar parámetros con valores de tabla. si está utilizando> SQL Server 2005. Puede tener un ejemplo aquí

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *