Поставщик данных SQL Anywhere .NET выдает исключение нарушения аутентификации

У меня есть Sybase база данных, из которой я сгенерировал ADO.Net Entity Data Model, Вот connectionString от App.config файл:

connectionString="metadata=res://*/Test.csdl|res://*/Test.ssdl|res://*/Test.msl;provider=iAnywhere.Data.SQLAnywhere;provider connection string="userid=testUser;password=testPassword;datasourcename=test"" providerName="System.Data.EntityClient"

Я пытаюсь добавить новые объекты в таблицу с одним атрибутом автоинкремента в базе данных:

while (true)
{
    using (var context = new Entities())
    {
        var testEntity = new TestTable();
        context.TestTables.Add(testEntity);
        try
        {
            context.SaveChanges();
        }
        catch (Exception ex)
        {
        }
    }
}

который отлично работает для первых нескольких (сотен, тысяч) итераций. Но после этого я получаю iAnywhere.Data.SQLAnywhere.SAException с сообщением Authentication violation, источник "SQL Anywhere .NET Data Provider"когда звонишь context.SaveChanges(), Вот трассировка стека:

at iAnywhere.Data.SQLAnywhere.SACommand._ExecuteReader(CommandBehavior commandBehavior, Boolean isExecuteScalar, Boolean isBeginExecuteReader)
at iAnywhere.Data.SQLAnywhere.SACommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)

я использую VS2012, .Net Framework v4.5, Entity Framework 5.0, SQLAnywhere 12 version 12.1.4216,

Конечно, это упрощенный сценарий, в реальном случае я не звоню SaveChanges() в цикле, тем не менее, я получаю то же исключение после нескольких звонков. Любая идея о том, почему выбрасывается это исключение и каково его решение, будет приветствоваться.

1 ответ

Решение

Похоже, OEM издание SQL Anywhere может иметь неаутентифицированные и аутентифицированные соединения. Неаутентифицированные могут только читать (теоретически) из базы данных и каким-то образом записывать в нее (в течение 30 секунд после первой записи, в моем случае SaveChanges() вызов). Вот код для проверки подлинности вашего соединения:

private static string AuthCommand = "SET TEMPORARY OPTION CONNECTION_AUTHENTICATION='Company=COMPANY_NAME;Application=APPLICATION;Signature=SIGNATURE'";
private bool AuthCommandIssued = false;

public override int SaveChanges()
{
    if (!AuthCommandIssued)
    {
        Database.ExecuteSqlCommand(AuthCommand);
        AuthCommandIssued = true;
    }
    return base.SaveChanges();
}

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

Другие вопросы по тегам