Записи с меткой «Ошибки»

PostHeaderIcon Ошибка “Incorrect attribute value type System.Single” при обновлении поля типа float

float value = 123;
var myEntity = new Entity("new_myentity") { Id = myEntityId };
@event["new_myfield"] = value;
service.Update(@event);

Подобный код в CRM 2011 может выдать ошибку “Incorrect attribute value type System.Single”, не смотря на то, что поле new_myfield имеет тип float.

Для решения проблемы достаточно изменить тип переменной value с float на decimal.

PostHeaderIcon Вставка данных в БД SQL из DataSet

string sqlConnectionString = "..."; // Строка подключения к БД SQL
string tableName = "..."; // Имя таблицы в DataSet
DataSet ds; // Заполненный данными DataSet

using (var con = new SqlConnection(sqlConnectionString))
{
	con.Open();
	using (var insertCmd = con.CreateCommand())
	{
		insertCmd.CommandText = "INSERT INTO Names (Number, Name) VALUES (@Number, @Name)";
		insertCmd.Parameters.Add("Number", SqlDbType.NVarChar, 100, "Номер договора");
		insertCmd.Parameters.Add("Name", SqlDbType.NVarChar, 100, "Клиент");
		using (var adapter = new SqlDataAdapter())
		{
			adapter.InsertCommand = insertCmd;
			adapter.Update(ds, tableName);
		}
	}
	con.Close();
}

Возможна ситуация, когда и данные есть и ошибок нет, но данные из DataSet в БД не попадают. Такое может быть, например, когда DataSet заполнялся с помощью метода Fill другого DataAdapter или для DataSet был выполнен метод AcceptChanges. В этом случае данные в DataSet помечены как не измененные, и DataAdapter не считает нужным что-то с ними делать.

В случае с заполнением DataSet с помощью метода Fill? для решения проблемы, необходимо добавить перед вызовом метода Fill строку da.AcceptChangesDuringFill = false; (где da – экземпляр DataAdapter).

PostHeaderIcon Ошибка 2103 “Недопустимое или неправильно сформированное приложение: проверьте манифест”

Ошибка Silverlight-приложения:

(по-русски)

SCRIPT5022: Unhandled Error in Silverlight Application
Code: 2103
Category: InitializeError
Message: Недопустимое или неправильно сформированное приложение: проверьте манифест

(по-английски)

SCRIPT5022: Unhandled Error in Silverlight Application
Code: 2103
Category: InitializeError
Message: Invalid or malformed application: Check manifest

По-поводу данной ошибки в интернете можно найти только информацию о том, что она возникает по причине не указанного или некорректного Startap Object.

Однако, практика показала, что данная ошибка может быть еще по одной причине – некорректный HTML-файла.

В попытке побороть кэширование Silverlight-приложения, HTML-файл был изменен следующим образом:

...
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
    <param name="source" value="App.xap?ver=1.01"/>
    ...
</object>

Т.е. к имени файла приложения добавлен параметр с номером версии. Проблема оказалась в точке в номере версии. Именно она вызывала ошибку. Кроме того ошибку вызывал любой символ кроме цифры. Стоило убрать точку, как приложение заработало.

Причина такого поведения непонятна.

PostHeaderIcon DatePicker Binding и пустое значение

Есть элемент управления DatePicker с которым связано некое свойство BirthDate типа DateTime.

<sdk:DatePicker SelectedDate="{Binding Path=BirthDate, Mode=TwoWay}" />

Данная связь будет работать только пока значение DatePicker не пустое. В случае очистки значения элемента управления это пустое значение не будет передано свойству и свойство будет содержать свое прежнее значение.

Происходит это потому, что при очистке значения DatePicker его свойство SelectedDate получает значение null, а в нашем примере свойство BirthDate не может иметь нулевое значение.

Решение проблемы очевидно — необходимо объявить свойство BirthDate как Nullable, то есть объявление свойства должно выглядеть таким образом:

public DateTime? BirthDate { get; set; }

