0

我的控制器上出现此错误

System.Data.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> MySql.Data.MySqlClient.MySqlException: There is already an open DataReader associated with this Connection which must be closed first.
   at MySql.Data.MySqlClient.MySqlCommand.CheckState()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
   --- End of inner exception stack trace ---
   at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
   at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues)
   at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.Execute(MergeOption mergeOption)
   at System.Data.Objects.DataClasses.EntityReference`1.Load(MergeOption mergeOption)
   at System.Data.Objects.DataClasses.RelatedEnd.Load()
   at System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad()
   at System.Data.Objects.DataClasses.EntityReference`1.get_Value()
   at Timee.fingerprint.get_employee() in C:\Users\MyNameDesktop\Time\Timee\AModel.Designer.cs:line 2234
   at Timee.BundyForm.verificationControl_OnComplete(Object Control, FeatureSet FeatureSet, EventHandlerStatus& EventHandlerStatus) in C:\Users\MyName\Desktop\Time      \Timee\BundyForm.cs:line 82
   at DPFP.Gui.Verification.VerificationControl.<>c__DisplayClass2.<relay_OnComplete>b__0()

控制器:

 void verificationControl_OnComplete(object Control, DPFP.FeatureSet FeatureSet, ref DPFP.Gui.EventHandlerStatus EventHandlerStatus)
    {
        clearInfoBoxTimer.Stop();

        DateTime entryTime = DateTime.Now;

        DPFP.Verification.Verification ver = new DPFP.Verification.Verification();
        DPFP.Verification.Verification.Result res = new DPFP.Verification.Verification.Result();

        employee employees = null;
        foreach (fingerprint fingerPrint in this.db.fingerprints)
        {
            DPFP.Template template = new DPFP.Template();
            template.DeSerialize(fingerPrint.data);
            ver.Verify(FeatureSet, template, ref res); 
            if (res.Verified)
            {
                employees = fingerPrint.employee; //Im GETTING AN ERROR HERE
                break;
            }
        }
     }

根据我阅读的一些论坛,我必须添加multipleactiveresultsets=True;到我的 webconfig 中。但就我而言,它不适用,因为我使用的是不支持它的 MYSQL。还有其他方法可以使这项工作吗?请各位大侠帮帮我,谢谢。

验证模型

// Summary:
//     Performs the system function of fingerprint verification, which is a one-to-one
//     comparison of a fingerprint feature set with a fingerprint template produced
//     at enrollment that returns a decision of match or non-match.
public class Verification
{
    // Summary:
    //     Use this value to specify the default FAR threshold
    public const int ProbabilityNotSet = -1;

    // Summary:
    //     Initializes a new instance of the Verification class for comparing a fingerprint
    //     feature set with a fingerprint template using the default value of the false
    //     accept rate (FAR)
    public Verification();
    //
    // Summary:
    //     Initializes a new instance of the Verification class for comparing a fingerprint
    //     feature set with a fingerprint template and assigns the value of the FAR
    //
    // Parameters:
    //   FARRequested:
    //     Value of the requested FAR
    public Verification(int FARRequested);

    // Summary:
    //     Returns or assigns the requested false accept rate (FAR)
    public int FARRequested { get; set; }

    // Summary:
    //     Performs fingerprint verification and returns the comparison decision based
    //     on the default FAR threshold
    //
    // Parameters:
    //   FeatureSet:
    //     A DPFP.FeatureSet object
    //
    //   Template:
    //     A DPFP.Template object
    //
    // Returns:
    //     Verification result object
    public static Verification.Result Verify(FeatureSet FeatureSet, Template Template);
    //
    // Summary:
    //     Performs fingerprint verification and returns the comparison decision based
    //     on the specified FAR threshold
    //
    // Parameters:
    //   FeatureSet:
    //     A DPFP.FeatureSet object
    //
    //   Template:
    //     A DPFP.Template object
    //
    //   FARRequested:
    //     False Accept probability threshold or ProbabilityNotSet to use the default
    //     threshold
    //
    // Returns:
    //     Verification result object
    public static Verification.Result Verify(FeatureSet FeatureSet, Template Template, int FARRequested);
    //
    // Summary:
    //     Performs the system function of fingerprint verification and specifies a
    //     comparison decision based on the FAR set by the FARRequested property
    //
    // Parameters:
    //   FeatureSet:
    //     A DPFP.FeatureSet object
    //
    //   Template:
    //     A DPFP.Template object
    //
    //   Result:
    //     A DPFP.Verification.Result object
    public void Verify(FeatureSet FeatureSet, Template Template, ref Verification.Result Result);

