我有两张桌子:
第一个是Requisitions
(父表):
RequisitionId int // primary key
RequisitionNumber varchar(20)
RequisitionBy varchar(100)
Remarks varchar(300)
ApprovedStatus varchar(20)
另一个是RequisitionDetails
(子表):
RequisitionDetailId int // primary key
RequisitionId int // foreign key ("Requisitions" table)
ProductId int
UnitConversionId int
Quantity decimal(18, 2)
现在我想在Requisitions
表中插入一行,并使用单个存储过程在RequisitionDetails
表中插入多行。
如果事务中存在任何问题,则存储过程应包含ROLLBACK
命令。我需要帮助编写这个存储过程。
我已经创建了存储过程以在“申请单”表中插入一行,并且我有插入行的RequisitionId。现在使用此RequisitionId,如何为RequisitionDetails表插入多行?
这是存储过程。我需要扩展它:
CREATE PROCEDURE dbo.InsertRequisition
(
@RequisitionNumber varchar(20) = NULL,
@RequisitionBy varchar(100) = NULL,
@Remarks varchar(300) = NULL,
@ApprovedStatus varchar(20) = NULL
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @requisitionId INT;
INSERT INTO [Requisitions]
(
[RequisitionNumber],
[RequisitionBy],
[Remarks],
[ApprovedStatus]
)
VALUES
(
@RequisitionNumber,
@RequisitionBy,
@Remarks,
@ApprovedStatus
)
SET @requisitionId = SCOPE_IDENTITY();
END
答案 0 :(得分:1)
如果我理解正确的问题,下面的代码应该可以解决您的问题。
第1步:在数据库中创建类型
CREATE TYPE AnyNameTableType AS TABLE
(ColumnName1 INT, ColumnName2 VARCHAR(50))
第2步:创建/修改您的存储过程以接受表格类型
CREATE PROCEDURE My_TestProc
(@tvpVariableName AnyNameTableType READONLY)
AS
BEGIN
SELECT * FROM @tvpVariableName;
--You can use this variable as table anywhere you want
--Select/Insert/Update from this table and update your RequisitionDetails
--table.
END;
第3步:编写c#代码以传递此变量。
DataTable table = new DataTable(); //Define your datatable simillar to TableType declared in SQL
table.Columns.Add("ColumnName1"); //Same Column Name you should use as of TableTYpe
table.Columns.Add("ColumnName2");
DataRow row = table.NewRow();
row["ColumnName1"] = 1; //Fill you datatable with data you want
row["ColumnName2"] = "Pratik";
table.Rows.Add(row);
table.AcceptChanges();
SqlConnection connection = new SqlConnection("data source=yoursource;database=test;uid=sa;pwd=yourpwd");
SqlCommand selectCommand = new SqlCommand("My_TestProc", connection);
selectCommand.CommandType = CommandType.StoredProcedure;
SqlParameter tvpParam = selectCommand.Parameters.AddWithValue("@tvpVariableName", table);//Parameter Name
tvpParam.SqlDbType = SqlDbType.Structured; // Very Important Not to miss
connection.Open(); //You can add multiple parameters also.
grid.DataSource = selectCommand.ExecuteReader();
grid.DataBind();
connection.Close();
如果您有任何疑惑,请执行此步骤后告诉我。