Transaktionsanzahl Ausnahme in vb.net (SQL Exception)
-
05-07-2019 - |
Frage
Ich erhalte unter Ausnahme, wenn ich Rekord durch StoredProceduer von Sqlserver in einer Tabelle eingeben werde Ich habe ein Feld, das i u unmittelbar nach dem Einsatz neuer Datensatz in der Tabelle aktualisieren müssen. dafür habe ich eine sotredprocedure in dem Einsatzbefehl i zuerst und danach schrieb ich schrieb für gleiche ein Update-Befehl recored aber es gab mir folgenden Fehler SQLException: Transaktionsanzahl nach EXECUTE zeigt eine unpassende Anzahl von BEGIN und COMMIT-Anweisungen. Vorherige count = 1, aktuelle Zählung = 2. Commit-Transaktion wird am Ende des Charge erfaßt. Die Transaktion zurückgerollt. Einige Fehler in gespeicherten Prozedur Ausführung
habe ich versucht, in einer anderen Art und Weise auch wie: i insert-Befehl nur in StoredProcedure schrieb, und ich erstellt einen Trigger Afterinsert in dem ich Update-Befehl am Brennen. aber immer noch ich bin vor über Ausnahme
Details: Tabellenstruktur:
CREATE TABLE [dbo].[TabStoreGRNMaster](
[pk_grnm_id] [bigint] IDENTITY(1,1) NOT NULL,
[fk_col_id] [bigint] NULL,
[fk_sup_id] [bigint] NULL,
[grnm_grnno] [varchar](50) NULL,
[grnm_date] [nvarchar](10) NULL,
[grnm_partyinvno] [varchar](50) NULL,
[grnm_invdate] [nvarchar](10) NULL,
[grnm_freight] [numeric](7, 2) NULL,
[grnm_otherchrg] [numeric](7, 2) NULL,
[grnm_roundoff] [bit] NULL,
[Fk_User_Id] [bigint] NULL,
[grnm_EntryDate] [nvarchar](8) NULL,
CONSTRAINT [PK_TabStoreGRNMaster] PRIMARY KEY CLUSTERED
(
[pk_grnm_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
StoredProcedure:
USE [Kollege]
GO
/****** Object: StoredProcedure [dbo].[StoreGRNMaster] Script Date: 11/27/2009 10:20:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[StoreGRNMaster]
(
@pk_grnm_id [bigint] output ,
@fk_col_id [bigint] = 0 ,
@fk_sup_id [bigint] = 0 ,
@grnm_grnno [varchar](50) = '',
@grnm_date [nvarchar](10) = null,
@grnm_partyinvno [varchar](50) = '',
@grnm_invdate [nvarchar](10) = null,
@grnm_freight [numeric] = 0 ,
@grnm_otherchrg [numeric] = 0 ,
@grnm_roundoff [bit] = 0 ,
@Fk_User_Id [bigint] = 0 ,
@grnm_EntryDate [nvarchar](8) = null,
@opt [BIGINT] =0,
@del [bit] =0
)
as
begin
SET NOCOUNT ON;
BEGIN TRY
begin transaction
if isnull(@opt,0) = 0 begin
INSERT INTO TabStoreGRNMaster
(
fk_col_id,
fk_sup_id,
grnm_grnno,
grnm_date,
grnm_partyinvno,
grnm_invdate,
grnm_freight,
grnm_otherchrg,
grnm_roundoff,
Fk_User_Id,
grnm_EntryDate
)
VALUES
(
@fk_col_id,
@fk_sup_id,
@grnm_grnno,
@grnm_date,
@grnm_partyinvno,
@grnm_invdate,
@grnm_freight,
@grnm_otherchrg,
@grnm_roundoff,
@Fk_User_Id,
@grnm_EntryDate
)
set @pk_grnm_id = @@identity
end
else
begin
if @del = 0
UPDATE TabStoreGRNMaster
SET
fk_col_id = @fk_col_id,
fk_sup_id = @fk_sup_id,
grnm_grnno = @grnm_grnno,
grnm_date = @grnm_date,
grnm_partyinvno = @grnm_partyinvno,
grnm_invdate = @grnm_invdate,
grnm_freight = @grnm_freight,
grnm_otherchrg = @grnm_otherchrg,
grnm_roundoff = @grnm_roundoff,
Fk_User_Id = @Fk_User_Id,
grnm_EntryDate = @grnm_EntryDate
WHERE
(
pk_grnm_id = @opt
)
if @del=1 and isnull(@opt,0) <> 0
DELETE from [TabStoreGRNMaster]
WHERE
( [pk_grnm_id] = @opt)
end
commit transaction
END TRY
BEGIN CATCH
raiserror ('Some Error in stored procedure execution',1,1)
END CATCH;
END
Trigger:
alter TRIGGER TGRStoreGRNMasterCode
ON tabStoreGRNMaster
AFTER INSERT
AS
begin
declare @pk varchar(10)
declare @colcode varchar(10)
declare @current_session varchar(20)
declare @colid bigint
set @pk = (select pk_grnm_id from Inserted)
--set @colid = (select fk_col_id from Inserted)
set @colcode= 'jiet'--(select col_code from tabcollegemaster where pk_col_id =5) (when i replace word 'Jiet' with commented qry i gets sql exception otherwise its working fine)
select @current_session = Ses_abbrev from TabAcaSessionMast where ses_current = 1
--update tabStoreGRNMaster set grnm_grnno= @colcode +'/' +@current_session+ '/' + @pk where pk_grnm_id=convert(bigint,@pk)
update tabStoreGRNMaster set grnm_grnno= (select col_code from tabcollegemaster where pk_col_id=5) +'/' +@current_session+ '/' + @pk where pk_grnm_id=convert(bigint,@pk)
end
Lösung
Ihr Beitrag zu einer anderen Antwort erwähnt: „Ich bin Transaktionen von Vb.net halten auch während diese gespeicherte Prozedur aufrufen“. Dies ist die Ursache
Sie müssen Ihre TRAN balancieren BEGIN und COMMIT / Rollbacks so @@ TRANCOUNT beginnt und endet mit dem gleichen Wert für den gleichen Umfang.
Entweder tun sie alle in der gespeicherten proc oder tun es alle in der Client
Andere Tipps
Es scheint mir, wie du bist nicht mit der offenen Transaktion etwas zu tun, wenn ein Fehler in Ihrem TRY-Block gefunden wird - das würde COMMIT nicht ausgeführt, aber Ihr CATCH-Block keine ROLLBACK hat
.