The environment:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
Devart.Data.Oracle version 6.10.126.0
Devart.Data.Oracle.Linq version 2.20.17.0
Devart.Data.Linq version 2.20.17.0
.NET 4 Framework
I've broken the issue down to a small sample table:
CREATE TABLE TEST
(
NAME2 VARCHAR2(256 CHAR) NOT NULL,
ID NUMBER NOT NULL --INDEX ADDED TO CREATE PK
)
-- ID column is populated with this sequence, add it functions properly
CREATE SEQUENCE SEQ_TEST
START WITH 1
MAXVALUE 999999999999999999999999999
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER;
LinqToOracle is producing different errors depending on the "Update Check" setting of the Name2 field in my "Test" entity.
If I set the Test.Name2 property to Update Check = "Always" the following code fails on the 3rd SubmitChanges() call:
Code: Select all
var dx = new DbContext.ObjectDataContext();
var ut = new ObjectContext.Test();
ut.Name2 = "Test";
dx.Tests.InsertOnSubmit( ut );
var ut2 = new ObjectContext.Test();
ut2.Name2 = "Test 2";
dx.Tests.InsertOnSubmit( ut2 );
dx.SubmitChanges();
var id = ut2.Id;
ut2 = null;
var ut3 = dx.Tests.First( x => x.Id == id );
ut3.Name2 = "Test 3";
Console.WriteLine( ut3.Name2 );
dx.SubmitChanges(); // ERRORS HERE
INSERT INTO DB_TESTING.TEST (NAME2, ID) VALUES (:p1, :p2) RETURNING ID INTO :ret1
-- p1: Input VarChar (Size = 4; DbType = String) [Test]
-- p2: Input Number (Size = 0; DbType = Decimal) [33]
-- ret1: Output Number (Size = 0; DbType = Decimal) []
-- Context: Devart.Data.Oracle.Linq.Provider.OracleDataProvider Model: ao Build: 2.20.17.0
INSERT INTO DB_TESTING.TEST (NAME2, ID) VALUES (:p1, :p2) RETURNING ID INTO :ret1
-- p1: Input VarChar (Size = 6; DbType = String) [Test 2]
-- p2: Input Number (Size = 0; DbType = Decimal) [34]
-- ret1: Output Number (Size = 0; DbType = Decimal) []
-- Context: Devart.Data.Oracle.Linq.Provider.OracleDataProvider Model: ao Build: 2.20.17.0
SELECT t1.NAME2, t1.ID
FROM (
SELECT t2.NAME2, t2.ID, ROWNUM AS "rnum"
FROM DB_TESTING.TEST t2
WHERE t2.ID = :p0
) t1
WHERE t1."rnum" x.Id == id );
ut3.Name2 = "Test 3";
Console.WriteLine( ut3.Name2 );
dx.SubmitChanges(); // NO ERROR [/code]
INSERT INTO DB_TESTING.TEST (NAME2, ID) VALUES (:p1, :p2) RETURNING ID INTO :ret1
-- p1: Input VarChar (Size = 4; DbType = String) [Test]
-- p2: Input Number (Size = 0; DbType = Decimal) [39]
-- ret1: Output Number (Size = 0; DbType = Decimal) []
-- Context: Devart.Data.Oracle.Linq.Provider.OracleDataProvider Model: ao Build: 2.20.17.0
INSERT INTO DB_TESTING.TEST (NAME2, ID) VALUES (:p1, :p2) RETURNING ID INTO :ret1
-- p1: Input VarChar (Size = 6; DbType = String) [Test 2]
-- p2: Input Number (Size = 0; DbType = Decimal) [40]
-- ret1: Output Number (Size = 0; DbType = Decimal) []
-- Context: Devart.Data.Oracle.Linq.Provider.OracleDataProvider Model: ao Build: 2.20.17.0
SELECT t1.NAME2, t1.ID
FROM (
SELECT t2.NAME2, t2.ID, ROWNUM AS "rnum"
FROM DB_TESTING.TEST t2
WHERE t2.ID = :p0
) t1
WHERE t1."rnum" x.Id == id );
ut3.Name2 = "Test 3";
ut3.Name3 = "New Test 3";
Console.WriteLine( ut3.Name2 );
dx.SubmitChanges(); [/code]
INSERT INTO DB_TESTING.TEST (NAME2, NAME3, ID) VALUES (:p1, :p2, :p3) RETURNING ID INTO :ret1
-- p1: Input VarChar (Size = 4; DbType = String) [Test]
-- p2: Input VarChar (Size = 8; DbType = String) [New Test]
-- p3: Input Number (Size = 0; DbType = Decimal) [42]
-- ret1: Output Number (Size = 0; DbType = Decimal) []
-- Context: Devart.Data.Oracle.Linq.Provider.OracleDataProvider Model: ao Build: 2.20.17.0
Message: Error on executing DbCommand.
StackTrace: at Devart.Data.Linq.LinqCommandExecutionException.CanThrowLinqCommandExecutionException(String message, Exception e)
at Devart.Data.Linq.Provider.DataProvider.ExecuteQuery(String commandText, List`1 resultsetParameters, IList`1 parameters, Boolean isBatch, IDbCommand& dbCommand)
at Devart.Data.Linq.h.a(SubmitCommand A_0, SubmitCommandBuilder A_1)
at Devart.Data.Linq.r.a(SubmitedObject A_0, SubmitCommand A_1, SubmitCommandBuilder A_2)
at Devart.Data.Linq.s.a(l A_0, ad A_1, Object A_2, Boolean A_3)
at Devart.Data.Linq.y.a(s A_0, ad A_1, Boolean A_2)
at Devart.Data.Linq.y.a(DataContext A_0, ConflictMode A_1)
at Devart.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at Devart.Data.Linq.DataContext.SubmitChanges()
at LinqToOracleSample1.Program.Main(String[] args) in C:\Users\cwagner\documents\visual studio 2010\Projects\LinqToOracleSample1\LinqToOracleSample1\Program.cs:line 29
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException.Message: ORA-01461: can bind a LONG value only for insert into a LONG column
InnerException.StackTrace: at Devart.Data.Oracle.a0.b(Int32 A_0)
at Devart.Data.Oracle.a2.a(Int32 A_0, bj A_1)
at Devart.Data.Oracle.OracleCommand.InternalExecute(CommandBehavior behavior, IDisposable disposable, Int32 startRecord, Int32 maxRecords, Boolean nonQuery)
at Devart.Common.DbCommandBase.ExecuteDbDataReader(CommandBehavior behavior, Boolean nonQuery)
at Devart.Common.DbCommandBase.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
at Devart.Data.Linq.Provider.DataProvider.ExecuteQuery(String commandText, List`1 resultsetParameters, IList`1 parameters, Boolean isBatch, IDbCommand& dbCommand)
Can you please help me resolve this issue ASAP? My company is looking into purchasing the dotConnect for Oracle Professional Team license but without a resolution to this core functionality I'm afraid we will have to look for another solution.