使用.NET(c#)操作SQLLITE

2013-03-08 16:46  1606人阅读  评论(0)  收藏  举报
使用.NET操作SQLLITE
先下载ADO .NET2.0 Provider for SQLite。下载binaries zip版就可以了。下载完后解压缩,可以在bin目录下找到System.Data.SQLite.DLL。在vs2008中用Add Reference功能把System.Data.SQLite.DLL加到工程里就可以了。运行下面代码试试:
string datasource = "e:/tmp/test.db";
System.Data.SQLite.SQLiteConnection.CreateFile(datasource);
//连接数据库
System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection();
System.Data.SQLite.SQLiteConnectionStringBu ilder connstr = new System.Data.SQLite.SQLiteConnectionStringBu ilder();
connstr.DataSource = datasource;
connstr.Password = "admin";//设置密码,SQLite ADO .NET实现了数据库密码保护
conn.ConnectionString = connstr.ToString();
conn.Open();
//创建表
System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand();
string sql = "CREATE TABLE test(username varchar(20),password varchar(20))";
cmd.CommandText = sql;
cmd.Connection = conn;
cmd.ExecuteNonQuery();
//插入数据
sql = "INSERT INTO test VALUES('a','b')";
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
//取出数据
sql = "SELECT * FROM test";
cmd.CommandText = sql;
System.Data.SQLite.SQLiteDataReader reader = cmd.ExecuteReader();
StringBuilder sb = new StringBuilder();
while (reader.Read())
{
sb.Append("username:").Append(reader.GetString(0)).Append("\n")
.Append("password:").Append(reader.GetString(1));
}
MessageBox.Show(sb.ToString());

 

 

///
        /// 判断表是否存在,如不存在则创建表
        ///
        ///
        public static void creatTabel(string tableName)
        {
            //判断表是否存在
            string sql = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='"+tableName+"'";

            SQLiteConnection conn = new SQLiteConnection(connectionString);   //connectionString
            SQLiteCommand cmd = new SQLiteCommand(sql, conn);
            conn.Open();
            int recordCount = (int)(Int64)cmd.ExecuteScalar();   //如果存在返回1,不存在返回0

            if (recordCount==0)
            {
                sql = "CREATE TABLE " + tableName + "(username varchar(20),password varchar(20))";
                cmd.CommandText = sql;
                cmd.Connection = conn;
                cmd.ExecuteNonQuery();
            }
            conn.Close();
        }

 

 

 

在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

 

 

   

 

 

(向项目添加 app.config 文件:

右击项目名称,选择“添加”→“添加新建项”,在出现的“添加新项”对话框中,选择“添加应用程序配置文件”;如果项目以前没有配置文件,则默认的文件名称为“  app.config  ”,单击“确定”。出现在设计器视图中的 app.config  文件为:)
 
 
 
 
 
 
 
 
 
 
 
 

C#操作Sqlite快速入门及相关工具收集

Sqlite不需要安装即可使用。
Sqlite是不是那个System.Data.SQLite.DLL临时创建了数据库引擎?

1.新建一个WinForm项目,引用System.Data.SQLite.DLL.界面如下

1.1    SQLiteConnection.CreateFile(“D:/Data.db3”);
这样就可以创建一个数据库文件,名称随意。
封装成一个函数
复制代码
// 创建一个数据库文件,保存在当前目录下HyData文件夹下
// CreateDB("HyData.db3");
private   void  CreateDB( string  dbName)
{
    
string  databaseFileName  =  System.Environment.CurrentDirectory  +   @" /HyData/ "   +  dbName;

    SQLiteConnection.CreateFile(databaseFileName);
}
复制代码

 

1.2  数据库连接字符串

string  connStr  =   @" Data Source= "   +  System.Environment.CurrentDirectory  +   @" \HyData\HyData.db3;Initial Catalog=sqlite;Integrated Security=True;Max Pool Size=10 " ;
这里新建了一个HyData目录存放数据库。

1.3  执行Sql语句
复制代码
// 执行Sql语句
// 创建一个表:  ExecuteSql("create table HyTest(TestID TEXT)");
// 插入些数据:  ExecuteSql("insert into HyTest(TestID) values('1001')");
private   void  ExecuteSql( string  sqlStr)
{
    
using  (DbConnection conn  =   new  SQLiteConnection(connStr))
    {
        conn.Open();
        DbCommand comm 
=  conn.CreateCommand();
        comm.CommandText 
=  sqlStr;
        comm.CommandType 
=  CommandType.Text;
        comm.ExecuteNonQuery();
    }
}
复制代码
执行查询语句
复制代码
// 执行查询
// ExecQuery("select from HyTest");
private   void  ExecQuery( string  sqlStr)
{
    
using  (DbConnection conn  =   new  SQLiteConnection(connStr))
    {
        conn.Open();
        DbCommand comm 
=  conn.CreateCommand();
        comm.CommandText 
=  sqlStr;
        comm.CommandType 
=  CommandType.Text;

        
using  (IDataReader reader  =  comm.ExecuteReader())
        {
            
while  (reader.Read())
            {
                MessageBox.Show(reader[
0 ].ToString());
            }
        }
    }
}

// 执行查询返回DataSet
private  DataSet ExecDataSet( string  sqlStr)
{
    
using  (SQLiteConnection conn  =   new  SQLiteConnection(connStr))
    {
        conn.Open();
        SQLiteCommand cmd 
=  conn.CreateCommand();
        cmd.CommandText 
=  sqlStr;
        cmd.CommandType 
=  CommandType.Text;

        SQLiteDataAdapter da 
=   new  SQLiteDataAdapter(cmd);
        DataSet ds 
=   new  DataSet();
        da.Fill(ds);

        
return  ds;
    }
}
复制代码

本文示例项目源码:HySqlite.rar http://revit.5d6d.net/thread-799-1-1.html

2.Sqlite相关工具

2.1  Sqlite数据库可以到www.sqlite.org下载,非常小
或sqlite-shell-win32-x86-3070600.zip
http://revit.5d6d.net/thread-800-1-1.html

2.2  C#操作Sqlite的官方示例代码,一时忘了url
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  Sqlite两个界面工具

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://www.cnblogs.com/qq419524837/提供)

下载:SQLiteSpyhttp://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)
        {
            //string sql = "INSERT INTO user2 VALUES(1,'a','b',1.0)";
            StringBuilder strSql = new StringBuilder();
            strSql.Append("insert into user11(");
            strSql.Append("id,name,maxlevel,east)");//
            strSql.Append(" values (");
            strSql.Append("@ID,@name,@maxlevel,@east)");//

            //
            SQLiteParameter[] parameters = {
           new SQLiteParameter("@ID", TypeAffinity.Text),
           new SQLiteParameter("@name", TypeAffinity.Text),
                                            new SQLiteParameter("@maxlevel", TypeAffinity.Int64),
                                            new SQLiteParameter("@east", TypeAffinity.Double)
                                           };
            parameters[0].Value = 123;
            parameters[1].Value = "name";
            parameters[2].Value = 111;
            double ddd = 1.0;
            parameters[3].Value = ddd; //ddd.ToString();
            ExecuteSql(strSql.ToString(), parameters);


            //cmd.CommandText = sql;
            //cmd.Connection = conn;
            //cmd.ExecuteNonQuery();
            MessageBox.Show("添加数据成功");
        }

        ///
        /// 执行SQL语句,返回影响的记录数
        ///
        /// SQL语句
        /// 影响的记录数
        public static int ExecuteSql(string SQLString, params SQLiteParameter[] cmdParms)
        {
            using (SQLiteConnection connection = new SQLiteConnection("Data Source=e:\\test1.db;Version=3"))
            {
                using (SQLiteCommand cmd = new SQLiteCommand())
                {
                    try
                    {
                        PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                        int rows = cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                        return rows;
                    }
                    catch (System.Data.SQLite.SQLiteException E)
                    {
                        throw new Exception(E.Message);
                    }
                }
            }
        }

        private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, SQLiteTransaction trans, string cmdText, SQLiteParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            if (trans != null)
                cmd.Transaction = trans;
            cmd.CommandType = CommandType.Text;//cmdType;
            //if (cmdParms != null)  //用此方法出错:“输入字符串的格式不正确”(在执行cmd.ExecuteNonQuery();时)
            //{
            //    foreach (SQLiteParameter parm in cmdParms)
            //        cmd.Parameters.Add(parm);
            //}
            cmd.Parameters.AddWithValue("@ID", cmdParms[0].Value);
            cmd.Parameters.AddWithValue("@name", cmdParms[1].Value);
            cmd.Parameters.AddWithValue("@maxlevel", cmdParms[2].Value);
            cmd.Parameters.AddWithValue("@east", cmdParms[3].Value);
        }

 

 

 

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应用程序运行
x86x86作为32bit应用程序运行作为WoW64应用程序运行作为WoW64应用程序运行
x64x64不运行作为64bit应用程序运行不运行
ItaniumItanium不运行不运行作为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形式的程序,或者只在一个平台下使用,就不必像我说的那样复杂,如果要求很严格,可以试试我在上面所说的方案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值