我的问题是,当我运行触发firebird存储过程的C#方法时,它会添加更多的一行,大多数是2,但发生3或更多。我希望每次使用此代码时只添加一行。 当我从firebird手动运行SP时一切正常。似乎C#代码导致问题,但我不知道在哪里。
在调试期间,在我通过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
答案 0 :(得分:2)
确定。事实证明我在存储过程中犯了错误,我发现通过手动添加更多行,我发现在哪里值与我给出的参数不匹配。我猜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