参考:
(http://blog.csdn.net/github_36704374/article/details/60469324)
开发环境
软件:VS2017,硬件:Hololens
需求:将SQLServer数据库转换成SQLlite文件,并通过Hololens的UWP程序访问,读取数据并显示。
原本打算直接上Unity的,但是当前还没装好,先用UWP预习一下。
1.转换数据库
1.下载转换工具,我找到的是SqlConverter_v1_20。(http://download.csdn.net/download/lifeilin6671/7837465)
2.转换数据库,生成文件topviewxp.db。
3.在一般程序中确认生成的文件是否正确(省略,直接上UWP)
2.创建UWP程序
1.用VS2017创建通用程序
2.SQLite操作
参考:http://blog.csdn.net/github_36704374/article/details/60469324
sqlite程序集是到官网下载安装的,在VS中下载的安装不了,说是兼容性问题。
http://sqlite.org/download.html Universal Windows Platform
3.导入SQLite文件
将生成的topviewxp.db放到项目中,并用StorageFile的copy方法复制到ApplicationData.Current.LocalFolder下,以备后用。
4.读取SQLite内容
1.读取表格列表。
这一步就卡住了,没有直接的参考资料,SQLite.NET.PCL中没找到直接获取的API。一般其实没必要获取表格列表的,直接根据表名获取表的内容就好。不过应该我以前用c#操作SQLite是能获取的,用SQLiteConnection.GetSchema(),SQLiteConnection.GetSchema()稍微研究一下。
SQLiteConnection获取内容的方式是根据表的内容定义一个类,直接映射到类中,但问题是类名和类结果不知道的情况下怎么办呢?
1.获取表结果,创建一个wpf项目,用System.Data.SQLite读取表结果,然后创建类,看能否映射到该类中。
这里卡了一下,由于System.Data.SQLite.dll是32位的,电脑是64位,默认创建的项目是any cpu,导致无法使用dll,改成x86就好了。
SQLiteConnection.GetSchema()的结果,可以看出是数据库中的基本元素的列表。
SQLiteConnection.GetSchema("TABLES")的结果,这里就是全部的表了。
创建了一个MetaDataCollections类
public class MetaDataCollections
{
public string CollectionName { get; set; }
public string NumberOfRestrictions { get; set; }
public string NumberOfIndentifierParts { get; set; }
}
结果
创建了一个Tables类,结果一样,没有该表。奇怪,同一个文件,用System.Data.SQLite.dll能读取的话,这些信息应该是就在文件中的。
试着用notepad++打开.db文件,发现用代码创建的db文件中居然有部分明文:
不过用工具转换的文件中没有类似的。嘛,当然不能直接读文本文件了。
这部分先到这里吧,以后有空研究一下SQLite的源码,说不定会有所收获。
2.获取一张表的内容
根据已知的表名,能够获取表的列的列表。
List columns=db.GetTableInfo("T_MachineRoomInfo");
CbColumnList.ItemsSource = columns;
3.获取表内容
根据已知的表结果构建一个表类,并获取数据
public class T_MachineRoomInfo
{
public string RoomID { get; set; }
public string RoomName { get; set; }
public string PID { get; set; }
public string ImageName { get; set; }
public string ImageText { get; set; }
public string Remark { get; set; }
public string Cli { get; set; }
public string OptimumPercent { get; set; }
public string Obligate3 { get; set; }
public string Obligate4 { get; set; }
public string Obligate5 { get; set; }
}
StringBuilder sb = new StringBuilder();
using (SQLiteConnection db = new SQLiteConnection(new SQLitePlatformWinRT(), path))
{
var list = db.Table();
foreach (var item in list)
{
sb.AppendLine($"{item.RoomName}");
}
}
await new MessageDialog(sb.ToString()).ShowAsync();
其实到这里就算是可行性分析完成了,能读取到数据。但是手工生成比较花时间,一个表一个类,这部分可能要用EF框架了。然后还要和以前的类结构对接起来。这两部分其实和UWP本身没关系,在一般的c#项目中就能处理,之后再研究。
3.在Hololens中运行,结果弹出 System.DllNotFoundException:Unable to load DLL 'sqlite3'。只能猜测前面添加的
查到一个资料(https://docs.microsoft.com/en-us/windows/uwp/data-access/sqlite-databases)
里面提供了两种途径:
1.Entity Framework Core
2. Microsoft.Data.Sqlite library
先选择Microsoft.Data.Sqlite,从NuGet中安装Microsoft.Data.Sqlite,但是无法使用,点不出来Microsoft命名空间。
到https://github.com/aspnet/Microsoft.Data.Sqlite/下载源代码看看
下载下来后,打开解决方案,引用和NuGet都是感叹号
运行文件夹中的build.cmd(NuGet的某个教程中教的),一开始有错误,仔细看发现目录中中文部分编程乱码,修改目录名称为全英文,另外空格也没有,以防万一。然后就可以正常运行了,应该是下载并安装相关的SDK吧。.NET Core 相关的。
后面又出错了
看到最后一句话,难道是因为我打开了解决方案导致的?关闭再试一次。
可以了,安装成功了!也生成了个Microsoft.Data.Sqlite.dll。
但是怎么用?
将项目中的NuGet的Microsoft.Data.Sqlite卸载,添加对新生成的Microsoft.Data.Sqlite.dll的引用。
可以了!
命名空间能加进来,类能使用了。
但是又有问题
看项目中有个对AspNetCore的引用,在NuGet中找
结果无法安装,另外,NuGet中的Microsoft.Data.Sqlite.Core也是无法安装的。为什么呢?
找standard2.0
.Net Standard
.Net Standard 库是 .Net Core 可移植性的核心。其目的是定义标准的 API 集。这些 API,如集合、线程、反射,是由 .Net Core、.Net 4.5、Xamarin 和 Mono 等平台实现的。它们是开发人员用来构建自己的库和应用程序的基本构建块。
找到源码了 https://github.com/dotnet/standard
下载并build...又出错了
怀疑是不是我的win10版本问题??
突然想到搜索一下dll,在目录【Microsoft.Data.Sqlite-dev\test\Microsoft.Data.Sqlite.Tests\bin\Debug\net461】下发现一个netstandard.dll,添加引用。有效果!
添加相同目录下的比较相似的 System.Data.Common.dll
这下卡住了!
另一边,Standar源代码build成功了,就是重新build.cmd一次。
找到\standard-master\bin\ref\netstandard\2.0.0.0下面有netstandard.dll,引用进去,不行。
真的卡住了。瞎搞不行啊。
还是想办法从NuGet安装比较合理,相关的程序集也会相应的升级/安装。
4.使用EF框架
这个也在前面的https://docs.microsoft.com/en-us/windows/uwp/data-access/sqlite-databases页面中提到,具体教程在https://docs.microsoft.com/zh-cn/ef/core/get-started/uwp/getting-started,但是需要满足条件
The following items are required to complete this walkthrough:
Windows 10 Fall Creators Update (10.0.16299.0)
.NET Core 2.0.0 SDK or later.
Visual Studio 2017 version 15.4 or later with the Universal Windows Platform Development workload.
5.对接以前的类结构