Я изменил свой код для подсчета записей в каждой таблице внутри файла 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);
}
}
}
userTables.Rows[i][2]замените2константой, соответствующей имени столбца, например. ТАБЛИЦА_ИМЯ. Таким образом, код самодокументируется. - person   schedule 13.05.2011