我正在编写一项要求,即平板电脑需要将照片和元数据一起存储在本地数据库中,因为我们的码头工作人员在我们码头的某些区域没有网络连接,我们需要能够将照片和附加数据存储到其平板上的sqlexpress db中。
我试图使用ComToolKit从silverlight访问本地sqlexpress数据库,并在这一行代码中遇到一个运行时错误:
using (var connection = new ComToolkit.Data.AdoConnection(connectionString))错误:
System.TypeLoadException未被用户代码Message=Could处理,而不是从程序集'System.Windows、Version=5.0.5.0、Culture=neutral、PublicKeyToken=7cec85d7bea7798e‘加载类型'System.Windows.Interop.ComAutomationFactory’。
StackTrace:
at ComToolkit.Data.AdoConnection..ctor(String connectionString)
at SilverlightApplication1.MainPage.PopPrograms()
at SilverlightApplication1.MainPage..ctor()
at SilverlightApplication1.App.Application_Startup(Object sender, StartupEventArgs e)
at MS.Internal.CoreInvokeHandler.InvokeEventHandler(UInt32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName, UInt32 flags)我将使用语句更改为:
using System.Windows.Interop;改为:
using System.Runtime.InteropServices.Automation;但我还是有问题。这里有熟悉Silverlight和ComToolKit的吗?
参考链接http://beyondrelational.com/modules/2/blogs/117/posts/14645/access-a-local-sql-compact-database-from-silverlight-4.aspx
发布于 2014-08-23 02:12:47
如果您愿意容忍一点ComToolkit和一些糟糕的性能,那么您可以在不使用dynamic的情况下做到这一点。
当然,由于您使用的是COM,因此需要使用提升的权限运行。
下面的示例代码在后台工作人员中运行查询。这是必要的,因为查询可能很慢,这样可以避免在查询仍在运行时冻结UI。
private void Button_Click(object sender, RoutedEventArgs e)
{
FetchData();
}
private void FetchData()
{
List<Site> sites = new List<Site>();
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (s, e2) =>
{
dynamic conn = AutomationFactory.CreateObject("ADODB.Connection");
conn.ConnectionString =
@"Provider=sqloledb;
Data Source=.\SQLEXPRESS;
Initial Catalog=SamDb;
Integrated Security=SSPI";
conn.Open();
dynamic recordSet = conn.Execute("SELECT SiteId, SiteName FROM Sites");
recordSet.MoveNext();
while (!recordSet.EOF)
{
string siteName = (string)recordSet.Fields.Item(1).Value;
short siteId = (short)recordSet.Fields.Item(0).Value;
sites.Add(new Site(SiteId: siteId, SiteName: siteName));
recordSet.MoveNext();
}
};
worker.RunWorkerCompleted += (s, e2) =>
{
this.ListSites.ItemsSource = sites;
};
worker.RunWorkerAsync();
}发布于 2014-08-22 17:25:41
IIRC Silverlight应该在一个相当高的安全沙箱中运行,并且对客户端计算机上的服务(如COM和数据库)的访问权限非常有限。
Visual中的大多数Silverlight项目模板还创建了一个服务器端项目,Silverlight客户端可以与其对话;数据库访问将发生在服务器上。我相当肯定像DataSet这样的类不能在Silverlight客户端中使用,所以我认为您在这里走错了方向。
https://stackoverflow.com/questions/25452118
复制相似问题