c#存储过程范围#标识
我有一个SQL Server存储过程,它在中插入一个c#存储过程范围#标识,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我有一个SQL Server存储过程,它在中插入一个 我正试图输入插入行的ID 我无法调试,所以我不知道错误在哪里 该行完全添加到数据库中,但它总是捕获异常,并且不会返回ID 存储过程 USE [DatabaseAzerty] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[addLog] -- Add the parameters for the stored procedure h
我正试图输入插入行的ID
我无法调试,所以我不知道错误在哪里
该行完全添加到数据库中,但它总是捕获异常,并且不会返回ID
存储过程
USE [DatabaseAzerty]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[addLog]
-- Add the parameters for the stored procedure here
@table varchar(max),
@date date,
@version varchar(max),
@process varchar(max),
@level varchar(max),
@message varchar(max),
@stacktrace varchar(max),
@user varchar(max),
@environmentID varchar(max),
@UUID varchar(max),
@UDID varchar(max),
@transactionID int,
@new_identity int OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
-- DECLARE @sql NVARCHAR(MAX);
-- SET @sql = 'INSERT INTO dbo.' + @table + '([Timestamp], [Version],Process,[Level],[Message],StackTrace,[User],EnvironmentID,UUID,UDID,TransactionID) VALUES (' + CAST(@date AS VARCHAR(MAX)) + ',' + @version + ',' + @process + ','+ @level + ','+ @message + ','+ @stacktrace + ','+ @user + ','+ @environmentID + ','+ @UUID + ','+ @UDID + ',' + @transactionID + ')'
--EXEC @sql
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = ' INSERT INTO dbo.' + @Table;
SET @SQL += ' ([Timestamp], [Version],Process,[Level],[Message],StackTrace,[User],EnvironmentID,UUID,UDID,TransactionID)';
SET @SQL += ' VALUES';
SET @SQL += ' (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10);';
EXECUTE sp_executesql
@SQL
, N'@p0 DATE, @p1 VARCHAR(MAX), @p2 VARCHAR(MAX), @p3 VARCHAR(MAX), @p4 VARCHAR(MAX), @p5 VARCHAR(MAX), @p6 VARCHAR(MAX), @p7 VARCHAR(MAX), @p8 VARCHAR(MAX), @p9 VARCHAR(MAX), @p10 int'
, @p0 = @date
, @p1 = @version
, @p2 = @process
, @p3 = @level
, @p4 = @message
, @p5 = @stacktrace
, @p6 = @user
, @p7 = @environmentID
, @p8 = @UUID
, @p9 = @UDID
, @p10 = @transactionID;
SELECT @new_identity = CAST(SCOPE_IDENTITY() AS INT);
END
C#
使用最后重试:
int returnedID = 0;
//.....
try
{
cmd.ExecuteNonQuery();
}
finally
{
int returnedID = Convert.ToInt32(cmd.Parameters["@new_identity"].Value);
}
确保SQL中的参数@new_identity声明输出。
在设置返回ID之前关闭连接
考虑使用@ @ IsIs/P>< P>您需要将输出参数传递给动态SQL ./P>
ALTER PROCEDURE [dbo].[addLog]
-- Add the parameters for the stored procedure here
@table SYSNAME, --<-- use SYSNAME data type for Sql Server objects
@date date,
@version varchar(max),
@process varchar(max),
@level varchar(max),
@message varchar(max),
@stacktrace varchar(max),
@user varchar(max),
@environmentID varchar(max),
@UUID varchar(max),
@UDID varchar(max),
@transactionID int,
@new_identity int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N' INSERT INTO dbo.' + QUOTENAME(@Table) --<-- use QUOTENAME function here (Sql Injection protection)
+ N' ([Timestamp], [Version],Process,[Level],[Message]
,StackTrace,[User],EnvironmentID,UUID,UDID,TransactionID)'
+ N' VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10) '
+ N' SELECT @new_identity = SCOPE_IDENTITY(); ' --<-- Capture Identity value here
EXECUTE sp_executesql
@SQL
, N'@p0 DATE, @p1 VARCHAR(MAX), @p2 VARCHAR(MAX), @p3 VARCHAR(MAX)
, @p4 VARCHAR(MAX), @p5 VARCHAR(MAX), @p6 VARCHAR(MAX), @p7 VARCHAR(MAX)
, @p8 VARCHAR(MAX), @p9 VARCHAR(MAX), @p10 int, @new_identity INT OUTPUT'
, @p0 = @date
, @p1 = @version
, @p2 = @process
, @p3 = @level
, @p4 = @message
, @p5 = @stacktrace
, @p6 = @user
, @p7 = @environmentID
, @p8 = @UUID
, @p9 = @UDID
, @p10 = @transactionID
, @new_identity = @new_identity OUTPUT
END
ALTER过程[dbo].[addLog]
--在此处添加存储过程的参数
@表SYSNAME,--您能显示完整的addLog sp吗?无论是在C#还是在T-SQL中,所有的过程AddConcatenating语句都是一个非常糟糕的主意。您将自己暴露在SQL注入攻击和失败中,这仅仅是因为有人键入了一个“
,而代码很难维护。在连接语句中可能有一个类型,如果不实际分析结果语句,则无法找到该类型。尽管在本例中,您似乎没有传递任何必需的参数。C#代码完成了吗?还是删除了参数赋值?我在请求帮助后使用了此过程,此解决方案对我有效。我删除了所有带参数的赋值,很抱歉没有提及一个失败的查询将不会返回任何数据现在我已经清理了你的代码,里面有太多不必要的东西:)必须将参数号14和后续参数作为'@name=value'传递
ALTER PROCEDURE [dbo].[addLog]
-- Add the parameters for the stored procedure here
@table SYSNAME, --<-- use SYSNAME data type for Sql Server objects
@date date,
@version varchar(max),
@process varchar(max),
@level varchar(max),
@message varchar(max),
@stacktrace varchar(max),
@user varchar(max),
@environmentID varchar(max),
@UUID varchar(max),
@UDID varchar(max),
@transactionID int,
@new_identity int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N' INSERT INTO dbo.' + QUOTENAME(@Table) --<-- use QUOTENAME function here (Sql Injection protection)
+ N' ([Timestamp], [Version],Process,[Level],[Message]
,StackTrace,[User],EnvironmentID,UUID,UDID,TransactionID)'
+ N' VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10) '
+ N' SELECT @new_identity = SCOPE_IDENTITY(); ' --<-- Capture Identity value here
EXECUTE sp_executesql
@SQL
, N'@p0 DATE, @p1 VARCHAR(MAX), @p2 VARCHAR(MAX), @p3 VARCHAR(MAX)
, @p4 VARCHAR(MAX), @p5 VARCHAR(MAX), @p6 VARCHAR(MAX), @p7 VARCHAR(MAX)
, @p8 VARCHAR(MAX), @p9 VARCHAR(MAX), @p10 int, @new_identity INT OUTPUT'
, @p0 = @date
, @p1 = @version
, @p2 = @process
, @p3 = @level
, @p4 = @message
, @p5 = @stacktrace
, @p6 = @user
, @p7 = @environmentID
, @p8 = @UUID
, @p9 = @UDID
, @p10 = @transactionID
, @new_identity = @new_identity OUTPUT
END