С помощью PostgreSQL вы можете создавать свои собственные агрегатные функции, см. http://www.postgresql.org/docs/8.2/interactive/sql-createaggregate.html
Чтобы создать агрегатную функцию в MySQL, вам нужно будет создать файл .so (linux) или .dll (windows). Пример показан здесь: http://www.codeproject.com/KB/database/mygroupconcat.aspx
Я не уверен в mssql и oracle, но я ставлю они также имеют возможность создавать собственные агрегаты.
Я очень предположил бы использовать NDESK.Options ( документацию ) и / или mono.Options (одинаковые API, различное пространство имен). Пример из документации :
bool show_help = false;
List<string> names = new List<string> ();
int repeat = 1;
var p = new OptionSet () {
{ "n|name=", "the {NAME} of someone to greet.",
v => names.Add (v) },
{ "r|repeat=",
"the number of {TIMES} to repeat the greeting.\n" +
"this must be an integer.",
(int v) => repeat = v },
{ "v", "increase debug message verbosity",
v => { if (v != null) ++verbosity; } },
{ "h|help", "show this message and exit",
v => show_help = v != null },
};
List<string> extra;
try {
extra = p.Parse (args);
}
catch (OptionException e) {
Console.Write ("greet: ");
Console.WriteLine (e.Message);
Console.WriteLine ("Try `greet --help' for more information.");
return;
}
Мне нравится , что один , потому что можно "определить правила" для аргументов, необходимых или нет...
или если Вы - парень Unix, чем Вы, мог бы любить GNU Getopt.NET порт.
Библиотека WPF TestApi идет с одним из самых хороших синтаксических анализаторов командной строки для разработки C#. Я настоятельно рекомендую изучение его, от блог Ivo Manolov на API:
// EXAMPLE #2:
// Sample for parsing the following command-line:
// Test.exe /verbose /runId=10
// This sample declares a class in which the strongly-
// typed arguments are populated
public class CommandLineArguments
{
bool? Verbose { get; set; }
int? RunId { get; set; }
}
CommandLineArguments a = new CommandLineArguments();
CommandLineParser.ParseArguments(args, a);
Есть парсер аргументов командной строки на http://www.codeplex.com/commonlibrarynet
Может анализировать аргументы используя
1. атрибуты
2. явные вызовы
3. одна строка из нескольких аргументов ИЛИ строковый массив
. Может обрабатывать такие вещи, как:
- config : Qa - startdate : $ { today } - регион : «Нью-Йорк» Настройки01
Его очень легко использовать.
Синтаксический анализатор командной строки Genghis может быть немного устаревшим, но он очень полнофункциональный и хорошо работает для меня.
Это обработчик, который я написал на основе класса Novell Options
.
Это нацелено на консольные приложения, которые выполняют цикл в стиле while (input! = "Exit")
, интерактивная консоль, такая как, например, FTP-консоль.
Пример использования:
static void Main(string[] args)
{
// Setup
CommandHandler handler = new CommandHandler();
CommandOptions options = new CommandOptions();
// Add some commands. Use the v syntax for passing arguments
options.Add("show", handler.Show)
.Add("connect", v => handler.Connect(v))
.Add("dir", handler.Dir);
// Read lines
System.Console.Write(">");
string input = System.Console.ReadLine();
while (input != "quit" && input != "exit")
{
if (input == "cls" || input == "clear")
{
System.Console.Clear();
}
else
{
if (!string.IsNullOrEmpty(input))
{
if (options.Parse(input))
{
System.Console.WriteLine(handler.OutputMessage);
}
else
{
System.Console.WriteLine("I didn't understand that command");
}
}
}
System.Console.Write(">");
input = System.Console.ReadLine();
}
}
] И источник:
/// <summary>
/// A class for parsing commands inside a tool. Based on Novell Options class (http://www.ndesk.org/Options).
/// </summary>
public class CommandOptions
{
private Dictionary<string, Action<string[]>> _actions;
private Dictionary<string, Action> _actionsNoParams;
/// <summary>
/// Initializes a new instance of the <see cref="CommandOptions"/> class.
/// </summary>
public CommandOptions()
{
_actions = new Dictionary<string, Action<string[]>>();
_actionsNoParams = new Dictionary<string, Action>();
}
/// <summary>
/// Adds a command option and an action to perform when the command is found.
/// </summary>
/// <param name="name">The name of the command.</param>
/// <param name="action">An action delegate</param>
/// <returns>The current CommandOptions instance.</returns>
public CommandOptions Add(string name, Action action)
{
_actionsNoParams.Add(name, action);
return this;
}
/// <summary>
/// Adds a command option and an action (with parameter) to perform when the command is found.
/// </summary>
/// <param name="name">The name of the command.</param>
/// <param name="action">An action delegate that has one parameter - string[] args.</param>
/// <returns>The current CommandOptions instance.</returns>
public CommandOptions Add(string name, Action<string[]> action)
{
_actions.Add(name, action);
return this;
}
/// <summary>
/// Parses the text command and calls any actions associated with the command.
/// </summary>
/// <param name="command">The text command, e.g "show databases"</param>
public bool Parse(string command)
{
if (command.IndexOf(" ") == -1)
{
// No params
foreach (string key in _actionsNoParams.Keys)
{
if (command == key)
{
_actionsNoParams[key].Invoke();
return true;
}
}
}
else
{
// Params
foreach (string key in _actions.Keys)
{
if (command.StartsWith(key) && command.Length > key.Length)
{
string options = command.Substring(key.Length);
options = options.Trim();
string[] parts = options.Split(' ');
_actions[key].Invoke(parts);
return true;
}
}
}
return false;
}
}
Некоторое время назад я написал синтаксический анализатор аргументов командной строки C #. Его по адресу: http://www.codeplex.com/CommandLineArguments
У этой проблемы есть множество решений. Для полноты и обеспечения альтернативы, если кто-то желает, я добавляю этот ответ для двух полезных классов в мою библиотеку кода Google .
Первый - это ArgumentList, который отвечает только за анализ параметров командной строки. Он собирает пары «имя-значение», определенные переключателями «/ x: y» или «-x = y», а также собирает список «безымянных» записей. Его основное использование обсуждается здесь , см. Класс здесь .
Вторая часть - это CommandInterpreter , который создает полнофункциональное приложение командной строки из вашего класса .Net. В качестве примера:
using CSharpTest.Net.Commands;
static class Program
{
static void Main(string[] args)
{
new CommandInterpreter(new Commands()).Run(args);
}
//example ‘Commands’ class:
class Commands
{
public int SomeValue { get; set; }
public void DoSomething(string svalue, int ivalue)
{ ... }
В приведенном выше примере кода вы можете запустить следующее:
Program.exe DoSomething «строковое значение» 5
- или -
Program.exe dosomething / ivalue = 5 - svalue: "строковое значение"
Это так просто или так сложно, как вам нужно. Вы можете просмотреть исходный код , просмотреть справку или загрузить двоичный файл .
Похоже, у каждого есть свои любимые парсеры командной строки, полагаю, мне лучше добавить свои :).
Эта библиотека содержит парсер командной строки , который инициализирует класс значениями из командной строки. В нем масса функций (я создавал ее много лет).
Анализ командной строки в платформе BizArk имеет следующие ключевые особенности:
Я бы предложил библиотеку с открытым исходным кодом CSharpOptParse . Он анализирует командную строку и гидратирует определяемый пользователем объект .NET с помощью ввода командной строки. Я всегда обращаюсь к этой библиотеке при написании консольного приложения на C #.