Hello All!
Собственно есть проблема с передачей массивов (PLSQLAssociativeArray — тип оракла = T_NUMBER_TABLE IS TABLE OF NUMBER) в хранимую процедуру.
есть такой код на оракле:
...
T_NUMBER_TABLE IS TABLE OF NUMBER;
...
procedure
... [More]
test(p_contract number, p_ids t_number_table)
is
begin
null;
end;
зову так:
db.SetSpCommand("test", contractNo, new long[] { 1, 2, 3 })
.ExecuteNonQuery();
а получаю:
BLToolkit.Data.DataException: Invalid parameter binding
Имя параметра: P_IDS ---> System.ArgumentException: Invalid parameter binding
Имя параметра: P_IDS
в Oracle.DataAccess.Client.OracleParameter.PreBind_Collection(OracleConnection conn)
в Oracle.DataAccess.Client.OracleParameter.PreBind(OracleConnection conn, IntPtr errCtx, Int32 arraySize)
в Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
в BLToolkit.Data.DbManager.ExecuteOperation[T](OperationType operationType, Func`1 operation)
--- Конец трассировки внутреннего стека исключений ---
в BLToolkit.Data.DbManager.OnOperationException(OperationType op, DataException ex)
в BLToolkit.Data.DbManager.HandleOperationException(OperationType op, Exception ex)
в BLToolkit.Data.DbManager.ExecuteOperation[T](OperationType operationType, Func`1 operation)
в BLToolkit.Data.DbManager.ExecuteNonQueryInternal()
в BLToolkit.Data.DbManager.ExecuteNonQuery()
что только не далал, так и не удалось выполнить сие.
Подскажите, что я делаю не так? [Less]
|
Раньше такой код работал, а в новой версии перестал:
var xs = new[] { 1, 2, 3 };
Table.Where(a => a.XS.Count(x => xs.Contains(x)) == xs.Count())
Говорит, что "cannot be converted to SQL".
|
Добрый день!
Подскажите, появилась ли возможность явно указать что необходимо загрузить сущности помеченные атрибутом Association?
Простой случай: очень хочется загрузить для Product значение в свойство Group при этом явно не перечисляя все поля
... [More]
Product, а затем указывая заполнение для Group.
// То как приходится делать сейчас:
var products = from p in db.Product
select new Product
{
Id = p.Id,
Code = p.Code,
Name = p.Name,
Created = p.Created,
GroupId = p.GroupId,
Group = p.Group
};
// Как хотелось бы (самый простой вариант):
var products = from p in db.Product
select p.Include(i => i.Group);
// если нужно загрузить более одной
var products = from p in db.Product
select p.Include(i => i.Group).Include(i => i.Group2);
// либо вместо Include допустим, пометить дополнительно свойство атрибутом, указывающим что должна произойти загрузка этого поля автоматически
Если рассматривать более сложный вариант со свойствами-коллекциями и свойствами содержащими вложенные ассоциации, имея такую иерархию(см. описание сущностей):
Product (0)--Product level
Group (0)--Product level
Orders<Order> (0)--Product level
Tag (1)--Order level
Items<Item> (1)--Order level
Tag (2)--Item level
тут можно было бы внести разумные ограничения, допустим обрабатывать ассоциации только до уровня 1 включительно.
Если на текущий момент похожих возможностей нет и в ближайшее время не предвидится(решающих хотя бы простой случай), подскажите смогу ли я написать расширения решающие данные задачи и подключить их к библиотеке чтобы не модифицировать код библиотеки.
Пример описания сущностей
[TableName("Products")]
public class Product
{
[Identity, PrimaryKey]
public int Id { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public DateTime Created { get; set; }
public int GroupId { get; set; }
[Association(ThisKey = "GroupId", OtherKey = "Id", CanBeNull = false)]
public Group Group { get; set; }
[Association(ThisKey = "Id", OtherKey = "ProductId", CanBeNull = true)]
public List<Order> Orders { get; set; }
}
[TableName("Groups")]
public class Group
{
[Identity, PrimaryKey]
public int Id { get; set; }
public string Code { get; set; }
public string Name { get; set; }
}
[TableName("Orders")]
public class Order
{
[Identity, PrimaryKey]
public int Id { get; set; }
public int ProductId { get; set; }
public int TagId { get; set; }
public int No { get; set; }
[Association(ThisKey = "Id", OtherKey = "OrderId", CanBeNull = false)]
public List<Item> Items { get; set; }
[Association(ThisKey = "TagId", OtherKey = "Id", CanBeNull = false)]
public Tag Tag { get; set; }
}
[TableName("Items")]
public class Item
{
[Identity, PrimaryKey]
public int Id { get; set; }
public int OrderId { get; set; }
public int TagId { get; set; }
public string Name { get; set; }
[Association(ThisKey = "TagId", OtherKey = "Id", CanBeNull = false)]
public Tag Tag { get; set; }
}
[TableName("Tags")]
public class Tag
{
[Identity, PrimaryKey]
public int Id { get; set; }
public string Name { get; set; }
} [Less]
|
Использую доступ к данным через режим Data.Linq.
Ткните носом (не смог найти) как в этом режиме можно вызывать хранимые процедуры на сервере как было в старом DataAccess-режиме, через объявление abstract-метода.
И можно ли такое вообще?
P.S.
... [More]
про SqlFunctionAttribute и прочее знаю, но они все используются для построения Linq-expressions. А как сделать, чтобы это выглядело именно вызовом метода? [Less]
|
Posted
over 13 years
ago
Какой подход выбрать?
использовать linq или механизм accessor'ов?
достоинства и недостатки каждого из подходов?
Спасибо
|
Posted
over 13 years
ago
есть таблица в которой есть 4 поля
три типа number і одно типа TYPE
(Type: create or replace type TYPE as object (
DOC_NUM VARCHAR2(20)
) not final)
[TableName("DOCUM")]
[DataContract]
public class Docum
{
... [More]
[DataMember]
[MapField("ID")]
[PrimaryKey, Identity]
public int Id { get; set; }
[DataMember]
[MapField("DOCUM_TYPE_ID")]
public int? DocumTypeId { get; set; }
[DataMember]
[MapField("DOCUM_DETAILS")]
public virtual TypeDocDetails TypeDocDetails { get; set; }
}
не получается считать DOCUM_DeTAILS а все остальние поля зчитиваю как
public Table<Docum> Docums
{
get
{
return this.GetTable<Docum>();
}
}
using (var db = new RFLDB())
{
var q = db.Docum;
foreach (var user in q)
{
...
}
} [Less]
|
БД Oracle. Есть таблица, колонка которой, определенного созданого в БД, типа, например:
create or replace type TMP_TYPE as object (
TMP1 VARCHAR2(20),
TMP2 NUMBER
)
Есть таблица, например с именем "TMP_TABLE" и полями: ID NUMBER, NAME
... [More]
VARCHAR2(20), FIELD_TMP_TYPE TMP_TYPE
Описываю класс этой таблицы в модели данных:
[DataContract]
[TableName("TMP_TABLE")]
class TMP_TABLE
{
[DataMember]
[PrimaryKey, Identity]
[MapField("ID")]
public int ID { get; set; }
[DataMember]
[MapField("NAME")]
public string NAME { get; set; }
[DataMember]
[MapField("FIELD_TMP_TYPE")]
public TMP_TYPE FIELD_TMP_TYPE { get; set; }
}
[DataContract]
class TMP_TYPE
{
[DataMember]
[MapField("TMP1")]
public string TMP1 { get; set; }
[DataMember]
[MapField("TMP2")]
public int TMP2 { get; set; }
}
Но при попытке вытянуть данные с этой таблицы, выскакивет ошибка мапинга для даного типа "TMP_TYPE". Как правильно его описать, чтобы заработало? Спасибо. [Less]
|
В статье описывается принятый в BLToolkit унифицированный способ передачи числовых или строковых параметров.
|
В статье описывается принятый в BLToolkit унифицированный способ передачи числовых или строковых параметров.
|
Основной понятием при работе с СУБД является таблица. Таблица представляет собой набор записей одинакового типа. Запись таблицы состоит из полей скаляных (базовых) типов.
|