Por qué mi SqlBulkCopy no está funcionando

asp.net c# sqlbulkcopy sql-server-2005

Pregunta

Estoy utilizando el objeto SqlBulkCopy para escribir una tabla de datos en una tabla de servidor SQL. Sin embargo, cada vez que vuelvo a revisar mi base de datos permanece intacta sin cambios. UN

He intentado realizar una búsqueda en Google para determinar mi problema, pero no puedo resolverlo.

El datatable vino de un archivo .xls.

public static DataTable dt = new DataTable();

private void ExportToGrid(String path, String filen)
    {
        int idx = filen.IndexOf(".");
        string tf = filen.Remove(idx, 4);

        OleDbConnection MyConnection = null;
        DataSet DtSet = null;
        OleDbDataAdapter MyCommand = null;
        MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; Data Source='" + path + "';Extended Properties=Excel 8.0;");

        ArrayList TblName = new ArrayList();

        MyConnection.Open();
        DataTable schemaTable = MyConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
        foreach (DataRow row in schemaTable.Rows)
        {
            TblName.Add(row["TABLE_NAME"]);
        }

        MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [" + TblName[0].ToString() + "]", MyConnection);
        DtSet = new System.Data.DataSet();

        MyCommand.Fill(DtSet);
        MyCommand.FillSchema(DtSet, SchemaType.Source);

        DataTable dt = new DataTable();
        dt = DtSet.Tables[0];
        Session["dt"] = dt;
        int x = dt.Rows.Count;
        MyConnection.Close();

        if (dt.Rows.Count > 0)
        {
            theGridView.DataSource = dt;
            theGridView.DataBind();
        }

        if (System.IO.File.Exists(path))
        {
            System.IO.File.Delete(path);
        }

    }

Esta es mi función de escritor

private void StartImport()
    {
        string servername = server;
        string database = database;
        string tbl = "dbo.LinkDb";

        Stopwatch sw = new Stopwatch();
        sw.Start();
        SqlBulkCopy bulkCopy = new SqlBulkCopy("Data Source=" + servername + ";Initial Catalog=" + database + ";Integrated Security=SSPI", SqlBulkCopyOptions.TableLock);
        bulkCopy.DestinationTableName = tbl;
        bulkCopy.WriteToServer(dt);
        sw.Stop();
        lblResult.Visible = true;
        lblResult.Text = (sw.ElapsedMilliseconds / 1000.00).ToString();
    }

A continuación se muestra la captura de pantalla de las tablas almacenadas en mi servidor SQL. Le aseguro que he estado cumpliendo con las reglas de mayúsculas y minúsculas.

Mesas

No se lanzó ninguna excepción y el tiempo promedio transcurrido es de 0.018 - 0.020 seg.

Aprecia cualquier ayuda.

Gracias

Respuesta aceptada

Basado en el código que ha publicado, está escribiendo una base de datos vacía en la base de datos. Su método "ExportToGrid" llena dt, un DataTable declarado localmente, que pierde alcance fuera del método. Su función de escritura está llamando al dt DataTable estático, que es un nuevo datatable.

¿Tiene que ser dt estático? Parece que esto podría ser declarado como

private DataTable dt;

luego dentro de "ExportToGrid" en lugar de declarar otro DataTable, simplemente cree una instancia del dt ya declarado en lugar de declarar uno nuevo

dt = new DataTable();

Alternativamente, podría extraer el DataTable directamente de GridView durante el Método de escritura:

DataTable dt = (DataTable)theGridView.DataSource;
bulkCopy.WriteToServer(dt);

Esto elimina la necesidad de variables fuera del alcance del método.

Por último, ya que está almacenando sus datos en la sesión (generalmente no soy un defensor de almacenar grandes cantidades de datos en las variables de la sesión pero sin conocer los detalles de su sitio, realmente no puedo emitir juicios), puede usar lo siguiente:

DataTable dt = (DataTable)Session["dt"];
bulkCopy.WriteToServer(dt);

Respuesta popular

No veo nada obvio en comparación con mi uso, excepto por el hecho de que explícitamente asigno columnas de la tabla de datos a la tabla de la base de datos.

Using cn As New SqlConnection(DataAccessResource.CONNECTIONSTRING)
    cn.Open()
    Using copy As New SqlBulkCopy(cn)
        copy.BulkCopyTimeout = 300
        copy.ColumnMappings.Add(0, 0)
        copy.ColumnMappings.Add(1, 1)
        copy.ColumnMappings.Add(2, 2)
        copy.ColumnMappings.Add(3, 3)
        copy.DestinationTableName = "Tablename"
        copy.WriteToServer(dataset.datatable)
    End Using
End Using

La cadena de conexión (servidor sql 2000!) Se parece a

"data source=DBSERVERNAME;initial catalog=DBNAME;persist security info=True;user id=USERNAME;password=PASSWORD;packet size=4096"

Dudo que la cadena de conexión sea un problema suponiendo que la hayas usado en otro lugar.

Finalmente, ha revisado los tipos de datos para las columnas en el conjunto de datos que se pueden combinar con las de la base de datos. Según mi experiencia, la carga de oledb desde Excel no siempre produce el resultado esperado, los campos de fecha y las columnas con texto mixto y números son problemas específicos.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué