插入数据SQLiteConnection异常OpenNetCF.ORM

时间:2016-04-20 10:08:46

标签: c# sqlite windows-ce opennetcf

我正在为Windows CE 6.0扫描仪设备开发应用程序,当我想插入数据时,我遇到了问题。 我正在使用OpenNETCF.ORM框架和SQLite。 当我想使用insert()方法向数据库添加第3篇文章时,会出现问题。它适用于前两篇文章,但当涉及到第三篇文章时,它会引发一个异常,即#34; SQLiteConnection"。

有没有人对这个ORM框架有同样的问题,可以帮助我吗?

以下是DatabaseHelper.cs的代码:

using System;
using System.Windows.Forms;
using OpenNETCF.ORM;

namespace OfflineWMS
{
    public class DatabaseHelper
    {
        private Scanner _scannerManager = new Scanner();

        private static DatabaseHelper _instance = null;

        private static readonly object MyLock = new object();

        private SQLiteDataStore _stockDatabase;

        public SQLiteDataStore StockDatabase1
        {
            get { return _stockDatabase; }
        set { _stockDatabase = value; }
    }

    private DatabaseHelper() {}

    public static DatabaseHelper getInstance()
    {
        lock (MyLock)
        {
            if (_instance == null)
            {
                _instance = new DatabaseHelper();
                _instance.InitDatabase();
            }
            return _instance;
        }

    }


    //Create the Database
    public void InitDatabase()
    {
        StockDatabase1 = new SQLiteDataStore(ConfigurationHelper.Settings["PathToTheApp"] + ConfigurationHelper.Settings["DatabaseFilename"]);
        if (!StockDatabase1.StoreExists)
        {
            StockDatabase1.CreateStore();
        }

        InitializeDbStructure();
    }

    private void InitializeDbStructure()
    {
       StockDatabase1.AddType<Article>();
    }
}

}`

我遇到问题的Form.cs中的代码(在代码的末尾):

using System;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Threading;
using System.Windows.Forms;
using FileOperations.CsvImport;
using FileOperations.CsvImport.FluentInterface;
using OfflineWMS.Properties;
using OpenNETCF.ORM;
using Symbol.Barcode;

namespace OfflineWMS
{
    public partial class Form1 : Form
    {
        private ReaderData TheReaderData;
        private Scanner ScannerManager;
        private bool IsReaderInitiated;
        private DatabaseHelper db;

        public Form1()
        {
            InitializeComponent();
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            if (IsReaderInitiated)
                ScannerManager.TermReader();
            base.OnClosing(e);
        }


        private void ScannerManager_ReadNotify(object sender, EventArgs e)
        {
            TheReaderData = ScannerManager.Reader1.GetNextReaderData();
            //action to do
            ProcessData(TheReaderData);

            ScannerManager.StopRead();
            ScannerManager.StartRead(true);
        }

        private void ProcessData(ReaderData TheReaderData)
        {

            if (TheReaderData != null)
            {
                textBox1.Text = TheReaderData.Text;
            }
            else
            {
                MessageBox.Show(Resources.ReaderDataIsNull);
            }
        }

        private void ScannerManager_StatusNotify(object sender, EventArgs e)
        {
            BarcodeStatus theStatus = ScannerManager.Reader1.GetNextStatus();

            if (theStatus != null)
            {
                switch (theStatus.State)
                {
                    case States.IDLE:
                        statusBar1.Text = Resources.IDLEStatus;
                        break;
                    case States.READY:
                        statusBar1.Text = Resources.ReadyStatus;
                        break;
                    case States.WAITING:
                        statusBar1.Text = Resources.WaitingStatus;
                        break;
                    default:
                        statusBar1.Text = Resources.DefaultStatus;
                        break;
                }
            }
            else
            {
                //log error
            }
        }


        protected override void OnLoad(EventArgs e)
        {
            // DatabaseHelper is instanciated only once here
            db = DatabaseHelper.getInstance();
            ScannerManager = new Scanner();
            IsReaderInitiated = ScannerManager.InitReader();

            textBox1.Focus();

            // if not initialized, we quit the app
            if (!IsReaderInitiated)
            {
                MessageBox.Show(Resources.InitiatingError);
                Application.Exit();
            }
            else
            {
                ScannerManager.AttachStatusNotify(ScannerManager_StatusNotify);
                ScannerManager.StartRead(true);
                ScannerManager.AttachReadNotify(ScannerManager_ReadNotify);
            }

            //db.InitDatabase();

            base.OnLoad(e);
        }

        private void buttonAddToDb_Click(object sender, EventArgs e)
        {  
            if ((TheReaderData != null))
            {
                var article = new Article
                {
                    ArticleName = "test",
                    ArticleCode = "321",
                    ArticleFeature = "true blue",
                    ArticlePrice = 33.22m,
                    ArticleQuantity = 15,
                    ArticleBarcode = TheReaderData.Text
                };
                var article2 = new Article
                {
                    ArticleName = "test",
                    ArticleCode = "321",
                    ArticleFeature = "true blue",
                    ArticlePrice = 33.22m,
                    ArticleQuantity = 15,
                    ArticleBarcode = TheReaderData.Text
                };
                var article3 = new Article
                {
                    ArticleName = "test",
                    ArticleCode = "321",
                    ArticleFeature = "true blue",
                    ArticlePrice = 33.22m,
                    ArticleQuantity = 15,
                    ArticleBarcode = TheReaderData.Text
                };
                    // HERE
                    try
                    {
                        db.StockDatabase1.Insert(article);// article added
                        db.StockDatabase1.Insert(article2);// article2 added
                        db.StockDatabase1.Insert(article3);// throws the exception "SQLiteException"
                    }

                    catch (Exception exception)
                    {
                        MessageBox.Show(exception.Message);
                        ScannerManager.TermReader();
                        Application.Exit();
                    }
            else
            {
                MessageBox.Show(Resources.ScanData);
            }
        }
    }
}

这是此SQLiteException的堆栈跟踪:

    at System.Data.SQLite.SQLiteConnection.CheckDisposed()
   at System.Data.SQLite.SQLiteConnection.get_State()
   at OpenNETCF.ORM.SQLStoreBase`1.<GetPoolConnection>b__11(IDbConnection c)
   at System.Linq.Enumerable.<WhereIterator>d__0`1.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
   at OpenNETCF.ORM.SQLStoreBase`1.GetPoolConnection()
   at OpenNETCF.ORM.SQLStoreBase`1.GetConnection(Boolean maintenance, Boolean isRetry)
   at OpenNETCF.ORM.SQLStoreBase`1.GetConnection(Boolean maintenance)
   at OpenNETCF.ORM.SQLiteDataStore.OnInsert(Object item, Boolean insertReferences)
   at OpenNETCF.ORM.DataStore`1.Insert(Object item, Boolean insertReferences, Boolean recoveryInsert)
   at OpenNETCF.ORM.DataStore`1.Insert(Object item, Boolean insertReferences)
   at OpenNETCF.ORM.DataStore`1.Insert(Object item)
   at OfflineWMS.Form1.buttonAddToDb_Click(Object sender, EventArgs e)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.ButtonBase.WnProc(WM wm, Int32 wParam, Int32 lParam)
   at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
   at Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain)
   at System.Windows.Forms.Application.Run(Form fm)
   at OfflineWMS.Program.Main()

0 个答案:

没有答案