现在的位置: 首页 > 综合 > 正文

使用.NET(c#)操作SQLLITE

2013年09月15日 ⁄ 综合 ⁄ 共 9121字 ⁄ 字号 评论关闭

使用.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.SQLiteConnectionStringBuilder connstr = new System.Data.SQLite.SQLiteConnectionStringBuilder();
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());

 

 

/// <summary>
        /// 判断表是否存在,如不存在则创建表
        /// </summary>
        /// <param name="tableName"></param>
        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

 

  <startup useLegacyV2RuntimeActivationPolicy="true">

    <supportedRuntime version="v4.0"/>

  </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("添加数据成功");
        }

        /// <summary>
        /// 执行SQL语句,返回影响的记录数
        /// </summary>
        /// <param name="SQLString">SQL语句</param>
        /// <returns>影响的记录数</returns>
        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

抱歉!评论已关闭.