Проверка длины строк на основе связанных столбцов базы данных - PullRequest
1 голос
/ 26 марта 2009

В одном конце моего веб-приложения у меня есть таблица базы данных, в которой хранится множество фрагментов текста.

В середине у меня есть API, который разделяет уровни моего приложения.

На другом конце у меня есть пользовательский интерфейс, состоящий из множества TextBox es (или input type=text элементов формы, если вы предпочитаете).

Мне нужно, чтобы maxlength свойства TextBox были такими же, как максимальные длины строк в различных связанных столбцах таблицы базы данных. Я также хотел бы сделать проверку длины строки в моем API.

Конечно, я могу достичь этого вручную, но кто-нибудь знает методику на любой платформе, которая может помочь в настройке любой части этого автоматически?

В моем сценарии я использую веб-формы ASP.NET 3.5, LINQ to SQL и SQL Server 2005.

Ответы [ 5 ]

1 голос
/ 27 марта 2009

С риском не ответить на вопрос вообще ...

Похоже, у вас есть бизнес-правило, которое гласит: «это конкретное поле должно содержать не более N символов».

Я бы сказал, что как размер столбца базы данных, так и максимальная длина текстового поля являются отдельными следствиями этого бизнес-правила. Исправление одного из другого путает корреляцию с причинностью.

Кроме того, применение этого бизнес-правила путем проверки максимальной длины столбца базы данных имеет и другие последствия:

  • вы будете обращаться к базе данных каждый раз за то, что в противном случае могло бы быть операцией проверки в памяти;

  • если ваше бизнес-правило изменяется незначительно (например, N переходит от 100 до 80 символов), то вам нужно изменение на уровне схемы;

  • некоторые базы данных, работающие с кодировкой символов переменной длины, такие как UTF8, только нечетко определяют, сколько символов даже помещается в данный столбец;

  • в более широком смысле вы связываете бизнес-правило с артефактом реализации - что если вы позже решите использовать объектную базу данных?

Я не предлагаю, чтобы вы не определяли размер столбцов базы данных (вы должны это делать), а лишь отделяли бизнес-правило от реализации базы данных. Если вам удастся выполнить простую проверку фиксированной длины в коде приложения, я бы предложил это.

Редактировать прочитав ваш вопрос немного более внимательно, для максимальной длины текстового поля вам нужно N перед проверкой. Тем не менее, это все еще бизнес-правило - вы можете написать атрибут MaximumLength для ваших полевых аксессоров и опросить его?

1 голос
/ 26 марта 2009

Я знаю, что вы запрашиваете SQL Server, но в MYSQL вы можете получить свой столбец с

SELECT * FROM information_schema.`COLUMNS` C;

Там вы можете увидеть поле CHARACTER_MAXIMUM_LENGTH, которое даст вам именно то, что вы хотите.

Я уверен, что вы можете найти что-то подобное для SQL Server.

0 голосов
/ 29 марта 2009

Я не думаю, что для этого есть какое-либо нестандартное решение. Однако вы можете легко добавить специально отформатированный комментарий в атрибут MaxLength текстового поля, например

.
<asp:TextBox runat="server" MaxLength="<%--<TABLENAME>.<COLUMNNAME>--%>" />

Затем вы можете написать другую программу или макрос VS для просмотра ваших файлов aspx и установить MaxLength равным длине этого столбца, чтобы он стал.

<asp:TextBox runat="server" MaxLength="20<%--<TABLENAME>.<COLUMNNAME>--%>" />

Вы можете запустить эту программу при добавлении новых полей или при изменении размеров столбцов и т. Д.

0 голосов
/ 26 марта 2009

В SQL Server 2005 (и, вероятно, 2000 и 2008, хотя я не проверял), вы можете использовать следующий запрос, чтобы найти длину поля varchar по имени таблицы и имени столбца:

select 
    t.name TableName,
    c.name ColumnName,
    c.max_length ColumnSize
from sys.columns c
inner join sys.tables t on (c.object_id = t.object_id)
where t.name = 'MyTableName'
    and c.name = 'MyFieldName'

Поле max_length в sys.columns даст вам то, что вам нужно для полей ввода текстовой формы.

Я понимаю, что это не отвечает на ваш вопрос с точки зрения реализации этого через ваш API, оно должно помочь вам в этом.

0 голосов
/ 26 марта 2009

Обычно есть информация о схеме, которую вы можете запросить из базы данных, чтобы узнать максимальную длину данного столбца.

Посмотрите на SqlDataReader.GetSchemaTable (). Он вернет размер столбца (и много других данных) для каждого столбца. Make ExecuteReader () был вызван с параметром поведения, установленным в KeyInfo.

Другой подход - запросить словарь данных непосредственно на сервере sql. Это было давно, но я думаю, что что-то в sys (возможно, sys.columns) будет содержать информацию, которую вы ищете.

Затем вы можете обновить свойство textbox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...