Код перестает работать после преобразования плоской MDB в SQL-связанную mdb

Я изменил свой код для подсчета записей в каждой таблице внутри файла mdb. Он работает безупречно, пока не попадет в файл MDB, используя связанные таблицы, которые указывают на сервер SQL. Код нельзя изменить так, чтобы он указывал непосредственно на сервер SQL, он предназначен для сценария обновления программного обеспечения на месте.

Как изменить этот код для работы как с обычными, так и со связанными таблицами?

using System;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Diagnostics;
using System.Collections;
using System.Data.Common;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            string[] databases = new string[3];
            databases[0] = "data.mdb";
            databases[1] = "chunk.mdb";
            databases[2] = "transactions.mdb";

            DateTime dt = DateTime.Now;
            string filename = "Results-" + dt.Hour + "_" + dt.Minute + "_" + dt.Second + ".txt";
            System.IO.StreamWriter file = new System.IO.StreamWriter(filename);



        foreach(string db in databases)
        {
                    file.WriteLine("##########BEGIN " + db + "##########\r\n");
                    Console.Write("Processing " + db + " Database . . . ");

                    string strAccessConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\financial\" + db;

                    DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");
                    DataTable userTables = null;
                    DataSet myDataSet = new DataSet();
                    OleDbConnection conn = new OleDbConnection(strAccessConn);

                    using (DbConnection connection = factory.CreateConnection())
                    {
                        connection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\financial\DATA\" + db;
                        string[] restrictions = new string[4];
                        restrictions[3] = "Table"; 

                        try
                        {
                            connection.Open();
                        }
                        catch
                        {
                            Console.WriteLine("Error opening MDB file. Please ensure it is in the correct location");
                        }

                        userTables = connection.GetSchema("Tables", restrictions);
                    }


                   ArrayList tables = new ArrayList();
                   for (int i=0; i < userTables.Rows.Count; i++)
                        tables.Add(userTables.Rows[i][2].ToString());


                   foreach (string tbl in tables)
                   {
                            string queryString = "SELECT COUNT(*) FROM " + "[" + tbl + "]";
                            OleDbCommand command = new OleDbCommand(queryString, conn);
                            command.Connection.Open();

                            try
                            {
                                int records = (int)command.ExecuteScalar();
                                file.WriteLine("{0,-45}" + records,tbl);
                            }
                            catch (OleDbException e)
                            {
                                Console.WriteLine(e + "OLEDB Exception Occured.");
                            }

                            command.Connection.Close();
                   }


                    file.WriteLine("\r\n##########END " + db + "##########");
                    Console.WriteLine("Done!\n");
         }

            file.Close();
            Console.WriteLine(@"All Databases Complete. Press any key to continue...");
            Console.Read();  // Press any key to continue...
            System.Diagnostics.Process.Start("notepad.exe",filename);

        }
    }
}

person Gypsy Queen    schedule 13.05.2011    source источник
comment
Я не знаю ответа на ваш вопрос, но могу ли я сделать предложение по кодированию? В userTables.Rows[i][2] замените 2 константой, соответствующей имени столбца, например. ТАБЛИЦА_ИМЯ. Таким образом, код самодокументируется.   -  person    schedule 13.05.2011
comment
в чем именно проблема?: Сообщение об ошибке? Исключение?   -  person fretje    schedule 13.05.2011
comment
@fretje, код записывает имя каждой таблицы вместе с количеством строк в файл при запуске с обычной MDB. Как только MDB заменяется таблицами, связанными с SQL, файл становится пустым и не содержит имен таблиц с количеством строк. Никаких ошибок, никаких исключений.   -  person John T    schedule 13.05.2011
comment
Из поиска в Google кажется, что действительно доступ к связанным таблицам в файле mdb, хотя ADO.NET не поддерживается. Так что я думаю, вам придется пойти по пути ADO ActiveX, как упоминает Хосе в своем ответе.   -  person fretje    schedule 13.05.2011


Ответы (2)



Вы также можете сделать это с DAO.

person phoog    schedule 13.05.2011