    // Summary:
    //     Represents the results of a fingerprint verification operation.
    public class Result
    {
        // Summary:
        //     Default c-tor
        public Result();

        // Summary:
        //     Returns or assigns the value of the achieved FAR for a comparison operation.
        public int FARAchieved { get; set; }
        //
        // Summary:
        //     Returns or assigns the comparison decision, which indicates whether the comparison
        //     of a fingerprint feature set and a fingerprint template resulted in a decision
        //     of match or non-match. This decision is based on the value of the FARRequested
        //     property
        public bool Verified { get; set; }
    }
}
4

6 回答 6

1

我现在能够找到自己问题的答案。这是我的工作解决方案

 void verificationControl_OnComplete(object Control, DPFP.FeatureSet FeatureSet, ref DPFP.Gui.EventHandlerStatus EventHandlerStatus)
    {
        clearInfoBoxTimer.Stop();

        DateTime entryTime = DateTime.Now;

        DPFP.Verification.Verification ver = new DPFP.Verification.Verification();
        DPFP.Verification.Verification.Result res = new DPFP.Verification.Verification.Result();

        employee employees = null;
        foreach (fingerprint fingerPrint in this.db.fingerprints)
        {
            DPFP.Template template = new DPFP.Template();
            template.DeSerialize(fingerPrint.data);
            ver.Verify(FeatureSet, template, ref res); 
            if (res.Verified)
            {
                db.Connection.Close(); //I close the connection first
                db.Connection.Open(); // then I open it again

                employees = fingerPrint.employee; 
                break;
            }
        }
     }

根据这里的人和我读过的一些论坛的建议,我需要先关闭打开的阅读器,然后再打开它。我花了一些时间思考如何做到这一点,最后我现在能够找到一个。这就是我以最简单的方式解决我的问题的方法,我不知道是否还有其他解决方案。但至少这解决了我的问题,我仍然非常感谢这里的人们竭尽全力帮助我。感谢你们。:)

于 2013-07-23T09:39:41.567 回答
1

下面的代码有帮助吗?

foreach (fingerprint fingerPrint in this.db.fingerprints)
{
    using(fingerprint)
    {
        DPFP.Template template = new DPFP.Template();
        template.DeSerialize(fingerPrint.data);
        ver.Verify(FeatureSet, template, ref res); 
        if (res.Verified)
        {
            employees = fingerPrint.employee; //Im GETTING AN ERROR HERE
            break;
        }
    }
}
于 2013-07-19T10:57:22.223 回答
1

您无法在数据读取器中打开数据读取器。(当已经有一个打开的阅读器时,您不能打开阅读器,通常在嵌套循环中)。

作为一家公司,我们过去经常遇到这个问题。经过大量调查,出于我们的目的,我们决定重新思考我们如何构建数据连接。

您首先必须关闭打开的阅读器,然后再打开下一个阅读器。因此,我们继续编写更面向对象的代码,使用类对象作为顶层循环的“存储”,并用我们需要的数据填充该对象。

关闭阅读器。

逐步检查您的临时对象并打开阅读器以获取更多数据。

洗涤,冲洗,重复。

这对我们来说效果很好。

PS,您还可以通过更好地利用表连接来消除嵌套的读取循环。

于 2013-07-19T11:09:48.687 回答
1

res是什么数据类型?指纹是什么数据类型?

您可能需要为结果提供更多上下文,但听起来您应该返回数据集/数据适配器而不是返回 ADO.NET 连接。fingerPrint.employee 可能使用相同的底层连接,但您尚未关闭第一个阅读器,因此出现错误消息。

如果您实施此策略,它将允许您与底层数据库实例分离。

因此,您的数据库层将在内部使用 IDataReader,然后返回上层可以迭代的 DataSet 或 DataAdapter,而不必担心打开的数据库连接。

于 2013-07-19T11:16:24.893 回答
0

您需要在您的连接字符串中启用 multipleActive 结果集 true。

将“MultipleActiveResultSets=True”添加到您的连接字符串。

请参阅以下链接。 http://www.dotnetjalps.com/2013/06/Entity-Framework-There-is-already-an-open-DataReader-associated-with-this-Command.html

于 2013-07-19T12:27:31.300 回答
0

当您使用 foreach 遍历指纹时,它会保持连接打开。一种解决方案是在指纹上调用 ToList(),它将获取所有指纹并将它们放在一个列表中,然后关闭连接。然后,您可以使用 foreach 遍历列表并对列表中的每个项目执行附加查询。例子:

foreach (fingerprint fingerPrint in this.db.fingerprints.ToList())

这个问题还有一些其他的答案:

实体框架:已经有一个打开的 DataReader 与此命令关联

于 2016-12-15T07:58:09.987 回答