Отображение данных параметров CLR

Я пишу генератор хранимых процедур, и мне нужно сопоставить типы CLR с их типами SQL Server.

MSDN перечисляет сопоставления типов по адресу: http://msdn.microsoft.com/en-us/library/ms131092.aspx но я не хочу использовать большой оператор switch для обработки сопоставлений.

Есть ли простой способ получить тип SQL Server в виде строки, используя любой процесс, используемый System.Data.SqlTypes?

Мне бы хотелось, чтобы подпись метода была такой:

static string GetSqlType(Type clrType)
{
    ...
    return sqlType;
}

Итак, учитывая следующий вызов:

string sqlType = GetSqlType(1.GetType());

sqlType должен содержать: "int".

1 ответ

Решение

Это сделано довольно сложно, так как это зависит от того, какую версию сервера sql вы хотите использовать.

  • С целью на 2008 год вы, вероятно, захотите, чтобы экземпляры DateTime отображались в улучшенное значение datetime2, а не datetime.
    • TimeSpan еще хуже, поскольку ваш запасной вариант использует DateTime или varchar.

Вот руководство о том, как SQL Server будет работать с типами данных в сценариях репликации

SQL Server Compact Edition добавляет еще больше путаницы, поскольку не поддерживает типы столбцов varchar(max), varbinary(max) (вы ограничены явными столбцами длиной ~4K).

В какой-то момент вам также нужно будет принять эвристическое решение для областей с несколькими вариантами.

  • текстовая информация может быть varchar(n) или varchar(max).
    • или XML с 2005 года
    • или текст, но это устарело
  • десятичное будет хорошо отображаться в числовой для ввода, но рискованно на выходе, так как числовой имеет больший масштаб
  • должны ли растровые изображения быть изображениями или varbinary?
    • Снова изображение устарело, но это может раздражать людей, все еще использующих его.
  • Целые числа без знака
    • Uint можно смело положить в bigint
    • Улонг довольно проблематично
    • Bigints будет еще веселее.

Учитывая все это в сочетании с красивым простым оператором switch в служебной функции, жизнь станет намного проще, чем попытка использовать некую непрозрачную библиотеку BCL, предназначенную только для перевода типов, а не для создания текстовых SQL.
Это также дает понять через бросок по умолчанию или varchar (max) по умолчанию, каким будет ваше "еще не определенное" поведение, которое останется под вашим контролем.

Возвращение простого неизменяемого класса из метода вида:

public sealed class SqlServerTypeDescription
{
    // for sql text construction
    public readonly string SqlServerName;
    // for code construction
    public readonly SqlDbType SqlDbType;
    // for code construction
    public readonly Type ClrType;

    // constructor etc.
}

Вы также можете добавить необязательное значение точности / размера, хотя вы можете оставить это пользователю.

Другие вопросы по тегам