view HowTo/DataAccess/CustomSqlQuery2.cs @ 3:1ef98bd70424

!bug 100 +3h Исправление проблемы BLToolkit + mono 3.4
author cin
date Fri, 22 Aug 2014 17:34:46 +0400
parents f990fcb411a9
children
line wrap: on
line source

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Xml;

using NUnit.Framework;

using BLToolkit.Data;
using BLToolkit.DataAccess;

namespace HowTo.DataAccess
{
	[TestFixture]
	public class CustomSqlQuery2
	{
		public abstract class TestAccessorBase<T> : /*[a]*/DataAccessor/*[/a]*/
			where T : TestAccessorBase<T>
		{
			const int Sql    = 0;
			const int Access = 1;
			const int Oracle = 2;
			const int Fdp    = 3;
			const int SQLite = 4;

			Dictionary<int, string> _sql = new Dictionary<int,string>();

			private string GetSql(string providerName, int provider, int queryID)
			{
				Stream stream = Assembly.GetCallingAssembly().GetManifestResourceStream(
					"HowTo.DataAccess.Sql." + providerName + ".xml");

				XmlDocument doc = new XmlDocument();

				doc.Load(stream);

				XmlNode node = doc.SelectSingleNode(string.Format("/sql/query[@id={0}]", queryID));

				return node != null? node.InnerText: null;

			}

			protected /*[a]*/override/*[/a]*/ string /*[a]*/PrepareSqlQuery/*[/a]*/(DbManager db, int queryID, int uniqueID, string sqlQuery)
			{
				int    provider     = Sql;
				string providerName = db.DataProvider.Name;

				switch (providerName)
				{
					case "Sql"   : provider = Sql;    break;
					case "Access": provider = Access; break;
					case "Oracle": provider = Oracle; break;
					case "Fdp"   : provider = Fdp;    break;
					case "SQLite": provider = SQLite; break;
					default:
						throw new ApplicationException(
							string.Format("Unknown data provider '{0}'", providerName));
				}

				string text;
				int    key = provider * 1000000 + uniqueID;

				if (_sql.TryGetValue(key, out text))
					return text;

				_sql[key] = text = GetSql(providerName, provider, queryID) ?? GetSql("Sql", Sql, queryID);

				return text;
			}

			public static T CreateInstance()
			{
				return DataAccessor.CreateInstance<T>();
			}
		}

		public abstract class PersonAccessor : TestAccessorBase<PersonAccessor>
		{
			[SqlQuery(/*[a]*/ID = 1/*[/a]*/)]
			public abstract List<Person> SelectByLastName(string lastName);

			[SqlQuery(/*[a]*/ID = 2/*[/a]*/)]
			public abstract List<Person> SelectBy([Format] string fieldName, string value);

			[SqlQuery(/*[a]*/ID = 3/*[/a]*/)]
			public abstract List<Person> SelectByLastName(string lastName, [Format(0)] int top);

			[SqlQuery(/*[a]*/ID = 4/*[/a]*/)]
			public abstract List<Person> SelectID(int @id);
		}

		[Test]
		public void Test1()
		{
			PersonAccessor da = PersonAccessor.CreateInstance();

			List<Person> list = da.SelectByLastName("Testerson");

			Assert.AreNotEqual(0, list.Count);
		}

		[Test]
		public void Test2()
		{
			PersonAccessor da = PersonAccessor.CreateInstance();

			List<Person> list = da.SelectBy("FirstName", "John");

			Assert.AreNotEqual(0, list.Count);
		}

		[Test]
		public void Test3()
		{
			PersonAccessor da = PersonAccessor.CreateInstance();

			List<Person> list = da.SelectByLastName("Testerson", 1);

			Assert.AreNotEqual(0, list.Count);
		}

		[Test]
		public void Test4()
		{
			PersonAccessor da = PersonAccessor.CreateInstance();

			List<Person> list = da.SelectID(42);

			Assert.AreEqual(42, list[0].ID);
		}
	}
}