目前我正在使用以下C#代码将行插入数据库
HistoricalData
我有另一个名为Id
的表,其中包含以下列:
Status
,Comments
,Date
,Conversions
我希望能够插入Id
表,选择刚从插入中自动创建的Id
,并在HistoricalData
的第二个插入中使用1! = 1
2! = 2
3! = 6
4! = 24
.
.
.
10! = 3628800
.
.
100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
BigInteger
1}}表。我可以用某种SQL魔法来做到这一点吗?
答案 0 :(得分:1)
您可以使用OUTPUT
子句直接插入第二个表。您的SQL将类似于:
INSERT Conversions (CID, Source, Destination, Packages, CreatedBy, SourceID)
OUTPUT inserted.ID, @Status, @Comments, GETDATE()
INTO HistoricalData (ID, Status, Comments, Date)
VALUES (@CID, @Source, @Destination, @Packages, @CreatedBy, @SourceID);
但是,如果两个表之间存在外键关系,则无效。在某些情况下,我建议在插入子表之前简单地使用output子句插入临时表,但由于您只插入一行并且只访问身份字段,因此您可以使用SCOPE_IDENTITY()
:
INSERT Conversions (CID, Source, Destination, Packages, CreatedBy, SourceID)
VALUES (@CID, @Source, @Destination, @Packages, @CreatedBy, @SourceID);
INSERT HistoricalData (ID, Status, Comments, Date)
VALUES (SCOPE_IDENTITY(), @Status, @Comments, GETDATE());
N.B。在这两种情况下,我都不确定您要添加为Status
,Comment
和Date
的内容,因此使用变量和GETDATE()
,您可能需要调整此项的
另一个注意事项,我已经从SELECT
没有FROM
切换到插入的VALUES
构造函数,在重写查询时大多数情况下是第二种性质。这两种方法没有区别,虽然我发现使用VALUES
显示更好的意图,但它显示没有选择任何内容。
答案 1 :(得分:1)
如果您的数据库支持存储过程,我肯定会这样做。使用所需参数创建存储过程。像这样创建你的SqlCommand:
SqlCommand command = new SqlCommand("MyStoredProcedureName", connect);
command.CommandType=CommandType.StoredProcedure;
像在当前代码中一样传递参数。 您的数据库存储过程如下所示:
CREATE PROCEDURE MyStoredProcedureName
@CID bigint,
..... all params
AS
BEGIN
DECLARE @myNewID bigint
SET NOCOUNT ON;
Insert Into Conversions (CID, Source, Destination, Packages, CreatedBy, SourceID) VALUES (@CID, @Source, @Destination, @Packages, @CreatedBy, @SourceID)
SET @myNewID=SCOPE_IDENTITY()
-- Now you can insert what you want where you want
INSERT INTO HistoricalData (Column list...) (Values list ... @myNewID)
END
如果您没有使用Entity Framework或类似的东西,最好将数据库代码与其余代码分开。因此,当您更改表名/列名或数据库结构的任何更改时,您不必更改代码。只需更改数据库部分和存储过程即可。