SqlBulkCopy et SQL Server déclenchent des problèmes

asp.net c# sqlbulkcopy sql-server

Question

J'ai le code suivant dans mon application. J'utilise SqlBulkCopy pour télécharger des données Excel dans une table SQL Server. Maintenant, j'ai un déclencheur sur cette table. J'ai changé mon code existant de cette manière, mais je reçois une erreur.

L'erreur est

Argument 1: impossible de convertir 'System.Data.SqlClient.SqlConnection' en 'string'

J'ai changé le code comme

oSqlBulk = new SqlBulkCopy("cn", SqlBulkCopyOptions.FireTriggers);

Alors j'obtiens une erreur

Le format de la chaîne d'initialisation n'est pas conforme à la spécification commençant à l'index 0.

S'il vous plaît vérifier mon code:

public static string ExecuteBulkCopy(string connectionString, string TableName, string Paths)
{
    SqlBulkCopy oSqlBulk = null;
    string error = null;

    OleDbConnection myExcelConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; " +
                       "Data Source=" + Paths +
                       ";Extended Properties=Excel 12.0;");

    try
    {
        myExcelConn.Open();

        // GET DATA FROM EXCEL SHEET.
        OleDbCommand objOleDB = new OleDbCommand("SELECT *FROM [Sheet1$]", myExcelConn);

        // READ THE DATA EXTRACTED FROM THE EXCEL FILE.
        OleDbDataReader objBulkReader = null;
        objBulkReader = objOleDB.ExecuteReader();

        using (SqlConnection cn = new SqlConnection(connectionString))
        {
            // cn.Open();
            oSqlBulk = new SqlBulkCopy(cn,SqlBulkCopyOptions.FireTriggers);

            oSqlBulk.DestinationTableName = TableName; // TABLE NAME.
            oSqlBulk.WriteToServer(objBulkReader);
            // return 1;

            //call the overload that takes a connection in place of the connection string
            // return ExecuteNonQuery(cn, commandType, commandText, commandParameters);
        }
    }
    catch (Exception ex)
    {
        error = ex.Message;
    }
    finally
    {
        oSqlBulk.Close();
        oSqlBulk = null;
        myExcelConn.Close();
        myExcelConn = null;
    }

    return error;
}

Réponse acceptée

Si vous vérifiez les constructeurs valides pour SqlBulkCopy: https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.sqlbulkcopy(v=vs.110).aspx

Vous remarquerez que la surcharge avec SqlBulkCopyOptions n'accepte pas directement SqlConnection. Juste le ConnectionString

Depuis que SqlBulkCopy implémente IDisposable

Vous devez remplacer entièrement le SqlConnection:

using (var oSqlBulk = new SqlBulkCopy(connectionString,SqlBulkCopyOptions.FireTriggers))
{
    oSqlBulk.DestinationTableName = TableName; 
    oSqlBulk.WriteToServer(objBulkReader);
}

Réponse populaire

J'ai fait les changements suivants.Il fonctionne maintenant

 using (SqlConnection cn = new SqlConnection(connectionString))
                {

                    cn.Open();
                    oSqlBulk = new SqlBulkCopy(connectionString,SqlBulkCopyOptions.FireTriggers);


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