我有以下问题。我在数据库中有一个序列和触发器,它们可以工作。这意味着我在C#中的插入函数不会插入ID,而是插入其余列。问题是现在我无法将ID绑定到参数。我有另一个函数,从插入后作为一种刷新的表中选择所有内容,即使该函数获得正确的ID,它仍然会丢失,我相信因为它没有绑定到类中的参数插入。 / p>
所以这是我的插入:
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显示它应该告诉我在插入中使用返回应该也能正常工作,但不是因为它仍然在那里放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();
答案 0 :(得分:0)
解决方案
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();
谢谢大家