【发布时间】:2010-05-09 03:10:27
【问题描述】:
我有一个由Customers、Quote、QuoteDetail 表组成的 SQL Server 2005 数据库。我想要/需要强制执行引用完整性,这样当在QuoteDetail 上进行插入时,报价和客户表也会受到影响。我已尽力在我的桌子上设置主键/外键,但需要一些帮助。这是我的桌子现在的脚本(请不要笑):
客户:
CREATE TABLE [dbo].[Customers](
[pkCustID] [int] IDENTITY(1,1) NOT NULL,
[CompanyName] [nvarchar](50) NULL,
[Address] [nvarchar](50) NULL,
[City] [nvarchar](50) NULL,
[State] [nvarchar](2) NULL,
[ZipCode] [nvarchar](5) NULL,
[OfficePhone] [nvarchar](12) NULL,
[OfficeFAX] [nvarchar](12) NULL,
[Email] [nvarchar](50) NULL,
[PrimaryContactName] [nvarchar](50) NULL,
CONSTRAINT [PK_Customers]
PRIMARY KEY CLUSTERED([pkCustID] ASC)
)
行情:
CREATE TABLE [dbo].[Quotes](
[pkQuoteID] [int] IDENTITY(1,1) NOT NULL,
[fkCustomerID] [int] NOT NULL,
[QuoteDate] [timestamp] NOT NULL,
[NeedbyDate] [datetime] NULL,
[QuoteAmt] [decimal](6, 2) NOT NULL,
[QuoteApproved] [bit] NOT NULL,
[fkOrderID] [int] NOT NULL,
CONSTRAINT [PK_Bids]
PRIMARY KEY CLUSTERED ([pkQuoteID] ASC)
)
GO
ALTER TABLE [dbo].[Quotes] WITH CHECK
ADD CONSTRAINT [fkCustomerID]
FOREIGN KEY([fkCustomerID]) REFERENCES [dbo].[Customers] ([pkCustID])
报价详情:
CREATE TABLE [dbo].[QuoteDetail](
[ID] [int] IDENTITY(1,1) NOT NULL,
[fkQuoteID] [int] NOT NULL,
[fkCustomerID] [int] NOT NULL,
[fkPartID] [int] NULL,
[PartNumber1] [float] NOT NULL,
[Qty1] [int] NOT NULL,
[PartNumber2] [float] NULL,
[Qty2] [int] NULL,
[PartNumber3] [float] NULL,
[Qty3] [int] NULL,
[PartNumber4] [float] NULL,
[Qty4] [int] NULL,
[PartNumber5] [float] NULL,
[Qty5] [int] NULL,
[PartNumber6] [float] NULL,
[Qty6] [int] NULL,
[PartNumber7] [float] NULL,
[Qty7] [int] NULL,
[PartNumber8] [float] NULL,
[Qty8] [int] NULL,
[PartNumber9] [float] NULL,
[Qty9] [int] NULL,
[PartNumber10] [float] NULL,
[Qty10] [int] NULL,
[PartNumber11] [float] NULL,
[Qty11] [int] NULL,
[PartNumber12] [float] NULL,
[Qty12] [int] NULL,
[PartNumber13] [float] NULL,
[Qty13] [int] NULL,
[PartNumber14] [float] NULL,
[Qty14] [int] NULL,
[PartNumber15] [float] NULL,
[Qty15] [int] NULL,
[PartNumber16] [float] NULL,
[Qty16] [int] NULL,
[PartNumber17] [float] NULL,
[Qty17] [int] NULL,
[PartNumber18] [float] NULL,
[Qty18] [int] NULL,
[PartNumber19] [float] NULL,
[Qty19] [int] NULL,
[PartNumber20] [float] NULL,
[Qty20] [int] NULL,
CONSTRAINT [PK_QuoteDetail]
PRIMARY KEY CLUSTERED([ID] ASC)
)
GO
ALTER TABLE [dbo].[QuoteDetail] WITH CHECK
ADD CONSTRAINT [FK_QuoteDetail_Customers]
FOREIGN KEY([fkCustomerID]) REFERENCES [dbo].[Customers] ([pkCustID])
ALTER TABLE [dbo].[QuoteDetail] WITH CHECK
ADD CONSTRAINT [FK_QuoteDetail_PartList]
FOREIGN KEY([fkPartID]) REFERENCES [dbo].[PartList] ([RecID])
ALTER TABLE [dbo].[QuoteDetail] WITH CHECK
ADD CONSTRAINT [FK_QuoteDetail_Quotes]
FOREIGN KEY([fkQuoteID]) REFERENCES [dbo].[Quotes] ([pkQuoteID])
您对如何设置这些以使客户中的客户 ID 与报价中的客户 ID 相同(引用完整性)以及在向 QuoteDetial 进行插入时将客户 ID 插入到报价和客户中的建议/指导将不胜感激。
更新:对表进行了更改,现在是存储过程:
USE [Diel_inventory]
GO
/****** Object: StoredProcedure [dbo].[AddQuote] Script Date: 05/08/2010 14:57:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[AddQuote] as
Declare @CustID int,
@CompanyName nvarchar(50),
@Address nvarchar(50),
@City nvarchar(50),
@State nvarchar(2),
@ZipCode nvarchar(5),
@Phone nvarchar(12),
@FAX nvarchar(12),
@Email nvarchar(50),
@ContactName nvarchar(50),
@QuoteID int,
@QuoteDate datetime,
@NeedbyDate datetime,
@QuoteAmt decimal,
@ID int,
@QuoteDetailPartID int,
@PartNumber float,
@Quantity int
begin
Insert into dbo.Customers
(CompanyName, Address, City, State, ZipCode, OfficePhone, OfficeFAX, Email, PrimaryContactName)
Values (@CompanyName, @Address, @City, @State, @ZipCode, @Phone, @FAX, @Email, @ContactName)
set @CustID = scope_identity()
Insert into dbo.Quotes
(fkCustomerID,NeedbyDate,QuoteAmt)
Values(@CustID,@NeedbyDate,@QuoteAmt)
set @QuoteID = scope_identity()
Insert into dbo.QuoteDetail
(ID) values(@ID)
set @ID=scope_identity()
Insert into dbo.QuoteDetailParts
(QuoteDetailPartID, QuoteDetailID, PartNumber, Quantity)
values (@ID, @QuoteDetailPartID, @PartNumber, @Quantity)
END
在 SSMS 中,参数在此存储过程的树形视图中不可见。另外,当我尝试从我的 ASPX 页面调用这个存储过程时,我收到了
System.Data.SqlClient.SqlException: Procedure AddQuote has no parameters and arguments were supplied
这是在我的 ASPX 页面上定义的 SQLDataSource:
<asp:SqlDataSource runat="server" ID="SDSAddQuote"
ConnectionString="<%$ ConnectionStrings:Diel_inventoryConnectionString %>"
InsertCommand="AddQuote" InsertCommandType="StoredProcedure">
<InsertParameters>
<asp:ControlParameter ControlID="txtCompanyName" type="String" Name="CompanyName" />
<asp:ControlParameter ControlID="txtCompanyAddress" Type="String" Name="CompanyAddress" />
<asp:ControlParameter ControlID="txtCompanyCity" Type="String" Name="CompanyCity" />
<asp:ControlParameter ControlID="ddlCompanyState" Type="String" Name="CompanyState" />
<asp:ControlParameter ControlID="txtCompanyZip" Type="String" Name="CompanyZip" />
<asp:ControlParameter ControlID="calNeedByDate" Type="DateTime" Name="NeedByDate" />
<asp:ControlParameter ControlID="txtPartNumber1" Type="String" Name="PartNumber1" />
<asp:ControlParameter ControlID="txtQty1" Type="Int16" Name="Qty1" />
<asp:ControlParameter ControlID="txtPartNumber2" Type="String" Name="PartNumber2" />
<asp:ControlParameter ControlID="txtQty2" Type="Int16" Name="Qty2" />
<asp:ControlParameter ControlID="txtPartNumber3" Type="String" Name="PartNumber3" />
<asp:ControlParameter ControlID="txtQty3" Type="Int16" Name="Qty3" />
<asp:ControlParameter ControlID="txtPartNumber4" Type="String" Name="PartNumber4" />
<asp:ControlParameter ControlID="txtQty4" Type="Int16" Name="Qty4" />
<asp:ControlParameter ControlID="txtPartNumber5" Type="String" Name="PartNumber5" />
<asp:ControlParameter ControlID="txtQty5" Type="Int16" Name="Qty5" />
<asp:ControlParameter ControlID="txtPartNumber6" Type="String" Name="PartNumber6" />
<asp:ControlParameter ControlID="txtQty6" Type="Int16" Name="Qty6" />
<asp:ControlParameter ControlID="txtPartNumber7" Type="String" Name="PartNumber7" />
<asp:ControlParameter ControlID="txtQty7" Type="Int16" Name="Qty7" />
<asp:ControlParameter ControlID="txtPartNumber8" Type="String" Name="PartNumber8" />
<asp:ControlParameter ControlID="txtQty8" Type="Int16" Name="Qty8" />
<asp:ControlParameter ControlID="txtPartNumber9" Type="String" Name="PartNumber9" />
<asp:ControlParameter ControlID="txtQty9" Type="Int16" Name="Qty9" />
<asp:ControlParameter ControlID="txtPartNumber10" Type="String" Name="PartNumber10" />
<asp:ControlParameter ControlID="txtQty10" Type="Int16" Name="Qty10" />
<asp:ControlParameter ControlID="txtPartNumber11" Type="String" Name="PartNumber11" />
<asp:ControlParameter ControlID="txtQty11" Type="Int16" Name="Qty11" />
<asp:ControlParameter ControlID="txtPartNumber12" Type="String" Name="PartNumber12" />
<asp:ControlParameter ControlID="txtQty12" Type="Int16" Name="Qty12" />
<asp:ControlParameter ControlID="txtPartNumber13" Type="String" Name="PartNumber13" />
<asp:ControlParameter ControlID="txtQty13" Type="Int16" Name="Qty13" />
<asp:ControlParameter ControlID="txtPartNumber14" Type="String" Name="PartNumber14" />
<asp:ControlParameter ControlID="txtQty14" Type="Int16" Name="Qty14" />
<asp:ControlParameter ControlID="txtPartNumber15" Type="String" Name="PartNumber15" />
<asp:ControlParameter ControlID="txtQty15" Type="Int16" Name="Qty15" />
<asp:ControlParameter ControlID="txtPartNumber16" Type="String" Name="PartNumber16" />
<asp:ControlParameter ControlID="txtQty16" Type="Int16" Name="Qty16" />
<asp:ControlParameter ControlID="txtPartNumber17" Type="String" Name="PartNumber17" />
<asp:ControlParameter ControlID="txtQty17" Type="Int16" Name="Qty17" />
<asp:ControlParameter ControlID="txtPartNumber18" Type="String" Name="PartNumber18" />
<asp:ControlParameter ControlID="txtQty18" Type="Int16" Name="Qty18" />
<asp:ControlParameter ControlID="txtPartNumber19" Type="String" Name="PartNumber19" />
<asp:ControlParameter ControlID="txtQty19" Type="Int16" Name="Qty19" />
<asp:ControlParameter ControlID="txtPartNumber20" Type="String" Name="PartNumber20" />
<asp:ControlParameter ControlID="txtQty20" Type="Int16" Name="Qty20" />
</InsertParameters>
</asp:SqlDataSource>
为什么我的参数不可用,尽管在我的存储过程的开头声明了它们?
谢谢,
席德
【问题讨论】:
-
您在存储过程中将它们声明为 局部变量 -- NOT 作为存储过程的参数!!
-
如果你想为你的存储过程定义参数,你需要把它们放在
AS关键字之前
标签: sql-server-2005 database-design