37 votes

Interroger la base de données MDB de Microsoft Access à l'aide de LINQ et de C#

J'ai un fichier de base de données *.MDB, et je me demande s'il est possible ou recommandé de travailler sur ce fichier en utilisant LINQ en C#. Je me demande également à quoi ressembleraient des exemples simples.

Je ne m'y connais pas beaucoup en LINQ, mais mes exigences pour cette tâche sont assez simples (je crois). L'utilisateur me transmettra un chemin d'accès à une base de données MDB Microsoft Access et j'aimerais utiliser LINQ pour ajouter des lignes à l'une des tables de la base de données.

0 votes

Avez-vous trouvé un fournisseur pour travailler avec ACCESS ?

1 votes

Non, j'ai juste décidé de le faire de la manière ennuyeuse sans LINQ to SQL.

15voto

FlySwat Points 61945

Ce que vous voulez, c'est un fournisseur LINQ to ODBC, ou un fournisseur LINQ to JET/OLEDB.

En dehors de la boîte, MS n'en fait pas. Il y a peut-être un tiers qui le fait.

0 votes

Je sais que c'est un vieux sujet, mais j'ai créé il y a quelques années une bibliothèque semblable à EntityFramework qui permet d'utiliser LINQ pour accéder directement à MDB. Elle n'est pas complète (la mise à jour des entités n'est pas encore bien supportée), mais la récupération des lignes de table en tant qu'objets fonctionne bien. accesstolinq.codeplex.com

13voto

David Points 2783

En fait, j'ai récemment (aujourd'hui) découvert que vous pouvez accéder à une base de données Access avec LinqToSql. Elle doit être au format 2002 ou plus récent, vous ne pourrez pas glisser et déposer les tables dans votre contexte de données, donc soit vous créez manuellement les objets dans votre dbml, soit vous pouvez utiliser SQL Server Migration for Access pour la déplacer vers un serveur sql et ensuite glisser et déposer tout ce que vous voulez. Lorsque vous voulez réellement créer le contexte, passez-lui une connexion OleDbConnection. Utilisez votre chaîne de connexion standard Jet.OLEDB.4.0 sur la connexion OleDbConnection et vous êtes prêt à partir. Je ne suis pas sûr des limitations que cela peut engendrer. J'ai juste fait un échantillon rapide et fait un OrderBy sans problème.

1 votes

Et n'oubliez pas de renommer les TableAttributes dans le designer.cs sans le nom du propriétaire (par exemple : renommer dbo.Articles en Articles).

0 votes

C'est paralysé au mieux - en essayant d'exécuter un insert, j'ai obtenu Missing semicolon (;) at end of SQL statement.

0 votes

Oui, je l'ai fait une fois, vous pouvez utiliser des requêtes SELECT, mais presque tout le reste devra être défini dans le code comme une commande. C'est beaucoup de travail, mais c'est toujours mieux que de tout faire à la main.

7voto

jocull Points 3718

J'ai écrit un petit programme d'exemple pour tester cela avec la réponse de David. Vous devrez créer une base de données Access et créer manuellement le DBML pour Linq-to-SQL, car vous ne pouvez pas les glisser-déposer.

Les inserts échouent, citant Missing semicolon (;) at end of SQL statement. mais les requêtes semblent fonctionner correctement.

Access database tables for Program

using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using Linq2Access.Data;

namespace Linq2Access
{
    class Program
    {
        static readonly string AppPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
        static readonly string DbPath = Path.Combine(AppPath, "Data", "database.accdb");
        static readonly string DbConnString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + DbPath + "';Persist Security Info=False;";

        static void Main(string[] args)
        {
            if (!File.Exists(DbPath))
                throw new Exception("Database file does not exist!");

            using (OleDbConnection connection = new OleDbConnection(DbConnString))
            using (DataRepositoryDataContext db = new DataRepositoryDataContext(connection))
            {
                List<dbProject> projects = new List<dbProject>();
                for (int i = 1; i <= 10; i++)
                {
                    dbProject p = new dbProject() { Title = "Project #" + i };
                    for (int j = 1; j <= 10; j++)
                    {
                        dbTask t = new dbTask() { Title = "Task #" + (i * j) };
                        p.dbTasks.Add(t);
                    }
                    projects.Add(p);
                }

                try
                {
                    //This will fail to submit
                    db.dbProjects.InsertAllOnSubmit(projects);
                    db.SubmitChanges();
                    Console.WriteLine("Write succeeded! {0} projects, {1} tasks inserted",
                                        projects.Count,
                                        projects.Sum(x => x.dbTasks.Count));
                }
                catch(Exception ex)
                {
                    Console.WriteLine("Write FAILED. Details:");
                    Console.WriteLine(ex);
                    Console.WriteLine();
                }

                try
                {
                    //However, if you create the items manually in Access they seem to query fine
                    var projectsFromDb = db.dbProjects.Where(x => x.Title.Contains("#1"))
                                                        .OrderBy(x => x.ProjectID)
                                                        .ToList();

                    Console.WriteLine("Query succeeded! {0} Projects, {1} Tasks",
                                        projectsFromDb.Count,
                                        projectsFromDb.Sum(x => x.dbTasks.Count));
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Query FAILED. Details:");
                    Console.WriteLine(ex);
                    Console.WriteLine();
                }

                Console.WriteLine();
                Console.WriteLine("Press any key to continue...");
                Console.ReadKey();
            }
        }
    }
}

1voto

Quinten Miller Points 11

Vous pouvez utiliser un DataSet. Il existe des extensions linq qui vous permettront d'interroger les données avec toutes les qualités de LINQ auxquelles nous sommes habitués :)

eICATDataSet.ICSWSbuDataTable tbl = new eICATDataSet.ICSWSbuDataTable();

ICSWSbuTableAdapter ta = new ICSWSbuTableAdapter();
ta.Fill(tbl);

var res = tbl.Select(x => x.ProcedureDate.Year == 2010);

0voto

GeekyMonkey Points 5036

LINQ to SQL ne fonctionne que pour les bases de données SQL Server. Ce dont vous avez besoin, c'est du Microsoft Entity Framework. Cela permet un accès orienté objet à votre base de données. À partir de là, vous pouvez exécuter des requêtes LINQ.

http://msdn.microsoft.com/en-us/library/aa697427(vs.80).aspx

5 votes

Comment utiliser le concepteur contre la MDB ?

4 votes

Sory mais EF ne se connecte pas à la MDB

11 votes

Pourquoi cela aurait-il des votes positifs alors que le lien ne soutient pas la réponse ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X