SQL Anywhere .NET数据提供程序引发身份验证违规异常

时间:2015-07-02 15:55:39

标签: entity-framework sybase sqlanywhere

我有一个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"

我尝试将新实体添加到数据库中具有单个autoincerement属性的表中:

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

适用于前几(100,000)次迭代。但在此之后,当callin 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.5Entity Framework 5.0SQLAnywhere 12 version 12.1.4216

当然这是一个简化的场景,在实际情况下我没有在循环中调用SaveChanges(),但是在几次调用之后我得到了相同的异常。任何想法为什么抛出这个异常以及解决方案都会受到欢迎。

1 个答案:

答案 0 :(得分:0)

似乎SQL Anywhere的OEM版可以具有未经身份验证和验证的连接。未经验证的那些只能从数据库中读取(理论上)并以某种方式写入它(在第一次写入后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();
}

有关此问题以及如何开发经过身份验证的应用程序并获取身份验证参数的更多信息,请访问here