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

时间:2014-02-25 20:19:55

标签: c# sql stored-procedures firebird

我的问题是,当我运行触发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

1 个答案:

答案 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