0
votes

Comment copier la table Access dans la table SQL en C #?

Comme le titre l'indique, j'ai utilisé odbcconnection pour sqlconnection et pendant toute ma vie, je ne peux pas le faire fonctionner .. J'ai copié un tas de code à partir de ce site mais je ne peux pas les faire fonctionner tous les deux.

Le programme se bloque tellement peut-être que je fais quelque chose de mal, mais j'apprécierais peut-être un modèle simple que je pourrais simplement remplir les détails de connexion et copier en bloc le tableau dans le tableau.

 using (OdbcConnection myConnection = new OdbcConnection())
            {
                string myConnectionString = @"Driver={Microsoft Access Driver (*.mdb)};" +
 "Dbq=//####/data/Toronto/wrkgrp/wrkgrp30/Business Risk Oversight and Control/DATA INTEGRITY/CDE/CDE Testing Portal Requirements/Migration Requirements/RCM/Mutual Funds/Mutual Funds.mdb;";

                myConnection.ConnectionString = myConnectionString;
                myConnection.Open();

                //execute queries, etc
                OdbcCommand cmd = myConnection.CreateCommand();

                cmd.CommandText = "SELECT * FROM RCM_MF_New_Accounts_Samples";
                OdbcDataReader reader = cmd.ExecuteReader(); // close conn after complete

                DataTable myDataTable = new DataTable();
                myDataTable.Load(reader);
                //myConnection.Close();

                string destinationConnectionString = "Data Source=####;Initial Catalog=DYOF_STAGING_BROC;User ID=;Password=;Connection Timeout=999";

                SqlConnection destination = new SqlConnection(destinationConnectionString);
                SqlBulkCopy bulkData;
                //destination.Open();

                Exception ex = null;
                try
                {
                    Console.WriteLine("step1");
                    bulkData = new SqlBulkCopy(destinationConnectionString, SqlBulkCopyOptions.FireTriggers);
                    bulkData.BulkCopyTimeout = 1;
                    bulkData.DestinationTableName = "Load_CTR_Sample_Account_Opening2";
                    bulkData.WriteToServer(myDataTable);
                    bulkData.Close();
                    Console.WriteLine("moved from here to there");
                    reader.Close();

                    //destination.Close();


                }
                catch (Exception e)
                {
                    ex = e;
                }


2 commentaires

S'il s'agit d'une chose ponctuelle, il peut être plus facile d'ouvrir la table SQL Server dans Access, puis d'effectuer une opération INSERT sur les deux tables.


Veuillez mettre à jour votre question pour inclure les erreurs que vous rencontrez. En outre, utilisez-vous .NET Framework ou .NET Core? Je demande parce que je n'ai jamais vu Core travailler avec Access (même si c'est censé le faire).


4 Réponses :


0
votes

L'option suivante doit être vérifiée 1) Le nom de la colonne doit être le même. 2) vérifiez la longueur de la colonne. 3) vérifiez le type de données.


0 commentaires

2
votes

J'ai en fait écrit un ORM pour faciliter ce genre de tâche.

var accessDS = new AccessDataSource(connectionString1);
var dt = accessDS.From("RCM_MF_New_Accounts_Samples").ToDataTable().Execute();

var sqlDS = new SqlServerDataSource(connectionString2);
sqlDS.InsertBulk("Load_CTR_Sample_Account_Opening2", dt).Execute();

Cela ne fonctionne pas pour .NET Core.

Packages:


0 commentaires

1
votes

Voici un exemple de base d'insertion groupée.

public void BulkInsert(DataTable employees)
{
    if (employees == null)
        throw new ArgumentNullException(nameof(employees), $"{nameof(employees)} is null.");

    using (var con = OpenConnection())
    using (var sbc = new SqlBulkCopy(con))
    {
        sbc.DestinationTableName = "HR.Employee";
        foreach (DataColumn column in employees.Columns)
            sbc.ColumnMappings.Add(column!.ColumnName, column.ColumnName);
        sbc.WriteToServer(employees);
    }
}

Notez la boucle foreach (colonne DataColumn dans employés.Colonnes) . Ceci est nécessaire pour qu'il sache que les noms de colonne sont les mêmes dans la table source et dans la table cible. (S'ils ne sont pas identiques, mappez-les manuellement de la même manière.)

Source: https://grauenwolf.github.io/DotNet-ORM-Cookbook/BulkInsert.htm#ado.net


0 commentaires

1
votes

Lisez les données d'Access dans un DataTable:

string strConnect = @"Data Source=GRIFFPC\SQLEXPRESS;Initial Catalog=Testing;Integrated Security=True";
using (SqlConnection con = new SqlConnection(strConnect))
    {
    con.Open();
    using (SqlBulkCopy bulk = new SqlBulkCopy(con))
        {
        bulk.DestinationTableName = "Test";
        bulk.WriteToServer(dt);
        }
    }

Ensuite, utilisez SqlBulkCopy pour mettre à jour SQL:

string strConnect = @"Provider=Microsoft.ACE.OLEDB.12.0;data source=D:\Temp\MyDB.accdb";

DataTable dt = new DataTable();
using (OleDbConnection con = new OleDbConnection(strConnect))
    {
    OleDbCommand cmd = new OleDbCommand("SELECT * FROM MyTable", con);
    con.Open();
    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    da.Fill(dt);
    }

Bien sûr, il y a un moyen beaucoup plus simple de passer directement d'Access à SQL Server, en utilisant VBA, SQL ou d'autres méthodes.

https://support.office.com/en-us/article/import-or-link-to-data-in-an-sql-server-database -a5a3b4eb-57b9-45a0-b732-77bc6089b84e

https://www.sqlshack.com/six-different-methods-to-copy-tables-between-databases-in-sql-server/ a>


0 commentaires