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; }
4 Réponses :
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.
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:
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
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://www.sqlshack.com/six-different-methods-to-copy-tables-between-databases-in-sql-server/ a>
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).