PostHeaderIcon Ошибка “Не удалось завершить эту операцию. Повторите попытку. 0×80004005″ в SharePoint и правила построения запросов с “Or”

Запрос для выбора записей (задач), назначенных на некоторый круг пользователей и не являющихся завершенными:

<Query>
    <Where>
        <And>
            <Or>
                <Includes>
                    <FieldRef Name='AssignedTo' />
                    <Value Type='Lookup'>user01</Value>
                </Includes>
                <Includes>
                    <FieldRef Name='AssignedTo' />
                    <Value Type='Lookup'>user02</Value>
                </Includes>
                <Includes>
                    <FieldRef Name='AssignedTo' />
                    <Value Type='Lookup'>user03</Value>
                </Includes>
            </Or>
            <Neq>
                <FieldRef Name='_x0421__x043e__x0441__x0442__x04' />
                <Value Type='Text'>Завершена</Value>
            </Neq>
        </And>
    </Where>
</Query>

Данный запрос возвратит ошибку “Не удалось завершить эту операцию. Повторите попытку. 0×80004005“.

Запрос выглядит довольно правдоподобным и так сразу и не скажешь в чем причина ошибки. Однако, причина довольно банальна – запрос не верен, так как оператор Or может принимать только два условия для сравнения (а в запросе их три). Кому из разработчиков CAML пришла в голову идея сделать именно так (ведь это откровенный бред!) не известно, но факт остается фактом – корректный запрос в данному случае должен выглядеть так:

<Query>
    <Where>
        <And>
            <Or>
                <Includes>
                    <FieldRef Name='AssignedTo' />
                    <Value Type='Lookup'>user01</Value>
                </Includes>
                <Or>
                    <Includes>
                        <FieldRef Name='AssignedTo' />
                        <Value Type='Lookup'>user02</Value>
                    </Includes>
                    <Includes>
                        <FieldRef Name='AssignedTo' />
                        <Value Type='Lookup'>user03</Value>
                    </Includes>
                </Or>
            </Or>
            <Neq>
                <FieldRef Name='_x0421__x043e__x0441__x0442__x04' />
                <Value Type='Text'>Завершена</Value>
            </Neq>
        </And>
    </Where>
</Query>

Дабы избежать подобных ошибок и упростить себе работу по построению запросов на просторах интернета найден программа U2U CAML Query Builder for SharePoint 2003 and SharePoint 2007 (Windows Version).

Для программного создания подобных условий пришлось написать такой вот метод:

// [C#]
private static string CreateOrLookupConditions(string comparisonOperator, string fieldName, string[] wssValues)
{
    if (wssValues == null || wssValues.Length < 1)
        return string.Empty;
    var tpl = "<" + comparisonOperator + "><FieldRef Name='" + fieldName + "' /><Value Type='Lookup'>{0}</Value></" + comparisonOperator + ">";
    var conditionString = string.Format(tpl, wssValues[0]);
    if (wssValues.Length == 1)
        return conditionString;
    for (var i = 1; i < wssValues.Length; i++)
        conditionString = "<Or>" + conditionString + string.Format(tpl, wssValues[i]) + "</Or>";
    return conditionString;
}

// Использование
var users = new string[] { "user01", "user02", "user03" };
var conditions = CreateOrLookupConditions("Includes", "AssignedTo", users);

PostHeaderIcon Ошибка “В документе XML (1, 500) присутствует ошибка”

При выполнении запроса на выборку данных по критерию с помощью QueryExpressionRetrieveMultipleRequest и метода Execute, при использовании библиотек SDK, может возникнуть исключение System.InvalidOperationException с текстом ”В документе XML (1, 500) присутствует ошибка“. В StackTrace при этом первыми будут следующие строки:

в System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
в System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
в System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)

Эта ошибка возникнет, если свойству ReturnDynamicEntities класса RetrieveMultipleRequest не задать значение true, то есть не указать, что, возвращаемые веб-сервисом данные, должны быть десериализованы в тип DynamicEntity.

По логике такая ошибка однозначно возникнет при запросе данных из пользовательской сущности, но скорее всего не возникнет при обращении к стандартной системной сущности.