using System; using System.Collections.Generic; using System.Data; using System.Data.OleDb; using System.IO; using System.Linq; using System.Runtime.Remoting.Contexts; using System.Text; using System.Threading.Tasks; using NCalc; namespace ConsoleApp { internal class Mdb { static void Main(string[] args) { //var expr = new Expression("1 + 2"); //Func f = expr.ToLambda(); //Console.WriteLine(f()); // will print 3 //var expr = new Expression("([Param1] + 2)* [Param2]"); //Func f = expr.ToLambda(); //var context = new ExpressionContext { Param1 = 33.4, Param2 = 40.48 }; //Console.WriteLine(f(context)); // will print True Dictionary parameters = new Dictionary() { {"Param1", 413.5 }, {"Param3", 40.48} }; var formula = "([Param1] + 2)* [Param2]"; var result = EvaluateFormula(formula, parameters); Console.WriteLine(result); } public static double EvaluateFormula(string formula, Dictionary parameters) { Expression e = new Expression(formula); e.Parameters = parameters; return Convert.ToDouble(e.Evaluate()); } private static bool TestMBD() { Console.WriteLine("请输入MDB文件完整路径(例如:C:\\cs.mdb):"); string mdbPath = Console.ReadLine(); mdbPath = @"D:\其他\地质\附件\和平站.mdb"; if (!File.Exists(mdbPath)) { Console.WriteLine("文件不存在!"); return false; } // 检查是否为Access95 或Access97 MDB(旧格式) // 如果太旧,Jet或ACE也无法打开,需要转换 if (IsOldAccessDatabase(mdbPath)) { Console.WriteLine("检测到此MDB文件为非常老的Access版本 (如Access 95/97),OLEDB 不支持直接读取。建议使用 Access 打开并另存为 2000/2003 格式。或者使用专门的MDB转换工具。"); Console.ReadKey(); return false; } string[] providers = new[] { "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + mdbPath + ";", "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + mdbPath + ";Persist Security Info=False;" }; foreach (var provider in providers) { Console.WriteLine($"尝试使用提供程序: {provider}"); try { ExportWithProvider(mdbPath, provider); Console.WriteLine($"使用 {provider} 导出完成!\n===============================\n"); } catch (Exception ex) { Console.WriteLine($"使用 {provider} 出错: {ex.Message}\n===============================\n"); } } Console.WriteLine("所有尝试完成!如果依然失败,请确认MDB文件格式是否过于陈旧。\n按任意键退出。"); Console.ReadKey(); return true; } static void ExportWithProvider(string mdbPath, string provider) { using (var conn = new OleDbConnection(provider)) { conn.Open(); DataTable tables = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); string outputDir = Path.Combine(Path.GetDirectoryName(mdbPath), "ExportedCSVs_" + (provider.Contains("Jet") ? "JET" : "ACE")); Directory.CreateDirectory(outputDir); foreach (DataRow row in tables.Rows) { string tableName = row["TABLE_NAME"].ToString(); Console.WriteLine($"导出表: {tableName}"); var cmd = new OleDbCommand($"SELECT * FROM [{tableName}]", conn); var adapter = new OleDbDataAdapter(cmd); var dt = new DataTable(); adapter.Fill(dt); string csvFilePath = Path.Combine(outputDir, tableName + ".csv"); using (var writer = new StreamWriter(csvFilePath, false, System.Text.Encoding.UTF8)) { writer.WriteLine(string.Join(",", dt.Columns.Cast().Select(c => $"\"{c.ColumnName}\""))); foreach (DataRow dr in dt.Rows) { var fields = dr.ItemArray.Select(field => $"\"{field?.ToString()?.Replace("\"", "\"\"") ?? ""}\""); writer.WriteLine(string.Join(",", fields)); } } Console.WriteLine($"已导出: {csvFilePath}"); } } } static bool IsOldAccessDatabase(string path) { // 检查文件头字节,老MDB的文件头通常以0x00 0x01 0x00 0x00 开头 // 或者标识0x00 0x01 0x00 0x00 0x00 0x00 byte[] header = new byte[4]; using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { fs.Read(header, 0, 4); } return header[0] == 0x00 && header[1] == 0x01; } } }