Порядок полей в #region IBinarySerialize - PullRequest
1 голос
/ 01 октября 2019

Я создал IBinarySerialize регион, чтобы создать свой CLR для моего пользовательского агрегата. Я пытаюсь скопировать свою функцию XIRR в C #, чтобы узнать, как работать с CLR. Я поставил «Запись» и «Чтение» в том же порядке, но при попытке сборки получаю сообщение об ошибке:

Код серьезности Описание Состояние подавления строки файла проекта
Ошибка CS1503 Аргумент 1: невозможно преобразовать из 'System. Data.SqlTypes.SqlDateTime 'to' bool 'CustomAggregates D: \ Transfer \ CustomSqlAggregates \ CustomAggregates \ XIRR.cs 255 Active

Ошибка поступает из раздела записи.

Кажется, я не могу найти то, что мне не хватает в этой схеме, после нескольких примеров, которые я видел в примерах. Вот get / set для структуры

[Serializable]
[SqlUserDefinedAggregate(
    Format.Native,
    IsInvariantToDuplicates = false, // Receiving the same value again changes the result
    IsInvariantToNulls = false,      // Receiving a NULL value changes the result
    IsInvariantToOrder = true,      // The order of the values affects the result
    IsNullIfEmpty = true,            // If no values are given the result is null
    MaxByteSize = -1,                // Maximum size of the aggregate instance. -1 represents a value larger than 8000 bytes, up to 2 gigabytes
    Name = "XIRR"             // Name of the aggregate
    )]
public struct XIRR : IBinarySerialize
{

    /// <summary>
    /// Used to store the product
    /// </summary>
    public SqlDouble Result { get; private set; }
    public SqlDouble Cashflow { get; private set; }
    public SqlDateTime CashflowDateTime { get; private set; }
    public bool HasValue { get; private set; }
    public List<CashItem> CashFlows { get; private set;}

    ...

    #region IBinarySerialize
    /// <summary>
    /// Writes the values to the stream in order to be stored
    /// </summary>
    /// <param name="write">The BinaryWriter stream</param>
    public void Write(System.IO.BinaryWriter write)
    {
        write.Write(Result);
        write.Write(Cashflow); //Line - 255
        write.Write(CashflowDateTime);
        write.Write(HasValue);
    }
    /// <summary>
    /// Reads the values from the stream
    /// </summary>
    /// <param name="read">The BinaryReader stream</param>
    public void Read(System.IO.BinaryReader read)
    {
        Result = new SqlDouble(read.ReadDouble());
        Cashflow = new SqlDouble(read.ReadDouble());
        CashflowDateTime = new SqlDateTime(Convert.ToDateTime(read.ReadString()));
        HasValue = read.ReadBoolean();
    }
    #endregion IBinarySerialize
}

Заранее спасибо.

Пожалуйста, дайте мне знать, если вы хотите, чтобы я предоставил дополнительную информацию.

1 Ответ

0 голосов
/ 01 октября 2019

Скорее всего, проблема в ваших типах. Какие типы Result, Cashflow и CashflowDateTime? Согласно методу Read они являются Sql* типами. Это действительно, как они объявлены? Или они объявлены как Double и DateTime?

По крайней мере, я думаю, что вы неправильно обрабатываете CashflowDateTime в обоих направлениях. Предполагая, что CashflowDateTime действительно является SqlDateTime, тогда я предполагаю, что вам может потребоваться заменить эту строку в методе Write:

write.Write(CashflowDateTime);

следующими двумя строками:

write.Write(CashflowDateTime.DayTicks);
write.Write(CashflowDateTime.TimeTicks);

И затем замените эту строку в методе Read:

CashflowDateTime = new SqlDateTime(Convert.ToDateTime(read.ReadString()));

следующим (который восстанавливает SqlDateTime из значений "DayTicks" и "TimeTicks"):

CashflowDateTime = new SqlDateTime(read.ReadInt32(), read.ReadInt32());

Также:

  1. #region IBinarySerialize здесь не выполняет никаких функций. Удаление этого не повлияет на код.
  2. Для получения дополнительной информации о работе с SQLCLR см. SQLCLR Info
...