【发布时间】:2016-05-26 19:50:40
【问题描述】:
我有一张这样的桌子
CREATE TABLE Partners
(
id UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(),
first_name NVARCHAR(50) NOT NULL,
last_name NVARCHAR(50) NOT NULL,
org_name NVARCHAR(50) NOT NULL,
email NVARCHAR(254) NOT NULL, -- 254 is optimal length according to http://stackoverflow.com/questions/1199190/what-is-the-optimal-length-for-an-email-address-in-a-database
region_id INT,
PRIMARY KEY (id),
FOREIGN KEY (region_id) REFERENCES Regions(id)
);
还有一个存储过程
CREATE PROCEDURE AddPartner (@first_name NVARCHAR(50),
@last_name NVARCHAR(50),
@org_name NVARCHAR(50),
@email NVARCHAR(254),
@region_id INT,
@new_guid UNIQUEIDENTIFIER OUTPUT)
AS
BEGIN
DECLARE @T TABLE ( OutputGuid UNIQUEIDENTIFIER )
INSERT INTO Partners (first_name,last_name,org_name,email,region_id)
OUTPUT INSERTED.id INTO @T
VALUES (@first_name,@last_name,@org_name,@email,@region_id)
SELECT @new_guid = OutputGUID FROM @T
END
用于插入伙伴并输出新生成的伙伴id。
现在我刚刚了解到我需要在Partners 和另一个我称为Regions 的基本表之间建立一对多关系。所以我做了一个交集表
-- Create intersection table that associates partners with regions
CREATE TABLE Destinations
(
id INT IDENTITY(1,1),
partner_id UNIQUEIDENTIFIER,
region_id INT,
FOREIGN KEY (partner_id) REFERENCES Partners(id),
FOREIGN KEY (region_id) REFERENCES Regions(id)
);
在用户界面中添加合作伙伴时,将与合作伙伴关联的区域添加到Destinations 表中。我希望这是一个原子操作(如果添加 Destination 时出现问题,则回滚伙伴的插入)而且我从来没有做过这样的事情。
问题 1:如何将区域 ID 列表插入到存储过程中?我了解如何通过对存储过程的多次调用来做到这一点,但我认为有一些方法可以通过一次调用来做到这一点,但我不知道怎么做。
问题 2:您能告诉我如何编写此查询吗?
问题 3:你能告诉我如何修改我的 C# 代码
Guid? pid = null;
// Insert partner to database
using (SqlCommand cmd = new SqlCommand("AddPartner", this._Conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@first_name", P.FirstName);
cmd.Parameters.AddWithValue("@last_name", P.LastName);
cmd.Parameters.AddWithValue("@org_name", P.OrgName);
cmd.Parameters.AddWithValue("@email", P.Email);
cmd.Parameters.AddWithValue("@region_id", P.RegionId);
SqlParameter output = new SqlParameter("@new_guid", SqlDbType.UniqueIdentifier) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(output);
this._Conn.Open();
cmd.ExecuteNonQuery();
pid = (Guid?)output.Value;
this._Conn.Close();
}
调用这个新查询? P 由
public class PartnerInit
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string OrgName { get; set; }
public string Email { get; set; }
public int RegionId { get; set; }
public List<int> Destinations { get; set; }
}
我不确定如何将 Destinations 字段放入存储过程。
【问题讨论】:
-
这里有很多问题。将 Destinations 作为单个参数获取的最简单方法是使用表值参数。 msdn.microsoft.com/en-us/library/bb675163%28v=vs.110%29.aspx
-
在 C#/SQL 中使用表值参数的 SO 链接。请务必使用第二个答案(不是公认的答案):stackoverflow.com/questions/5595353/…
-
99% 的时间你不需要表值参数。改变你的模型。
标签: sql asp.net sql-server tsql database-design