在这个评分期间,我的CS老师给我们留下了一个涉及SQL和Delphi / VB的开放式项目。
我最终完成了设计和构建程序的任务,该程序允许用户通过Delphi / VB中的GUI插入和读取从数据库(最新的SQL Server,顺便说一句)中提取的飓风数据。但是,有一些捕获量。
需要三个表:Hurricanes,Hurricane_History和Category
不打算修改“类别”表,它包含“最小”列。速度','最大。速度'和'类别'。我们的想法是,如果X在Y类的最小和最大速度范围内,则旋转速度为X的飓风属于Y类。
飓风表应由最终用户通过Delphi / VB gui进行修改。它包含以下列:'名称','日','时间','Rotational_Speed','Movement_Speed','纬度','经度'和'照片'。
然后是Hurricane_History表,其中包含'Name','Category','Starting_DateTime','Ending_DateTime','Starting Latitude','Starting Longitude','Ending Latitude','Ending Longitude'。此表不是要直接修改,而是通过SQL自动填充(我使用SQL触发器和存储过程)。
该程序最终应该做的是:用户打开可视应用程序,并输入特定飓风的信息。由于只有表Hurricanes被修改,用户将插入名称,日,时间,当前旋转速度,当前移动速度,当前纬度,当前经度,以及可选的图片。
如果用户输入了尚不存在的飓风,那么它将使用Hurricane_History表中的相应数据创建新的飓风。如果他输入已经存在的飓风数据,则应更新该飓风的数据,并将其存储到相应的Hurricane_History行中。此外,应使用存储在“类别”表中的数据自动使用SQL填充当前的飓风类别。
到目前为止,我有三个表,列,Delphi GUI,连接(Delphi和SQL Server之间)等。
我真正遇到的困难是在Hurricane_History表中生成数据所需的SQL触发器和存储过程。这是我的算法,第一个用于填充类别,第二个用于填充Hurricane_History表的数据:
create trigger determine_category on Hurricanes for insert, update as
*when a value is inserted into Hurricanes.Rotational_Speed, match it with the corresponding row in the Categories table, and insert the corresponding category into the Category column of the hurricane's Hurricane_History row.*
create trigger populate_data on Hurricanes for insert, update as
*if Hurricane.name exists, perform an update instead of an insert for using Hurricanes.Day as Hurricanes_History.Ending_Day, Hurricanes.Latitude and Hurricane.Longitude as Hurricanes_History.Ending_Latitude and Hurricanes_History.Ending_Longitude, and the Category using the determine_category trigger.*
*if Hurricane.name does not exist, create a record in Hurricanes_History using the data from the newly inserted Hurricane record, and populating the Category using the determine_category trigger*
我需要帮助的是将我的想法和想法转化为SQL代码,所以我想知道是否有人可能想要在整个过程中帮助我。
非常感谢!
编辑:
我刚刚制作了一个简单的存储过程来确定类别。我不知道该怎么做是使用存储过程的结果/输出作为插入值。有没有人知道如何做到这一点?
CREATE PROCEDURE determine_category
@speed int(5)
AS
SELECT Category FROM Categories
WHERE Max_Speed >= @speed AND Min_Speed >= @speed
答案 0 :(得分:4)
首先,由于您使用的是SQL Server,并且可以使用存储过程,因此请勿使用触发器。这不是必需的。如果你的老师需要证明理由,这里是article from SQL Server MVP Tom LaRock which discusses issues with handling triggers。
其次,就如何编写存储过程而言,考虑如何在逻辑上处理所有功能。你说你需要做以下事情:
您的应用程序应将所有这些作为单独的路径处理。在编写第一个T-SQL代码之前,您需要考虑功能。这意味着您必须拥有一个显示现有信息的界面。您将不得不显示数据库中存在的飓风。然后,一旦用户选择了一个以获得更多信息,您将不得不撤回飓风历史信息。所以我知道在这种情况下我根据用户输入有两种不同的数据检索。这告诉我,我需要构建GUI界面来逻辑地处理该进程并以用户可以使用的方式显示信息。它还告诉我,我必须构建两个不同的存储过程。第二个将传递一些识别飓风的信息来检索数据(这将是主键)。
现在浏览应用程序的其余功能。这应该让你开始。
答案 1 :(得分:1)
我更倾向于在事务中执行逻辑DML SQL语句,而不是使用触发器来执行此操作。触发器虽然有时证明是有用的,但在这种情况下并不是必需的(除非它们是课程作业所必需的)。
作为第一种方法,请考虑完成申请所需的内容 -
在这一层,我们很可能想要
1.提供具有先前飓风列表的用户,可能显示一些关键细节,并使用户能够选择特定飓风并查看所有详细信息。
2.使用户能够插入新的飓风数据。考虑如何向用户显示类别以及如何从该层获取输入数据并最终到达数据层。还要考虑我们应该如何以及是否应该验证用户输入。需要验证什么?好吧,确保不要使用SQL注入,这些值是允许的范围和长度等,如果这是一个真正的应用程序,那么用户输入验证将是必要的。
我们可以采用一种极其简化的方法,并通过存储过程将UI层调用直接进入数据层(这将作为我们的数据访问层以及我们的业务逻辑层,因为它们将封装有关飓风的规则记录已经存在,需要更新或需要创建新记录,也可能需要一些验证。
答案 2 :(得分:-1)
Re:将sproc输出插入表中。使用以下一般语法:
INSERT INTO table (field1, field2, field3)
EXEC yourSproc(param, param)
在insert文档中,搜索execute_statement
以获取详细信息。