【发布时间】:2011-10-20 04:16:52
【问题描述】:
我有一个存储过程,可以将一些行添加到表中,这是非常基本的东西。当我从 SQL Server Management Studio 中执行我的存储过程时,它返回正常。但是,当我从我的应用程序中运行它并通过 LINQ to SP 调用它时,它似乎可以很好地进入 SP,但是来自 SP 内的进程失败了。相同的参数一切看起来都完全一样。
我知道这没什么好做的,但是有人知道可能是什么原因造成的吗?
这是我的存储过程:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[sp_PTS_Action_Hardware_Batch_Insert] (
@HdwString Varchar(Max),
@UID Varchar(15)
)
as
Declare @Success_Nbr Bit
Select @Success_Nbr = 0
Declare @Success_Desc Varchar(100)
Declare @Stuff Varchar(200)
Declare @TLoc BigInt
declare @retV int
--Declare @RLoc BigInt
Declare @StartLoc BigInt
Declare @SLen BigInt
Declare @V Varchar(25)
Declare @P Varchar(50)
Declare @S Varchar(50)
Declare @L Varchar(50)
Declare @D Varchar(200)
Declare @F Varchar(4)
Declare @C Varchar(50)
Declare @M Varchar(50)
Declare @I Varchar(20)
Declare @Q Varchar(10)
/*
Declare @Req_Voucher_Number varchar(25),
Declare @Part_Number varchar(50),
Declare @Serial_Number varchar(50),
Declare @Lot_Number varchar(50),
Declare @Description varchar(200),
Declare @Federal_Class_Code varchar(4),
Declare @Unit_Of_Issue varchar(5),
Declare @Item_Code_ID int,
Declare @Unit_Price money,
Declare @Qty decimal(7, 2),
Declare @UID Varchar(15)
*/
Declare @Item_Code_ID int
Declare @Unit_Price money
Declare @Qty decimal(7, 2)
If IsNull(@HdwString,'') = ''
BEGIN
Select @Success_Desc = 'No Data Provided.'
Goto ExitProcedure
END
If IsNull(CharIndex('\t',@HdwString,1),0)= 0
BEGIN
Select @Success_Desc = 'No Delimeter Defined.'
Goto ExitProcedure
END
If IsNull(CharIndex('\r\n',@HdwString,1),0)= 0
BEGIN
Select @Success_Desc = 'No Row End Defined.'
Goto ExitProcedure
END
EXEC sp_FIX_DoubleQuotesMax @HdwString OUTPUT
/*
DECLARE @DD1149_Hdw TABLE (
[Req_Voucher_Number] [varchar](25),
[Part_Number] [varchar](50),
[Serial_Number] [varchar](50),
[Lot_Number] [varchar](50),
[Description] [varchar](200),
[Federal_Class_Code] [varchar](4),
[Item_Code_Desc] [varchar](50),
[Unit_Price] [money] NOT NULL,
[Unit_Of_Issue] [varchar](20) NOT NULL,
[Qty] [decimal](7, 2) NOT NULL
)
*/
Select @StartLoc = 1,
@SLen = Len(@HdwString),
--@RLoc = CharIndex('\r\n',@HdwString,1),
@TLoc = CharIndex('\t',@HdwString,1)
BEGIN TRANSACTION
Looper:
--End Of File?
IF @TLoc = 0
BEGIN
--Select 'This is the stub where the parsed date would then be pushed to the PTS_DD1149_Hardware table.'
goto ProcessTransaction
--Add Records To Hardware Table
/*
IF @@ERROR != 0
BEGIN
ROLLBACK TRANSACTION
Select @Success_Desc = 'There was a problem adding the hardware. No records were added.'
END
ELSE
BEGIN
COMMIT TRANSACTION
Select @Success_Desc = 'There was a problem adding the hardware. No records were added.'
END
Goto ExitProcedure
*/
END
ELSE
BEGIN
--ReqVoucher#
Select @V = Substring(@HdwString,@StartLoc,@TLoc-@StartLoc)
Select @StartLoc = @TLoc + 2
--Part#
Select @TLoc = CharIndex('\t',@HdwString,@TLoc+1)
Select @P = Substring(@HdwString,@StartLoc,@TLoc-@StartLoc)
Select @StartLoc = @TLoc + 2
--Ser#
Select @TLoc = CharIndex('\t',@HdwString,@TLoc+1)
Select @S = Substring(@HdwString,@StartLoc,@TLoc-@StartLoc)
Select @StartLoc = @TLoc + 2
--Lot#
Select @TLoc = CharIndex('\t',@HdwString,@TLoc+1)
Select @L = Substring(@HdwString,@StartLoc,@TLoc-@StartLoc)
Select @StartLoc = @TLoc + 2
--Desc
Select @TLoc = CharIndex('\t',@HdwString,@TLoc+1)
Select @D = Substring(@HdwString,@StartLoc,@TLoc-@StartLoc)
Select @StartLoc = @TLoc + 2
--Fed Code
Select @TLoc = CharIndex('\t',@HdwString,@TLoc+1)
Select @F = Substring(@HdwString,@StartLoc,@TLoc-@StartLoc)
Select @StartLoc = @TLoc + 2
--Item Code
Select @TLoc = CharIndex('\t',@HdwString,@TLoc+1)
Select @C = Substring(@HdwString,@StartLoc,@TLoc-@StartLoc)
Select @StartLoc = @TLoc + 2
--Price
Select @TLoc = CharIndex('\t',@HdwString,@TLoc+1)
Select @M = Substring(@HdwString,@StartLoc,@TLoc-@StartLoc)
Select @StartLoc = @TLoc + 2
--UOM
Select @TLoc = CharIndex('\t',@HdwString,@TLoc+1)
Select @I = Substring(@HdwString,@StartLoc,@TLoc-@StartLoc)
Select @StartLoc = @TLoc + 2
--Qty
Select @TLoc = CharIndex('\r\n',@HdwString,@TLoc+1)
Select @Q = Substring(@HdwString,@StartLoc,@TLoc-@StartLoc)
--SELECT @V, @P, @S, @L, @D, @F, @C, @M, @I, @Q
IF Not Exists(Select * From Unit_Of_Issue Where Unit_Of_Issue = @I)
IF Not Exists(Select * From Unit_Of_Issue Where UI_Description = @I)
BEGIN
ROLLBACK TRANSACTION
Goto ExitProcedure
END
ELSE
Select @I = Unit_Of_Issue From Unit_Of_Issue Where UI_Description = @I
IF Not Exists(Select * From PTS_Item_Codes Where Item_Code = @C)
BEGIN
ROLLBACK TRANSACTION
Goto ExitProcedure
END
ELSE
Select @Item_Code_ID = Item_Code_ID From PTS_Item_Codes Where Item_Code = @C
IF @@ERROR != 0
BEGIN
ROLLBACK TRANSACTION
Goto ExitProcedure
END
Select @Unit_Price = Convert(Money,@M), @Qty = Convert(decimal(7,2),@Q)
IF @@ERROR != 0
BEGIN
ROLLBACK TRANSACTION
Goto ExitProcedure
END
--Select 5, @V, @P, @S, @L, @D, @F, @M, @Item_Code_ID, @Unit_Price, @Qty, @UID
exec @retV = sp_PTS_Action_DD1149_Insert_Hardware_No_RecSet @V, @P, @S, @L, @D, @F, @I, @Item_Code_ID, @Unit_Price, @Qty, @UID
IF @retV != 1
BEGIN
ROLLBACK TRANSACTION
Goto ExitProcedure
END
--Add To Table
--INSERT @DD1149_Hdw
--SELECT @V, @P, @S, @L, @D, @F, @C, @M, @I, @Q
--Testing
--Select * from @DD1149_Hdw
--Select @V, @P, @S, @L, @D, @F, @C, @M, @I, @Q
--Reset Variables
Select @StartLoc = @TLoc + 4,
--@RLoc = CharIndex('\r\n',@HdwString,@TLoc+3),
@TLoc = CharIndex('\t',@HdwString,@TLoc+3),
@V = NULL,
@P = NULL,
@S = NULL,
@L = NULL,
@D = NULL,
@F = NULL,
@C = NULL,
@M = NULL,
@I = NULL,
@Q = NULL,
@Unit_Price = NULL,
@Qty = NULL,
@retV = NULL
END
Goto Looper
ProcessTransaction:
COMMIT TRANSACTION
Select @Success_Nbr = 1
ExitProcedure:
If @Success_Nbr = 0
Select Convert(Varchar(7),'Failed') as Success_Desc
Else
Select Convert(Varchar(7),'Success') as Success_Desc
--Select @Success_Nbr as Success_Nbr
/*
Select @Success_Nbr as Success_Nbr,
@Success_Desc as Success_Desc,
*
From @DD1149_Hdw
*/
【问题讨论】:
-
它是如何失败的?什么错误?
-
当您从 LINQ-to-SQL 执行它时,您是否收到任何错误、消息、任何内容??
-
最后我发现了一个错误,我花了一段时间才找到它,但它看起来像一个 Fk 约束。我猜我的 DBML 不一样,所以我要试试。
-
这里出现错误:“INSERT 语句与 FOREIGN KEY 约束“FK_PTS_DD1149_Hardware_PTS_DD1149”冲突。冲突发生在数据库“OneEVAHdw”、表“dbo.PTS_DD1149”、列“Req_Voucher_Number”中。”
-
DBML 更新不影响它。但是我在管理工作室中运行完全相同的 exec 并且它可以工作,但是如果我尝试使用 LINQ 从我的项目中运行它,它会抛出该错误。