Comment puis-je structure un OleDbCommand Requête afin que je puisse prendre les Tables d'une .MDB, et de les remplacer dans l'autre .MDB
Je suis en train de prendre les tables d'une Base de données Access, les ajouter à un autre Accès au fichier de Base de données avec la même structure, mais avec des données différentes. J'ai besoin de remplacer les tables. Je suis presque fini avec mon projet c'est mon dernier mur de briques.
Je suis à l'aide d'un fichier de classe nommé DatabaseHandling.cs de travailler avec la Base de données Access fichiers.
Voici mon ENSEMBLE actuel DatabaseHandling.cs code. C'est conservée jusqu'à ce jour pour le moment.
Code:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Text;
namespace LCR_ShepherdStaffupdater_1._0
{
public class DatabaseHandling
{
static DataTable datatableB = new DataTable();
static DataTable datatableA = new DataTable();
public static DataSet datasetA = new DataSet();
public static DataSet datasetB = new DataSet();
static OleDbDataAdapter adapterA = new OleDbDataAdapter();
static OleDbDataAdapter adapterB = new OleDbDataAdapter();
static string connectionstringA = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Settings.getfilelocationA();
static string connectionstringB = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Settings.getfilelocationB();
static OleDbConnection dataconnectionB = new OleDbConnection(connectionstringB);
static OleDbConnection dataconnectionA = new OleDbConnection(connectionstringA);
static DataTable tableListA;
static DataTable tableListB;
static public void addTableA(string table, bool addtoDataSet)
{
dataconnectionA.Open();
datatableA = new DataTable(table);
try
{
OleDbCommand commandselectA = new OleDbCommand("SELECT * FROM [" + table + "]", dataconnectionA);
adapterA.SelectCommand = commandselectA;
adapterA.Fill(datatableA);
}
catch
{
Logging.updateLog("Error: Tried to get " + table + " from DataSetA. Table doesn't exist!", true, false, false);
}
if (addtoDataSet == true)
{
datasetA.Tables.Add(datatableA);
Logging.updateLog("Added DataTableA: " + datatableA.TableName.ToString() + " Successfully!", false, false, false);
}
dataconnectionA.Close();
}
static public void addTableB(string table, bool addtoDataSet)
{
dataconnectionB.Open();
datatableB = new DataTable(table);
try
{
OleDbCommand commandselectB = new OleDbCommand("SELECT * FROM [" + table + "]", dataconnectionB);
adapterB.SelectCommand = commandselectB;
adapterB.Fill(datatableB);
}
catch
{
Logging.updateLog("Error: Tried to get " + table + " from DataSetB. Table doesn't exist!", true, false, false);
}
if (addtoDataSet == true)
{
datasetB.Tables.Add(datatableB);
Logging.updateLog("Added DataTableB: " + datatableB.TableName.ToString() + " Successfully!", false, false, false);
}
dataconnectionB.Close();
}
static public string[] getTablesA(string connectionString)
{
dataconnectionA.Open();
tableListA = dataconnectionA.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
string[] stringTableListA = new string[tableListA.Rows.Count];
for (int i = 0; i < tableListA.Rows.Count; i++)
{
stringTableListA[i] = tableListA.Rows[i].ItemArray[2].ToString();
}
dataconnectionA.Close();
return stringTableListA;
}
static public string[] getTablesB(string connectionString)
{
dataconnectionB.Open();
tableListB = dataconnectionB.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
string[] stringTableListB = new string[tableListB.Rows.Count];
for (int i = 0; i < tableListB.Rows.Count; i++)
{
stringTableListB[i] = tableListB.Rows[i].ItemArray[2].ToString();
}
dataconnectionB.Close();
return stringTableListB;
}
static public void createDataSet()
{
string[] tempA = getTablesA(connectionstringA);
string[] tempB = getTablesB(connectionstringB);
int percentage = 0;
int maximum = (tempA.Length + tempB.Length);
Logging.updateNotice("Loading Tables...");
Logging.updateLog("Started Loading File A", false, true, false);
for (int i = 0; i < tempA.Length ; i++)
{
if (!datasetA.Tables.Contains(tempA[i]))
{
addTableA(tempA[i], true);
percentage++;
Logging.loadStatus(percentage, maximum);
}
else
{
datasetA.Tables.Remove(tempA[i]);
addTableA(tempA[i], true);
percentage++;
Logging.loadStatus(percentage, maximum);
}
}
Logging.updateLog("Finished loading File A", false, true, false);
Logging.updateLog("Started loading File B", false, true, false);
for (int i = 0; i < tempB.Length ; i++)
{
if (!datasetB.Tables.Contains(tempB[i]))
{
addTableB(tempB[i], true);
percentage++;
Logging.loadStatus(percentage, maximum);
}
else
{
datasetB.Tables.Remove(tempB[i]);
addTableB(tempB[i], true);
percentage++;
Logging.loadStatus(percentage, maximum);
}
}
Logging.updateLog("Finished loading File B", false, true, false);
}
static public DataTable getDataTableA()
{
datatableA = datasetA.Tables[Settings.textA];
return datatableA;
}
static public DataTable getDataTableB()
{
datatableB = datasetB.Tables[Settings.textB];
return datatableB;
}
static public DataSet getDataSetA()
{
return datasetA;
}
static public DataSet getDataSetB()
{
return datasetB;
}
static public void InitiateCopyProcessA()
{
DataSet tablesA;
tablesA = DatabaseHandling.getDataSetA();
foreach (DataTable table in tablesA.Tables)
{
OverwriteTable(table, table.TableName);
Logging.updateLog("Copied " + table.TableName + " successfully.", false, true, false);
}
}
static void OverwriteTable(DataTable sourceTable, string tableName)
{
using (var destConn = new OleDbConnection(connectionstringA))
using (var destCmd = new OleDbCommand(tableName, destConn) { CommandType = CommandType.TableDirect })
using (var destDA = new OleDbDataAdapter(destCmd))
{
//Since we're using a single table, we can have the CommandBuilder
//generate the appropriate INSERT and DELETE SQL statements
using (var destCmdB = new OleDbCommandBuilder(destDA))
{
destCmdB.QuotePrefix = "["; //quote reserved column names
destCmdB.QuotePrefix = "]";
destDA.DeleteCommand = destCmdB.GetDeleteCommand();
destDA.InsertCommand = destCmdB.GetInsertCommand();
//Get rows from destination, and delete them
var destTable = new DataTable();
destDA.Fill(destTable);
foreach (DataRow dr in destTable.Rows)
{
dr.Delete();
}
destDA.Update(destTable);
//Set rows from source as Added, so the DataAdapter will insert them
foreach (DataRow dr in sourceTable.Rows)
{
dr.SetAdded();
}
destDA.Update(sourceTable);
}
}
}
}
}
Je veux simplement prendre un Datatable dans la mémoire et l'écrire sur un .Fichier MDB. J'ai été de tenter de le faire pour plus de 30 heures.
LA DERNIÈRE MODIFICATION:
Bon, ajouté un nouveau code. Je reçois une nouvelle erreur d'exécution: erreur de Syntaxe dans la clause from.
Code:
static public void InitiateCopyProcessA()
{
DataSet tablesA;
tablesA = DatabaseHandling.getDataSetA();
foreach (DataTable table in tablesA.Tables)
{
OverwriteTable(table, table.TableName);
Logging.updateLog("Copied " + table.TableName + " successfully.", false, true, false);
}
}
static void OverwriteTable(DataTable sourceTable, string tableName)
{
using (var destConn = new OleDbConnection(connectionstringA))
using (var destCmd = new OleDbCommand(tableName, destConn) { CommandType = CommandType.TableDirect })
using (var destDA = new OleDbDataAdapter(destCmd))
{
//Since we're using a single table, we can have the CommandBuilder
//generate the appropriate INSERT and DELETE SQL statements
using (var destCmdB = new OleDbCommandBuilder(destDA))
{
destCmdB.QuotePrefix = "["; //quote reserved column names
destCmdB.QuotePrefix = "]";
destDA.DeleteCommand = destCmdB.GetDeleteCommand();
destDA.InsertCommand = destCmdB.GetInsertCommand();
//Get rows from destination, and delete them
var destTable = new DataTable();
destDA.Fill(destTable);
foreach (DataRow dr in destTable.Rows)
{
dr.Delete();
}
destDA.Update(destTable);
//Set rows from source as Added, so the DataAdapter will insert them
foreach (DataRow dr in sourceTable.Rows)
{
dr.SetAdded();
}
destDA.Update(sourceTable); //!!! Run-time error: Syntax error in FROM clause. !!!
}
}
}
Une fois de plus, il ne fonctionne pas. Laissez-moi savoir si vous avez besoin d'informations supplémentaires.
Désolé bro, je ne savais pas que c'était de l'empilement. Je vais la tenir au courant. Mes plus sincères excuses...
Je suppose que l'exception est en train de lancer sur le destDA.Mise à jour(destTable) - est-ce que le droit? Pouvez-vous vérifier que la valeur de destDA.DeleteCommand.CommandText est? Je ne sais pas Accéder à SQL, mais MSDN me dit que c'est assez conforme à la norme ANSI. Quelle version utilisez-vous?
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
Essayez de remplacer
avec
Où les requêtes sont valables pour votre structure de la table.
OriginalL'auteur bendewey
@Mark Brackett avait-il vraiment fermer la raison de votre prise en l'absence DeleteCommand est parce que le OleDbCommandBuilder est l'élimination afin de déplacer le support et vous devriez être bon.
Mise à jour
Essayer ce code d'exception
mise à jour
essayez de changer
à
Je suis tenté de savoir si c'est juste une ligne;s jeter le bug ou si c'est la requête. Ma pensée est que l'une des lignes a un funky valeur
Le nombre de lignes que vous le test? essayez de tester seulement 1 ligne. Également définir un point de rupture et de survoler la destDA.InsertCommand et voir ce que sa CommandText. post que dans votre question.
Bon j'ai fait ce que vous avez dit. Je n'étais pas sûr de ce que vous voulez dire sur le test d'une seule ligne, mais je pense que j'ai fait ce que vous avez demandé. Laissez-moi savoir ce que vous en pensez. Et merci encore pour ce que je suis donc très reconnaissante.
Vous allez avoir à mettre une sorte de la logique afin de déterminer quelle table est chier sur vous. Voir ma mise à jour de l'échantillon
GRANDE Idée. La Table qui était à chier sur moi a été "Erreur de mise à jour AccountBudget" Ce que le diable est le problème avec AccountBudget???
OriginalL'auteur bendewey
J'ai le sentiment que vous n'êtes pas vraiment grokking l'ensemble de la DataTable/DataRow chose. Voyez-vous, dans une base de données, vous n'avez pas vraiment travailler avec tables - mais avec des lignes. Si vous voulez "écraser" la TableB avec TableA de lignes, vous pensez d'abord supprimer toutes les lignes dans la TableB puis insérer des copies de toutes les lignes de la TableA.
En supposant que la table de destination existe déjà, vous pouvez faire de l'insertion par le remplissage de 1 source, puis en définissant les lignes à Ajouter. Le DataAdapter va alors exécuter une commande SQL insert pour chaque ligne.
EDIT: Diviser le OverwriteTable à une méthode différente pour accueillir dans la mémoire des données de la table. Également ajouté des guillemets autour des instructions Sql générées pour vos réservés l'Année et le Mois des noms de colonne. Déplacé jetez CommandBuilder comme fixe par bendewey.
J'ai besoin de savoir comment prendre une DataTable j'ai déjà en mémoire, PUIS remplacer le fichier Base de données Access table. Ne pas prendre une table à partir d'directement à partir d'un .MDB fichier et l'ajouter directement à un autre .Fichier MDB. Vous voyez ce que je veux dire? Comment dois-je faire?
Il suffit de ne pas faire le récupérer à partir de la source...j'ai divisé le code à 2 méthodes pour vous.
Merci, malade de voir si cela fonctionne. Si elle le fait, mon dieu, je ne sais comment vous remercier ou de l'autre gars m'aider. Question rapide...le Compilateur ne peut pas trouver ce destDA.QuotePrefix ou destDA.QuoteSuffix. Êtes-vous sûr que c'est ce que tu veux dire, une cause qui ne fonctionne pas?
Nan...je misttyped (et n'ai pas testé). C'est censé être destCmdB.Citation*. Fixe.
OriginalL'auteur Mark Brackett