///
在VS2010中运行以上代码会出现以下问题:
“混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在4.0 运行时中加载该程序集
今天在把以前写的代码生成工具从原来的.NET3.5升级到.NET4.0,同时准备进一步完善,将程序集都更新后,一运行程序在一处方法调用时报出了一个异常:”
其调用的方法是从sqlite数据库中获取原来已经使用过的数据库连接,当时也没注意,就是准备设断点然后单步调试,结果竟然是断点无法进入方法体内,后来仔细看了一下方法体的时候发现了一个问题,就是现有的System.Data.Sqlite这个数据访问provider是针对.NET2.0环境开发(最新的版本是1.0.66.0,2010年4月18日发布的),而目前官方也没有给出最新的.NET4的数据访问支持。
既然出现这个问题,那肯定是上GOOGLE搜索解决方案,毕竟微软不可能因为升级到了.NET4.0的程序无法访问.NET2.0的程序集吧。后来在著名的stackoverflow.com上果然找到了解决方案,就是在app.config中添加一个配置节:startup
(向项目添加
C#操作Sqlite快速入门及相关工具收集
Sqlite是不是那个System.Data.SQLite.DLL临时创建了数据库引擎?
1.新建一个WinForm项目,引用System.Data.SQLite.DLL.界面如下
![使用.NET(c#)操作SQLLITE](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
1.1
这样就可以创建一个数据库文件,名称随意。
封装成一个函数
// CreateDB("HyData.db3");
private
{
}
1.2
1.3
// 创建一个表:
// 插入些数据:
private
{
}
// ExecQuery("select
private
{
}
// 执行查询返回DataSet
private
{
}
本文示例项目源码:HySqlite.rar
2.Sqlite相关工具
2.1
或sqlite-shell-win32-x86-3070600.zip
http://revit.5d6d.net/thread-800-1-1.html
2.2
或http://revit.5d6d.net/thread-801-1-1.html包括
SQLite-1.0.66.0-source.zip
SQLite-1.0.66.0-binaries.zip
debug.rar
2.3
SQLiteExpertSetup.exe
http://revit.5d6d.net/thread-802-1-1.html这个比较好用,破解版
SQLite Database Browser.exe
http://revit.5d6d.net/thread-803-1-1.html这个据说用在手机上
2.4
下载:SQLiteSpy或http://revit.5d6d.net/thread-808-1-1.html
//插入数据的另一种方法
//先创建表"CREATE TABLE user11(id int(4),name varchar(20),maxlevel int(4),east varchar(20))"
private void button5_Click(object sender, EventArgs e)
sql="create table tablename (m_id integer identity(1,1) primary key,编号 varchar(10),日期 date, 时间 date)"
Conn.ExeCute(SQL)
怎样让tablename使用变量
tablename =Request.QueryString("tname")
sql="create table " & tablename & " (m_id integer identity(1,1) primary key,编号 varchar(10),日期 date, 时间 date)"
CREATE TABLE Persons(Id_P int,LastName varchar(255),FirstName varchar(255),Address varchar(255),City varchar(255))
c#与SQL类型转换
数据库 | C#程序 |
int | int32 |
text | string |
bigint | int64 |
binary | System.Byte[] |
bit | Boolean |
char | string |
datetime | System.DateTime |
decimal | System.Decimal |
float | System.Double |
image | System.Byte[] |
money | System.Decimal |
nchar | String |
ntext | String |
numeric | System.Decimal |
nvarchar | String |
real | System.Single |
smalldatetime | System.DateTime |
smallint | Int16 |
smallmoney | System.Decimal |
timestamp | System.DateTime |
tinyint | System.Byte |
varbinary | System.Byte[] |
varchar | String |
Variant | Object |
unique identifier | System.Guid |
System.Data.SQLite.dll跨x86和x64平台的使用方法
来电通来电弹屏软件出问题了。客户使用Windows 7(64位)系统,虽然我们针对来电弹屏软件x86、x64平台的部署做了处理,但还是无法执行,出现程序集调用错误。这里涉及到System.Data.SQLite.dll控件跨x86、x64平台的使用问题。
先看.net编译时目标平台的设置差异化:
目标平台 | 生成的托管模块 | x86 Windows | x64 windows | IA64 Windows |
anycpu | 不明确指定 | 作为32bit应用程序运行 | 作为64bit应用程序运行 | 作为64bit应用程序运行 |
x86 | x86 | 作为32bit应用程序运行 | 作为WoW64应用程序运行 | 作为WoW64应用程序运行 |
x64 | x64 | 不运行 | 作为64bit应用程序运行 | 不运行 |
Itanium | Itanium | 不运行 | 不运行 | 作为64bit应用程序运行 |
从Data.SQLite.dll的源代码中可以知道,其解决方案中保含两部分的项目,一部分是C#项目,会被生成Data.SQLite.dll和Data.SQLite.Linq.dll;另一部分是C/C++项目,会被生成SQLite.Interop.dll。如果对源代码进行某些配置,结果会生成一个文件,即我们常用的Data.SQLite.dll,这可以从官方网站中的那些标着“bundle”字样的文件中可以看出,而没有这个字样的文件,其中会包含SQLite.Interop.dll。在这两个部分中,C#部分中的“UnsafeNativeMethods.cs”文件中定义了两个部分的关系,即在此文件中通过DllImport来导入SQLite.Interop.dll,而路径可以是当前目录下,或者当前目录的Win32、x86、x64等目录之下。这些就是Data.SQLite.dll的基本内部结构。
Data.Sqlite.dll的源代码中使用了两种C/C++和C#的交互方式,都可以达到在.NET平台利用C/C++代码的目的。一种是以C#代码为主体,导入C/C++ dll的方式,这样会生成多个dll。另一种以C/C++代码为主体,导入C# module的方式,这样只会生成一个dll。
由于解决方案中存在C/C++项目,这是不能够生成AnyCPU的,所以引用该dll的程序,如果必须要求生成在AnyCPU中的话,该dll的使用将会出现问题。至今发现的唯一一种解决方案是,把C#项目生成的Data.SQLite.dll、x64目录下的x64版本的SQLite.Interop.dll、x86目录下的x86版本的SQLite.Interop.dll组合在一起使用。使用时,只需要引用Data.SQLite.dll,它的内部会根据当前平台的不同而调用不同的SQLite.Interop.dll,从而达到对AnyCPU都兼容的目的。
上面所说的方法可以达到跨x86和x64平台的目的,不过如果引用该dll的程序不必要一定在AnyCPU下生成,还有一个更方便的方法,把引用该dll的程序在x86下生成,dll只用已经发布了的32平台的版本即可。
其它可能出现的问题,例如Debug下正常而Release下不正常、Console下正常而WinForm下不正常、Win32下正常而Win64下不正常等等,如果可以接受用不优化的Debug版本,或者不使用Winform形式的程序,或者只在一个平台下使用,就不必像我说的那样复杂,如果要求很严格,可以试试我在上面所说的方案