2016-03-07 85 views
1

我想在数据库中的一个表内创建一个计算字段。我正在使用visual basic,而我的IDE是visual studio。在Visual Basic中创建计算字段

我最近创建使用访问相同的数据库,并用于一个计算字段的表达式内的以下计算:

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

正如我刚粘贴到编码成默认值,或作为一个场的结合的第一去远射,但有一个错误。猜猜我不允许使用现有列中的数据进行计算。

enter image description here

谁能帮我制作这个领域?该字段不需要位于数据库内,但是如果可以在数据库外使用datagridview或其他类似的方式在数据库外进行计算,那么该字段可能会更好。

1级,2和3包含的从0号为100

我无法找到任何教程,除非任何人都可以在正确的方向指向我?

回答

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

+0

谢谢你好,先生,我有点困惑,所以我用nchar作为它可以存储数值(显然也包括文本)。什么是最好的数据类型,数字?数据类型说数字(18,0)18和零代表什么?显然它们可以改变,但是它与可以输入的最高和最低值有什么关系? – ceefax12

+1

我建议使用'decimal(9,3)'。这将在逗号前存储小数点后三位数字和6(9减3)位数字。因此,任何给定等级的最高存储值可以是'999999.999'。有关更多信息,请参阅以下内容:https://msdn.microsoft.com/en-us/library/ms187746.aspx – Ralph

+0

ahh我看到了,非常感谢您的帮助:) – ceefax12