dotConnect for Oracle data provider has been added to BLToolkit.
I found the following issues.
1. Milliseconds of DateTime value are truncated when DateTime is sent as a parameter.
2. Default data type for byte[] is Blob. Blobs are more restrictive than Raw.
These issues can be fixed in this way:
Code: Select all
public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
{
var value = parameter.Value;
if (value is DateTime)
{
parameter.Value = new OracleTimeStamp((DateTime)value);
}
else if (value is Guid)
{
parameter.Value = ((Guid)value).ToByteArray();
parameter.DbType = DbType.Binary;
((OracleParameter)parameter).OracleDbType = OracleDbType.Raw;
}
base.AttachParameter(command, parameter);
}
3. docConnect does not handle unicode characters properly.
The following test does not work:
Code: Select all
[Test]
public void Unicode()
{
ForEachProvider(new[] { ProviderName.Informix, ProviderName.Firebird, ProviderName.Sybase }, db =>
{
try
{
db.Person.Delete(p => p.ID > 2);
var id =
db.Person
.InsertWithIdentity(() => new Person
{
FirstName = "擊敗奴隸",
LastName = "Юникодкин",
Gender = Gender.Male
});
Assert.NotNull(id);
var person = db.Person.Single(p => p.FirstName == "擊敗奴隸" && p.LastName == "Юникодкин");
Assert.NotNull (person);
Assert.AreEqual(id, person.ID);
Assert.AreEqual("擊敗奴隸", person.FirstName);
Assert.AreEqual("Юникодкин", person.LastName);
}
finally
{
db.Person.Delete(p => p.ID > 2);
}
});
}
Output:
Code: Select all
Provider : DevartOraclePro
DbManager: -- DevartOraclePro Oracle
DELETE FROM
Person t1
WHERE
t1.PersonID > 2
DbManager: Execution time: 00:00:00.0185023. Records affected: 0.
DbManager: -- DevartOraclePro Oracle
INSERT INTO Person
(
FirstName,
LastName,
Gender
)
VALUES
(
'擊敗奴隸',
'Юникодкин',
'M'
)
RETURNING
PersonID INTO :IDENTITY_PARAMETER
DbManager: Execution time: 00:00:00.0515065
DbManager: -- DevartOraclePro Oracle
SELECT
p.PersonID as ID,
p.LastName,
p.MiddleName,
p.Gender,
p.FirstName
FROM
Person p
WHERE
ROWNUM <= 2 AND p.FirstName = '擊敗奴隸' AND p.LastName = 'Юникодкин'
DbManager: Execution time: 00:00:00.0085011
DbManager: -- DevartOraclePro Oracle
DELETE FROM
Person t1
WHERE
t1.PersonID > 2
DbManager: Execution time: 00:00:00.0005000. Records affected: 1.
String lengths are both 4. Strings differ at index 0.
Expected: "擊敗奴隸"
But was: "????"
-----------^
Russian characters are OK, Chinese are failed.