gpt4 book ai didi

c# - SCOPE_IDENTITY() 总是返回 0

转载 作者:行者123 更新时间:2023-11-30 19:46:24 27 4
gpt4 key购买 nike

我的存储过程是:

ALTER PROCEDURE [dbo].[Insert_QuickLabDump]
@Specimen_ID [varchar](50),
@Client_Key int,
@Outcome [varchar](50),
@Medications [varchar] (max),
@Date_Collected date,
@Time_Collected time(0) ,
@Date_Entered date,
@Time_Entered time(0) ,
@Date_Completed date,
@Time_Completed time(0) ,
@Test_Date date ,
@Test_Time time(0) ,

@Practice_Name [varchar] (500),
@Practice_Code [varchar] (500),
@Client_ID [varchar] (500),
@Requesting_Physician [varchar] (500),
@Other_Medications [varchar] (max),
@Order_Comments [varchar] (max),
@Reference_Number [varchar] (500),
@Order_Count int,
@lastrecord INT OUTPUT

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

INSERT INTO [SalesDWH].[dbo].[QuickLabDump]
([Specimen ID]
,[Client Key]
,[Outcome]
,[Medications]
,[Date Collected],
[Time Collected] ,[Date Entered] ,
[Time Entered] ,
[Date Completed] ,
[Time Completed] ,
[Test Date] ,
[Test Time] ,


[Practice Name]
,[Practice Code]
,[Client ID]
,[Requesting Physician]
,[Other Medications]
,[Order Comments]
,[Reference Number]
,[Order Count])
VALUES
(@Specimen_ID,
@Client_Key,
@Outcome,
@Medications,
@Date_Collected ,
@Time_Collected ,
@Date_Entered,
@Time_Entered ,
@Date_Completed ,
@Time_Completed,
@Test_Date ,
@Test_Time,
@Practice_Name,
@Practice_Code,
@Client_ID,
@Requesting_Physician,
@Other_Medications,
@Order_Comments,
@Reference_Number,
@Order_Count
);
select @lastrecord = scope_identity();
END

出于某种原因,它每次都返回 0。

我是这样执行的:

public static int Insert_QuickLabDump(QuickLabDump dump)
{
try
{
DbConnection cn = GetConnection2();
cn.Open();

// stored procedure
DbCommand cmd = GetStoredProcCommand(cn, "Insert_QuickLabDump");
DbParameter param;

param = CreateInParameter("Specimen_ID", DbType.String);
param.Value = dump.Specimen_ID;
cmd.Parameters.Add(param);

..... (lots more parameters - same method) ......

param = CreateOutParameter("lastrecord", DbType.Int32);

cmd.Parameters.Add(param);

// execute
int id=cmd.ExecuteScalar().ToInt();
return id;

if (cn.State == ConnectionState.Open)
cn.Close();
}
catch (Exception e)
{
throw e;
}
}

我做错了什么?

最佳答案

看起来您正在使用 ExecuteScalar() 而不是查看输出参数来获取标识。执行后查看输出参数的值,或选择 SCOPE_IDENTITY() 作为查询结果。

这是一个应该与 ExecuteScalar() 一起使用的简单示例:

CREATE PROCEDURE dbo.QuickExample

@Name VARCHAR( 50 )

AS

INSERT INTO dbo.MyTable( Name )
VALUES( @Name );

SELECT SCOPE_IDENTITY();

GO

以下是创建带有输出参数的存储过程的方法:

CREATE PROCEDURE dbo.QuickExample

@Name VARCHAR( 50 ),
@Id INT OUTPUT

AS

INSERT INTO dbo.MyTable( Name )
VALUES( @Name );

SET @Id = SCOPE_IDENTITY();

GO

如果使用输出参数,则在调用存储过程时必须将其指定为一个。调用存储过程后,参数将填充存储过程中设置的值。

关于c# - SCOPE_IDENTITY() 总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8633821/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com