Webform Combobox 数据和数据库之间的链接(SQL Server 和 ASP.NET)
标题虽然很长,但几乎说明了一切。
我拥有的是一个主表,其中有一堆通过外键支持的表关系。对于一些外部表,当尝试将一条记录插入到其中一个外键不存在的主表中时,数据将被传递到外部表以首先创建记录,从而使约束有效并且将创建的记录的键传递回主表的插入过程。
该数据来自字符串形式的表单,但外键自然会是 int。该过程看起来像这样:
-- ASP.NET Web Form --
Requestor Name: _____________ (combobox)
Request: _____________ (dropdownlist)
Date: _____________ (datepicker)
这是一个超级简化的版本,但假设我们有一个包含上述数据的主表,其中两个名称都是 People
表的外键。 姓名字段是组合框,其中包含链接到人员的姓名填充列表。但是,如果我想输入 People 表中尚不存在的人员,则该过程应首先创建该人员,然后使用该新记录中的 ID 作为包含上述列的 Master 表中的外键。
我正在使用 SQL Server 和 ASP.NET 以及 VB.NET 代码隐藏。我已经在这个问题上摸索了一段时间了,如何在 Web 服务器和数据库服务器之间传递数据(以不同的形式,如外键或字符串),以及在哪里验证/转换数据。
如果外键存在,输入的名称似乎将作为 ID 传递,如果不存在,则作为字符串传递。
这是迄今为止我最困惑的问题,不知道还能去哪里寻找。我已经阅读了 Scott Mitchell 的 网站,并且其他的。
我的解决方案(?)
我能想到的最好办法是将用户的用户输入作为字符串传递,并在 T-SQL 过程中将其转换为 int。如果从下拉列表中选择该值,则它应该与有效的外键精确匹配。如果不匹配,则创建一个新的 Person 并返回外键。这是最佳实践吗?
The title, while long, pretty much says it all.
What I have is a master table with a bunch of supporting table relations through foreign keys. For a few of the foreign tables, upon attempting to insert a record into the master table where one of the foreign keys doesn't exist, the data would be passed to the foreign table to create the record first, thereby making the constraint valid and passing the key to the created record back to the insert procedure of the master table.
This data comes from a form in String form, but naturally the foreign key will be an int. The process would look something like this:
-- ASP.NET Web Form --
Requestor Name: _____________ (combobox)
Request: _____________ (dropdownlist)
Date: _____________ (datepicker)
This is a super simplified version, but assume we have a master table with the above data, where both names are foreign keys to a People
table. The name fields are comboboxes with a populated list of names linking to People. However, if I wanted to enter a person who didn't yet exist in the People table, the procedure should first create the Person, then use the ID from that new record as the foreign key in the Master table containing columns for the above.
I'm using SQL Server and ASP.NET with VB.NET codebehind. I've been scratching my head over this one for awhile, how to pass data (in different forms such as a foreign key or string) between the web server and DB server, as well as where to validate / transform the data.
It seems the entered name will be passed as an ID if the foreign key exists, and a String if not.
This is my most perplexing problem so far, and no idea where else to look. I've read up on Scott Mitchell's site and others.
MY SOLUTION (?)
The best I can come up with is to pass the user input from the user as a string and convert it to int in the T-SQL procedure. If the value was selected from the drop down, it should match precisely with a valid foreign key. If it doesn't match, then create a new Person and return a foreign key. Is this best practice?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这看起来很复杂,因为事实确实如此。你必须亲自动手。如果您需要一个支持 ACID 支持的关系数据库,则没有自动神奇的方法可以绕过它。
关系数据库101:在填充外键之前主键必须存在(这就是数据仓库开发人员在事实表之前填充维度表的原因)。您必须设计逻辑来验证主键是否存在,如果不存在则插入并获取键,如果存在则获取键。
This seems complicated because it is. You have to get your hands dirty. If you need a relational database with ACID support, there's no auto-magical way of getting around it.
Relational databases 101: The primary key must exist before the foreign key can be populated (This is the reason why data warehouse developers populate the dimension table before the fact table). You'll have to design the logic to validate that the primary key exists, insert and get the key if not, and just get the key if exists.
这是我的实现。我不知道这是否是最好的,但它对我来说效果很好。基本上我从控件中获取值;对于组合框,我需要来自
TextBox
和DropDownList
的值。然后,我将这些值传递给代码隐藏中的以下函数:然后我的存储过程处理这些值,就像这样...
(如果我忽略了替换某些值,请原谅我。我试图捕获所有值。)
这个存储过程也处理用户角色的情况。如果只需要更简单的用户情况,只需删除处理用户角色检查和插入的子句即可。 :)
Here's my implementation. I don't know if it's the best, but it worked well for me. Basically I take the values from the controls; in the case of the combobox I need the values from both the
TextBox
andDropDownList
. I then pass those values to the following function in my codebehind:Then my stored procedure handles the values something like so...
(Forgive me if I neglected to replace some of the values. I tried to catch them all.)
This stored procedure deals with the case of User Roles as well. If the more simple case of Users only is needed, simply remove the clauses dealing with the checking and insertion of User Roles. :)