gpt4 book ai didi

c# - Firebird 存储过程,从 C# 触发,插入两行或更多行,只需要一个

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:32 25 4
gpt4 key购买 nike

我的问题是,当我运行触发 firebird 存储过程的 C# 方法时,它增加了一行,大部分是 2 行,但发生了 3 行或更多行。我希望每次使用此代码只添加一行。当我从 firebird 手动运行 SP 时,一切正常。似乎 C# 代码导致问题 somwehere 但我不知道在哪里。

在调试过程中,在我通过 ft.Commit() 之后当然会插入行;

我希望我说清楚了,如果不是请问,我会尽力解释得更好。抱歉,如果代码格式不正确,我是第一次在这里写。

这是 C# 方法:

public int AddKursowka(string nrLinii, int typLinii, string kodLinii, string nazwaKwi, string txtKwi, DateTime dateStart, DateTime dateStop,
int idLinii,int idKursowki, int idTxtKursowka)
{
FbTransaction ft = null;
int _result = -1;
try
{
Connect();
{
ft = mFbConn.BeginTransaction();

using (FbCommand com = new FbCommand(
"EXECUTE PROCEDURE ADD_KURSOWKA(@NRLINII, @TYPLINII, @KODLINII, @NAZWAKWI, @TXTKWI, @DATASTART, @DATASTOP, " +
"@IDLINII, @IDKURSOWKI, @IDTXTKURSOWKA, @PRJ);", mFbConn, ft))
{
com.CommandType = CommandType.StoredProcedure;
com.Parameters.Add("@NRLINII", FbDbType.VarChar, 100).Value = nrLinii;
com.Parameters.Add("@TYPLINII", FbDbType.BigInt).Value = typLinii;
com.Parameters.Add("@KODLINII", FbDbType.VarChar, 50).Value = kodLinii;
com.Parameters.Add("@NAZWAKWI", FbDbType.VarChar, 10).Value = nazwaKwi;
com.Parameters.Add("@TXTKWI", FbDbType.VarChar, 12).Value = txtKwi;
com.Parameters.Add("@DATASTART", FbDbType.Date).Value = dateStart;//.Date;
com.Parameters.Add("@DATASTOP", FbDbType.Date).Value = dateStop;//.Date;
com.Parameters.Add("@IDLINII", FbDbType.BigInt).Value = idLinii;
com.Parameters.Add("@IDKURSOWKI", FbDbType.BigInt).Value = idKursowki;
com.Parameters.Add("@IDTXTKURSOWKA", FbDbType.BigInt).Value = idTxtKursowka;
com.Parameters.Add("@PRJ", FbDbType.VarChar, 100).Value = Variables.Instance.LastPRJ;
// 1-3 - update / 4-6 - insert
com.ExecuteScalar();// _result = (int)
}
ft.Commit();
}
Disconect();
}
catch (Exception ex) { Functionalities.WriteLog(ex); ft.Rollback(); }
finally
{
if (ft != null) ft.Dispose();
}
return _result;
}

程序如下:

    ALTER PROCEDURE ADD_KURSOWKA (
NRLINII Varchar(100),
TYPLINII Bigint,
KODLINII Varchar(50),
NAZWAKWI Varchar(10),
TXTKWI Varchar(12),
DATASTART Date,
DATASTOP Date,
IDLINII Bigint,
IDKURSOWKI Bigint,
IDTXTKURSOWKA Bigint,
PRJ Varchar(100) )
RETURNS (
RESULT Integer )
AS
DECLARE VARIABLE idKursowka BIGINT;
DECLARE VARIABLE aResult INTEGER;
DECLARE VARIABLE bResult INTEGER;
DECLARE VARIABLE txtRes BIGINT;
DECLARE VARIABLE lineRes BIGINT;
BEGIN

if(:IDKURSOWKI = -1)
then
begin
INSERT INTO KURSOWKA (TYPDNIA, KODLINII, NRBRYGADY, LICZBAKURSOW, NAZWAKWI,
NRZAJEZDNI, REZERWA, WYKLUCZENIADNIATYGODNIA, WYKLUCZENIAOKRESOWE, IDPRZEWOZNIKA,
PRJ_NAME)
VALUES(1, :KODLINII, 1, 0, :NAZWAKWI, 0, 0, 0, 0, 0, :PRJ);
idKursowka = (select max(k.IDKURSOWKA) from KURSOWKA k where k.PRJ_NAME = :PRJ);
bResult = 4;

execute procedure ADD_TXT_KURSOWKA
:IDTXTKURSOWKA, :TXTKWI, :idKursowka, :DATASTART, :DATASTOP, :PRJ
returning_values :txtRes;
RESULT = RESULT + txtRes;

execute procedure ADD_LINE_V2
:IDLINII, :NRLINII, :TYPLINII, :PRJ, :KODLINII
returning_values :lineRes;
RESULT = RESULT + lineRes;

