From 67c0c6f903b7f7708aebbe9a7bda49ec05b3401a Mon Sep 17 00:00:00 2001 From: KevinQiangK Date: Tue, 17 Mar 2015 13:34:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=AF=B9Access?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9A=84=E6=94=AF=E6=8C=81=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -在创建Access数据库的时候使用了拷贝空Access数据库的方法; -测试用例使用了SQLiteTest的用例; --- Sources/DbUtility.sln | 6 ++ .../AccessClient/AccessDbConfiguration.cs | 16 +++ .../AccessClient/AccessDbExecuteContext.cs | 28 ++++++ .../AccessClient/AccessDbExecutor.cs | 73 ++++++++++++++ .../AccessDbParameterizedQueryParser.cs | 30 ++++++ Sources/Ivony.Data.Access/AccessDb.cs | 91 ++++++++++++++++++ .../EmbedResource/emptyDb.mdb | Bin 0 -> 212992 bytes .../Ivony.Data.Access.csproj | 66 +++++++++++++ .../Properties/AssemblyInfo.cs | 36 +++++++ Sources/Ivony.Data.Test/AccessTest.cs | 53 ++++++++++ .../Ivony.Data.Test/Ivony.Data.Test.csproj | 5 + 11 files changed, 404 insertions(+) create mode 100644 Sources/Ivony.Data.Access/AccessClient/AccessDbConfiguration.cs create mode 100644 Sources/Ivony.Data.Access/AccessClient/AccessDbExecuteContext.cs create mode 100644 Sources/Ivony.Data.Access/AccessClient/AccessDbExecutor.cs create mode 100644 Sources/Ivony.Data.Access/AccessClient/AccessDbParameterizedQueryParser.cs create mode 100644 Sources/Ivony.Data.Access/AccessDb.cs create mode 100644 Sources/Ivony.Data.Access/EmbedResource/emptyDb.mdb create mode 100644 Sources/Ivony.Data.Access/Ivony.Data.Access.csproj create mode 100644 Sources/Ivony.Data.Access/Properties/AssemblyInfo.cs create mode 100644 Sources/Ivony.Data.Test/AccessTest.cs diff --git a/Sources/DbUtility.sln b/Sources/DbUtility.sln index 3e2bb28..3b57941 100644 --- a/Sources/DbUtility.sln +++ b/Sources/DbUtility.sln @@ -17,6 +17,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ivony.Data.Logs", "Ivony.Da EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerformanceTest", "PerformanceTest\PerformanceTest.csproj", "{EF894E7A-779D-483C-89F1-61541833DD34}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ivony.Data.Access", "Ivony.Data.Access\Ivony.Data.Access.csproj", "{B812CDE1-193C-4741-AEDC-D791A6848ABC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -51,6 +53,10 @@ Global {EF894E7A-779D-483C-89F1-61541833DD34}.Debug|Any CPU.Build.0 = Debug|Any CPU {EF894E7A-779D-483C-89F1-61541833DD34}.Release|Any CPU.ActiveCfg = Release|Any CPU {EF894E7A-779D-483C-89F1-61541833DD34}.Release|Any CPU.Build.0 = Release|Any CPU + {B812CDE1-193C-4741-AEDC-D791A6848ABC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B812CDE1-193C-4741-AEDC-D791A6848ABC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B812CDE1-193C-4741-AEDC-D791A6848ABC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B812CDE1-193C-4741-AEDC-D791A6848ABC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Sources/Ivony.Data.Access/AccessClient/AccessDbConfiguration.cs b/Sources/Ivony.Data.Access/AccessClient/AccessDbConfiguration.cs new file mode 100644 index 0000000..5d04ee2 --- /dev/null +++ b/Sources/Ivony.Data.Access/AccessClient/AccessDbConfiguration.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Ivony.Data; + +namespace Ivony.Data.Access.AccessClient +{ + public class AccessDbConfiguration:DbConfiguration + { + public AccessDbConfiguration() + { + } + } +} diff --git a/Sources/Ivony.Data.Access/AccessClient/AccessDbExecuteContext.cs b/Sources/Ivony.Data.Access/AccessClient/AccessDbExecuteContext.cs new file mode 100644 index 0000000..1e79257 --- /dev/null +++ b/Sources/Ivony.Data.Access/AccessClient/AccessDbExecuteContext.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Ivony.Data.Common; +using System.Data.OleDb; + +namespace Ivony.Data.Access.AccessClient +{ + public class AccessDbExecuteContext:DbExecuteContextBase + { + + public AccessDbExecuteContext(OleDbDataReader dataReader, IDbTracing tracing, object sync) + : base(dataReader, tracing, sync: sync) + { + AcccessDataReader = dataReader; + } + + + public OleDbDataReader AcccessDataReader + { + get; + private set; + } + + } +} diff --git a/Sources/Ivony.Data.Access/AccessClient/AccessDbExecutor.cs b/Sources/Ivony.Data.Access/AccessClient/AccessDbExecutor.cs new file mode 100644 index 0000000..a0cf14a --- /dev/null +++ b/Sources/Ivony.Data.Access/AccessClient/AccessDbExecutor.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Data.OleDb; +using Ivony.Data.Common; +using Ivony.Data.Queries; + +namespace Ivony.Data.Access.AccessClient +{ + public class AccessDbExecutor : DbExecutorBase, IDbExecutor + { + + public AccessDbExecutor(string connectionString, AccessDbConfiguration configuration) + : base(configuration) + { + if(string.IsNullOrEmpty(connectionString)) + throw new ArgumentNullException("connectionString"); + if(configuration == null) + throw new ArgumentNullException("configuration"); + + Configuration = configuration; + Connection = new OleDbConnection(connectionString); + } + + + public OleDbConnection Connection { get; private set; } + + + protected AccessDbConfiguration Configuration { get; private set; } + + public object SyncRoot { get; private set; } + + public IDbExecuteContext Execute(ParameterizedQuery query) + { + var tracing = TryCreateTracing(this, query); + var command = new AccessDbParameterizedQueryParser().Parse(query); + return Execue(command, tracing); + } + + private IDbExecuteContext Execue(OleDbCommand command, IDbTracing tracing) + { + try + { + TryExecuteTracing(tracing, t => t.OnExecuting(command)); + + if (Connection.State == ConnectionState.Closed) + Connection.Open(); + command.Connection = Connection; + + if (Configuration.QueryExecutingTimeout.HasValue) + command.CommandTimeout = (int)Configuration.QueryExecutingTimeout.Value.TotalSeconds; + + var context = new AccessDbExecuteContext(command.ExecuteReader(), tracing, SyncRoot); + + TryExecuteTracing(tracing, t => t.OnLoadingData(context)); + return context; + + } + catch (DbException exception) + { + TryExecuteTracing(tracing, t => t.OnException(exception)); + throw; + } + } + + + + } +} diff --git a/Sources/Ivony.Data.Access/AccessClient/AccessDbParameterizedQueryParser.cs b/Sources/Ivony.Data.Access/AccessClient/AccessDbParameterizedQueryParser.cs new file mode 100644 index 0000000..93f1470 --- /dev/null +++ b/Sources/Ivony.Data.Access/AccessClient/AccessDbParameterizedQueryParser.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Data.OleDb; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Ivony.Data; +using Ivony.Data.Common; + +namespace Ivony.Data.Access.AccessClient +{ + public class AccessDbParameterizedQueryParser:ParameterizedQueryParser + { + protected override string GetParameterPlaceholder(object value, int index, out OleDbParameter parameter) + { + var name = "?"; + parameter = new OleDbParameter(name, value); + + return name; + } + + protected override OleDbCommand CreateCommand(string commandText, OleDbParameter[] parameters) + { + var command = new OleDbCommand(commandText); + command.Parameters.AddRange(parameters); + + return command; + } + } +} diff --git a/Sources/Ivony.Data.Access/AccessDb.cs b/Sources/Ivony.Data.Access/AccessDb.cs new file mode 100644 index 0000000..0e4e87c --- /dev/null +++ b/Sources/Ivony.Data.Access/AccessDb.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Data.OleDb; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Ivony.Data.Access.AccessClient; +namespace Ivony.Data.Access +{ + public static class AccessDb + { + static AccessDb() + { + DefaultConfiguration = new AccessDbConfiguration(); + } + + public static AccessDbConfiguration DefaultConfiguration { get; private set; } + + public static AccessDbExecutor ConnectFile(string filePath, bool create = true, AccessDbConfiguration configuration = null) + { + if (string.IsNullOrEmpty(filePath)) + return null; + + if (!File.Exists(filePath)) + { + if (create) + CreateAccessDb(filePath); + else + { + throw new FileNotFoundException("The database file can't exist."); + } + } + var builder = new OleDbConnectionStringBuilder + { + DataSource = filePath, + Provider = "Microsoft.JET.OLEDB.4.0", + PersistSecurityInfo = false, + }; + + return Connect(builder.ConnectionString, configuration ?? DefaultConfiguration); + } + + public static AccessDbExecutor Connect(string connectionString, AccessDbConfiguration configuration = null) + { + return new AccessDbExecutor(connectionString, configuration); + } + + public static bool CreateAccessDb(string filePath, bool overwrite = false) + { + if (string.IsNullOrEmpty(filePath)) + throw new ArgumentNullException(filePath); + + if (File.Exists(filePath)) + { + if(overwrite) + File.Delete(filePath); + else + { + throw new InvalidOperationException("File Already existed."); + } + } + + try + { + + //Reference:http://www.cnblogs.com/DasonKwok/archive/2012/08/02/2620194.html + var assembly = System.Reflection.Assembly.GetExecutingAssembly(); + + var stream = assembly.GetManifestResourceStream("Ivony.Data.Access.EmbedResource.emptyDb.mdb"); + if (stream != null) + { + var dataLength = stream.Length; + var buffer = new Byte[dataLength]; + stream.Read(buffer, 0, (int)dataLength); + using (var writer = new FileStream(filePath, FileMode.Create)) + { + writer.Write(buffer, 0, (int)dataLength); + } + } + return true; + } + catch + { + return false; + } + } + } +} diff --git a/Sources/Ivony.Data.Access/EmbedResource/emptyDb.mdb b/Sources/Ivony.Data.Access/EmbedResource/emptyDb.mdb new file mode 100644 index 0000000000000000000000000000000000000000..d43e8c977fffb9f56fdb25904a25d4d37df37ecb GIT binary patch literal 212992 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 + + + + Debug + AnyCPU + {B812CDE1-193C-4741-AEDC-D791A6848ABC} + Library + Properties + Ivony.Data.Access + Ivony.Data.Access + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + {27d46d02-f7bc-42b2-ae3e-33eb5b1fa3f9} + Ivony.Data + + + + + + + + \ No newline at end of file diff --git a/Sources/Ivony.Data.Access/Properties/AssemblyInfo.cs b/Sources/Ivony.Data.Access/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..fa7a4f9 --- /dev/null +++ b/Sources/Ivony.Data.Access/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Ivony.Data.Access")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Ivony.Data.Access")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("90dfc4c2-f50c-4d1a-aecd-b31c04397dbc")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Sources/Ivony.Data.Test/AccessTest.cs b/Sources/Ivony.Data.Test/AccessTest.cs new file mode 100644 index 0000000..3b10762 --- /dev/null +++ b/Sources/Ivony.Data.Test/AccessTest.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Data.OleDb; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Ivony.Data.Access; +using Ivony.Data.Access.AccessClient; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Ivony.Data.Test +{ + [TestClass] + public class AccessTest + { + AccessDbExecutor _accessDbExecutor; + + public AccessTest() + { + _accessDbExecutor = AccessDb.ConnectFile(@"accessTestDb.mdb"); + _accessDbExecutor.T(@" +CREATE TABLE [Test1] +( + [Name] NVARCHAR(50) NOT NULL , + [Content] NTEXT NULL, + [Index] INT NOT NULL +)").ExecuteNonQuery(); + } + + + [TestMethod] + public void StandTest_For_Access() + { + Assert.IsNull(_accessDbExecutor.T("SELECT Name FROM Test1").ExecuteScalar(), "空数据表查询测试失败"); + Assert.IsNull(_accessDbExecutor.T("SELECT Name FROM Test1").ExecuteFirstRow(), "空数据表查询测试失败"); + Assert.AreEqual(_accessDbExecutor.T("SELECT COUNT(*) FROM Test1").ExecuteScalar(), 0, "空数据表查询测试失败"); + Assert.AreEqual(_accessDbExecutor.T("INSERT INTO Test1 ( Name, Content, [Index] ) VALUES ( {...} )", "Ivony", "Test", 1).ExecuteNonQuery(), 1, "插入数据测试失败"); + Assert.AreEqual(_accessDbExecutor.T("SELECT * FROM Test1").ExecuteDynamics().Length, 1, "插入数据后查询测试失败"); + Assert.IsNotNull(_accessDbExecutor.T("SELECT Name FROM Test1").ExecuteFirstRow(), "插入数据后查询测试失败"); + + var dataItem = _accessDbExecutor.T("SELECT * FROM Test1").ExecuteDynamicObject(); + Assert.AreEqual(dataItem.Name, "Ivony", "插入数据后查询测试失败"); + Assert.AreEqual(dataItem["Content"], "Test", "插入数据后查询测试失败"); + } + + [TestCleanup] + public void Shutdown() + { + _accessDbExecutor.Connection.Close(); + OleDbConnection.ReleaseObjectPool(); + } + } +} diff --git a/Sources/Ivony.Data.Test/Ivony.Data.Test.csproj b/Sources/Ivony.Data.Test/Ivony.Data.Test.csproj index d289a0a..6124f09 100644 --- a/Sources/Ivony.Data.Test/Ivony.Data.Test.csproj +++ b/Sources/Ivony.Data.Test/Ivony.Data.Test.csproj @@ -76,6 +76,7 @@ + @@ -85,6 +86,10 @@ + + {b812cde1-193c-4741-aedc-d791a6848abc} + Ivony.Data.Access + {297c6a4c-086b-426d-b146-df352410dcf0} Ivony.Data.MySql