首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL .NET数据提供程序引发身份验证冲突异常

问SQL .NET数据提供程序引发身份验证冲突异常
EN

Stack Overflow用户
提问于 2015-07-02 15:55:39
回答 1查看 1.3K关注 0票数 0

我有一个Sybase数据库,我从它生成了一个ADO.Net Entity Data Model。下面是来自connectionString文件的App.config:

代码语言:javascript
复制
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属性的表中:

代码语言:javascript
复制
while (true)
{
    using (var context = new Entities())
    {
        var testEntity = new TestTable();
        context.TestTables.Add(testEntity);
        try
        {
            context.SaveChanges();
        }
        catch (Exception ex)
        {
        }
    }
}

这对于第一对(100,000次)迭代很好。但是在那之后,我得到了一个带有消息iAnywhere.Data.SQLAnywhere.SAException的Authentication violation,即源"SQL Anywhere .NET Data Provider",当调用context.SaveChanges()时。下面是堆栈跟踪:

代码语言:javascript
复制
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(),不过,经过几次调用,我还是得到了相同的异常。任何知道为什么会抛出这个异常和什么是解决方案都会受到欢迎。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-03 15:03:08

似乎OEM版的SQL Anywhere可以有未经认证和认证的连接。未经身份验证的类只能从数据库中读取(理论上)并以某种方式写入数据库(在第一次写入之后30秒,在我的示例中是SaveChanges()调用)。下面是如何验证连接的代码:

代码语言:javascript
复制
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();
}

有关此以及如何开发经过身份验证的应用程序和获取身份验证参数的更多信息,请参见这里。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31189299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档