end
else
begin
UPDATE KURSOWKA k SET k.KODLINII = :KODLINII, k.NAZWAKWI = :NAZWAKWI
WHERE k.IDKURSOWKA = :IDKURSOWKI and k.PRJ_NAME = :PRJ;
idKursowka = :IDKURSOWKI;
aResult = 1;

execute procedure ADD_TXT_KURSOWKA
:IDTXTKURSOWKA, :TXTKWI, :idKursowka, :DATASTART, :DATASTOP, :PRJ
returning_values :txtRes;
RESULT = RESULT + txtRes;

execute procedure ADD_LINE_V2
:IDLINII, :NRLINII, :TYPLINII, :PRJ, :KODLINII
returning_values :lineRes;
RESULT = RESULT + lineRes;

end
END



ALTER PROCEDURE ADD_LINE_V2 (
IDLINII Bigint,
NRLINII Varchar(100),
TYPLINII Bigint,
PRJ_NAME Varchar(100),
KOD_LINII Varchar(50) )
RETURNS (
RESULT Integer )
AS
BEGIN
if(:IDLINII = -1)
then
begin
INSERT INTO LINIE(NRLINII, TYPLINII, PRJ_NAME, KOD_LINII)
VALUES(:NRLINII, :TYPLINII, :PRJ_NAME, :KOD_LINII);
RESULT = 1;
end
else
begin
update LINIE l set l.KOD_LINII = :KOD_LINII,
l.NRLINII = :NRLINII, l.TYPLINII = :TYPLINII
where l.PRJ_NAME = :PRJ_NAME and l.IDLINII = :IDLINII;
RESULT = 2;
end
END



ALTER PROCEDURE ADD_TXT_KURSOWKA (
IDTXTKURSOWKA Bigint,
TXTKWI Varchar(12),
IDKURSOWKA Bigint,
DATASTART Date,
DATASTOP Date,
PRJ Varchar(100) )
RETURNS (
RESULT Integer )
AS
BEGIN
if(:IDTXTKURSOWKA = -1)
then
begin
INSERT INTO TXT_KURSOWKA(TXTKWI, WSKKURSOWKI, DATAPSTART,
DATAPSTOP, PRJ_NAME)
VALUES(:TXTKWI, :idKursowka, :DATASTART, :DATASTOP, :PRJ);
RESULT = 1;
end
else
begin
update TXT_KURSOWKA txt set txt.DATAPSTART = :DATASTART,
txt.DATAPSTOP = :DATASTOP,
txt.TXTKWI = :TXTKWI, txt.WSKKURSOWKI = :idKursowka
where txt.ID_TXT_KURSOWKA = :idKursowka;
RESULT = 2;
end
END

最佳答案

好的。事实证明,我在存储过程中犯了错误,我发现通过手动添加更多行,不知何故,我发现哪里的值与我作为参数给出的值不匹配。我猜 C# 代码很好。据我现在检查,它运行良好。

这是正确的代码。两个子程序有错误:

SET TERM ^ ;
ALTER PROCEDURE ADD_TXT_KURSOWKA (
IDTXTKURSOWKA Bigint,
TXTKWI Varchar(12),
IDKURSOWKA Bigint,
DATASTART Date,
DATASTOP Date,
PRJ Varchar(100) )
RETURNS (
RESULT Integer )
AS
BEGIN
if(IDTXTKURSOWKA = -1)
then
begin
INSERT INTO TXT_KURSOWKA(TXTKWI, WSKKURSOWKI, DATAPSTART,
DATAPSTOP, PRJ_NAME)
VALUES(:TXTKWI, :IDKURSOWKA, :DATASTART, :DATASTOP, :PRJ);
RESULT = 1;
end
else
begin
update TXT_KURSOWKA txt set txt.DATAPSTART = :DATASTART,
txt.DATAPSTOP = :DATASTOP,
txt.TXTKWI = :TXTKWI, txt.WSKKURSOWKI = :IDKURSOWKA
where txt.ID_TXT_KURSOWKA = :IDTXTKURSOWKA;
RESULT = 2;
end



ALTER PROCEDURE ADD_LINE_V2 (
IDLINII Bigint,
NRLINII Varchar(100),
TYPLINII Bigint,
PRJ_NAME Varchar(100),
KOD_LINII Varchar(50)
)
RETURNS
(
RESULT Integer
)
AS
BEGIN

if(IDLINII = -1)
then
begin
INSERT INTO LINIE(NRLINII, TYPLINII, PRJ_NAME, KOD_LINII)
VALUES(:NRLINII, :TYPLINII, :PRJ_NAME, :KOD_LINII);
RESULT = 1;
end
else
begin
update LINIE l set l.KOD_LINII = :KOD_LINII,
l.NRLINII = :NRLINII, l.TYPLINII = :TYPLINII
where l.PRJ_NAME = :PRJ_NAME and l.IDLINII = :IDLINII;
RESULT = 2;
end
END

关于c# - Firebird 存储过程,从 C# 触发,插入两行或更多行,只需要一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22025259/

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