【问题标题】:How to get the sequence/trigger primary key that is inserted into the database and insert it into my class parameter id C#如何获取插入数据库的序列/触发主键并将其插入我的类参数 id C#
【发布时间】:2012-10-08 14:15:26
【问题描述】:

我有以下问题。我在数据库中有一个序列和触发器,它们可以工作。这意味着我在 C# 中的插入函数不会插入 ID,而是插入其余列。问题是现在我无法将 ID 绑定到参数。我有另一个函数,它从插入后命中的表中选择所有内容作为一种刷新,即使该函数获得正确的 ID,它仍然会在以后丢失,我相信因为它在插入时没有绑定到类中的参数。

这是我的插入:

 transaction = oleCon.BeginTransaction();
                    oleComd = new OleDbCommand();
                    oleComd.Connection = oleCon;
                    oleComd.Transaction = transaction;
                    oleComd.CommandText = "Insert into OBJEKTI" +
                    "(NAZIV_OBJEKTA, SIFRA_MJESTA, SIFRA_REGION)" + "Values(:naziv, :mjesto, :region)";


                    oleComd.Parameters.AddWithValue(":naziv",  objekti.NazivObjekta);
                    oleComd.Parameters.AddWithValue(":mjesto", objekti.Sifra_Mjesta);
                    oleComd.Parameters.AddWithValue(":region", objekti.Sifra_Region);



                    oleComd.ExecuteNonQuery();
                    transaction.Commit();

                    oleCon.Close();

这是我的触发器:

create or replace
TRIGGER "OBJEKTI_ID_TRIG"
BEFORE INSERT ON "OBJEKTI"

FOR EACH ROW
DECLARE

BEGIN 

SELECT OBJEKAT_ID_SEQ.NEXTVAL
INTO :NEW.OBJEKAT_ID
FROM DUAL;

END;

无论如何,我真的希望你们能帮助我。

我刚才也尝试了 RETURNING 语句,但即使它编译并通过没有错误,它仍然给我的密钥为 0(即使在数据库中它不是,我检查了)

oleComd.CommandText = "Insert into OBJEKTI" +
                    "(NAZIV_OBJEKTA, SIFRA_MJESTA, SIFRA_REGION)" + "Values(:naziv, :mjesto, :region) RETURNING (OBJEKAT_ID) into (:id)";


                    oleComd.Parameters.AddWithValue(":naziv",  objekti.NazivObjekta);
                    oleComd.Parameters.AddWithValue(":mjesto", objekti.Sifra_Mjesta);
                    oleComd.Parameters.AddWithValue(":region", objekti.Sifra_Region);
                    oleComd.Parameters.AddWithValue(":id", objekti.ObjekatId);

编辑:

我测试了这段代码:

set serveroutput ON;
DECLARE
varid NUMBER;

BEGIN

Insert into OBJEKTI (NAZIV_OBJEKTA, SIFRA_MJESTA, SIFRA_REGION) Values('dino', 1, 1)
RETURNING OBJEKAT_ID INTO varid;

dbms_output.put_line (varid);

END;

这很有效,varid 显示了它应该做什么,这告诉我在我的 insert into 中使用返回也应该有效,但这不是因为它仍然在那里放一个 0。

所以问题必须是

OleComd.Parameters.AddWithValue 

函数,但我不知道要使用什么其他函数来使它工作。

EDIT2:

所以在 Oracle 论坛的一些帮助下,我也尝试了这个:

oleComd.CommandText = "Insert into OBJEKTI" +
                    "(NAZIV_OBJEKTA, SIFRA_MJESTA, SIFRA_REGION)" + " Values(:naziv, :mjesto, :region ) RETURNING OBJEKAT_ID INTO :id";


                    oleComd.Parameters.AddWithValue(":naziv",  objekti.NazivObjekta);
                    oleComd.Parameters.AddWithValue(":mjesto", objekti.Sifra_Mjesta);
                    oleComd.Parameters.AddWithValue(":region", objekti.Sifra_Region);
                    //oleComd.Parameters.Add(":id", OleDbType.).Direction = ParameterDirection.Output;
                    OleDbParameter id = new OleDbParameter();
                       id.ParameterName = "id";
            id.OleDbType = OleDbType.Integer;
            id.Direction = ParameterDirection.Output;
            oleComd.Parameters.Add(id);
            objekti.ObjekatId = Convert.ToInt32(id.Value);

但我又一次无处可去。它将参数 id 的值报告为 null。我不明白。

希望有人能提供帮助

EDIT3

我最近的尝试,失败并在阅读器上显示错误:“行/列上不存在数据”

 transaction = oleCon.BeginTransaction();
                    oleComd = new OleDbCommand();

                    oleComd.Connection = oleCon;

                    oleComd.Transaction = transaction;

                    oleComd.CommandText = "Insert into OBJEKTI" +
                    "(NAZIV_OBJEKTA, SIFRA_MJESTA, SIFRA_REGION)" + " Values(:naziv, :mjesto, :region )";


                    oleComd.Parameters.AddWithValue(":naziv",  objekti.NazivObjekta);
                    oleComd.Parameters.AddWithValue(":mjesto", objekti.Sifra_Mjesta);
                    oleComd.Parameters.AddWithValue(":region", objekti.Sifra_Region);

                    oleComd.ExecuteNonQuery();
                    transaction.Commit();
                    //oleCon2.Open();
                    transaction2 = oleCon.BeginTransaction();
                    oleComd2 = new OleDbCommand();
                    oleComd2.Connection = oleCon;
                    oleComd2.Transaction = transaction2;

                    oleComd2.CommandText = "select Objekat_ID from OBJEKTI where NAZIV_OBJEKTA=:naziv";
                    oleComd2.Parameters.AddWithValue(":naziv", objekti.NazivObjekta);

                    OleDbDataReader Reader = oleComd2.ExecuteReader();
                    objekti.ObjekatId = Convert.ToInt32(Reader["OBJEKAT_ID"]);
                    Reader.Close();
                    oleComd2.ExecuteNonQuery();
                    transaction2.Commit();

【问题讨论】:

    标签: c# visual-studio-2010 plsql


    【解决方案1】:

    解决办法

    OleDbParameter id = new OleDbParameter();
                        id.ParameterName = "id";
                        id.OleDbType = OleDbType.Integer;
                        id.Direction = ParameterDirection.ReturnValue;
                        oleComd.Parameters.Add(id);
                        oleComd.ExecuteNonQuery();
                        transaction.Commit();
                        objekti.ObjekatId=Convert.ToInt32(oleComd.Parameters["id"].Value);
    
                        oleCon.Close();
    

    谢谢大家

    【讨论】:

      猜你喜欢
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 2020-05-31
      相关资源
      最近更新 更多