我正在为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()