Создать вычисляемое поле в Visual Basic

Я хотел бы создать вычисляемое поле в одной из моих таблиц в базе данных. Я использую visual basic, а моя IDE — Visual Studio.

Недавно я создал ту же базу данных, используя доступ, и использовал следующий расчет в выражении вычисляемого поля:

 (([Grade1]/10)*2)+(([Grade2]/10)*3)+(([Grade3]/10)*5)

Сначала я просто вставил код в значение по умолчанию или привязку поля как длинный выстрел, но получил ошибку. Думаю, мне не разрешено производить вычисления, используя данные из существующих столбцов.

введите здесь описание изображения

Может ли кто-нибудь помочь мне с созданием этого поля? Поле не обязательно должно находиться в базе данных, было бы предпочтительнее, если бы его можно было вычислить вне базы данных в форме с использованием datagridview или чего-то подобного, было бы хорошо.

1, 2 и 3 классы содержат числа от 0 до 100.

Я не могу найти никаких руководств, пока кто-нибудь не укажет мне правильное направление?


person ceefax12    schedule 07.03.2016    source источник


Ответы (1)


Чтобы получить вычисляемое поле, как описано, вы должны использовать следующий код T-SQL:

create table dbo.Enrolement
    (
     StudentID int not null,
     ModuleNUmber int not null,
     Grade1 nchar(3) not null,
     Grade2 nchar(3) not null,
     Grade3 nchar(3) not null,
     Overall as cast(((Grade1 / 10 * 2) + (Grade2 / 10 * 3) + (Grade3 / 10 * 5)) as nchar(10))
    )

Тем не менее, я не понимаю, почему вы храните оценки в виде текста. Более того, ваш код T-SQL требует неявного преобразования текста в числа, выполнения вычислений, а затем обратно обратно в текст. Кроме того, во время конвертации вы не сообщаете SQL, во что конвертировать. Итак, если у вас есть оценки с десятичными разрядами, то SELECT из таблицы не получится.

insert into dbo.Enrolement
        (
         StudentID,
         ModuleNUmber,
         Grade1,
         Grade2,
         Grade3
        )
values  (
         2, -- StudentID - int
         101, -- ModuleNUmber - int
         N'1.2', -- Grade1 - nchar(3)
         N'1.8', -- Grade2 - nchar(3)
         N'3.9'  -- Grade3 - nchar(3)
        )
select *
from dbo.Enrolement

Сообщение 245, уровень 16, состояние 1, строка 17 Преобразование не удалось при преобразовании значения nvarchar '1.2' в тип данных int.

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

create table dbo.Enrolement
    (
     StudentID int not null,
     ModuleNUmber int not null,
     Grade1 decimal(9, 3) not null,
     Grade2 decimal(9, 3) not null,
     Grade3 decimal(9, 3) not null,
     Overall as ((Grade1 / 10 * 2) + (Grade2 / 10 * 3) + (Grade3 / 10 * 5))
    )

Я решил использовать decimal(9,3), потому что любая точность от 1 до 9 использует один и тот же объем памяти в байтах. В то же время я ограничил десятичные знаки тремя и, таким образом, допускаю округление до двух знаков после запятой. В то же время существует достаточно места для потенциального «добавления» оценок (если это когда-либо имеет смысл) к общей сумме 999999,999.

person Ralph    schedule 07.03.2016
comment
Спасибо, сэр, я немного запутался с этим, поэтому я использовал nchar, так как он может хранить числовые значения (а также текст, очевидно). Какой тип данных лучше всего использовать, числовой? Тип данных говорит числовой (18,0), что означают 18 и ноль? Очевидно, что их можно изменить, но имеет ли это какое-либо отношение к максимальному и минимальному значениям, которые можно ввести? - person ceefax12; 07.03.2016
comment
Я бы рекомендовал использовать decimal(9,3). Это будет хранить числа с тремя десятичными знаками и 6 (9 минус 3) знаками перед запятой. Следовательно, максимальное сохраненное значение для любой данной оценки может быть 999999.999. Дополнительные сведения см. по следующему адресу: msdn.microsoft.com/en- нас/библиотека/ms187746.aspx - person Ralph; 07.03.2016