在C#上读取SQLite,第一个reader正常,第二个怎么都读不出来~~~求高手指点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#上读取SQLite,第一个reader正常,第二个怎么都读不出来~~~求高手指点相关的知识,希望对你有一定的参考价值。

System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection();

conn.ConnectionString = DatabasePath;
conn.Open();
System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand();
cmd.Connection = conn;
string sql;
sql = "SELECT * FROM ini";
cmd.CommandText = sql;
System.Data.SQLite.SQLiteDataReader reader = cmd.ExecuteReader();
bool goahead = true;
string catname = "";
int imax=0;
string tabname = "";
while (reader.Read())

if (CSN == reader.GetInt16(0))

goahead = false;
tabname = reader.GetString(2);
this.Text = reader.GetString(1);
label5.Text = catname;


sql = "SELECT * FROM "+ tabname;
cmd.CommandText = sql;
reader = cmd.ExecuteReader();
int i=1;
Question[] Page=new Question[imax];
while (reader.Read())

Page[i - 1].Number = reader.GetInt16(0);
Page[i - 1].Text = reader.GetString(1);
Page[i - 1].ChoseA = "A" + reader.GetString(2);
Page[i - 1].ChoseB = "B" + reader.GetString(3);
Page[i - 1].ChoseC = "C" + reader.GetString(4);
Page[i - 1].ChoseD = "D" + reader.GetString(5);
Page[i - 1].Answer = reader.GetString(6);
i++;

参考技术A 把第二个Reader分离出来到另一个函数,用不同的CONNECTION,COMMAND 参考技术B reader.Close()没加追问

加了reader.Close()之后直接就报错无法运行了……不知何故

追答

while (reader.Read())

if (CSN == reader.GetInt16(0))

goahead = false;
tabname = reader.GetString(2);
this.Text = reader.GetString(1);
label5.Text = catname;


reader.Close();//你加在这里了没?

追问

谢谢,不过加了reader.dispose(),就好了,加了close后总出错不知为何

本回答被提问者采纳
参考技术C 定义表,直接读表里就完了

SQLite的总结与在C#的使用

这几天接触了一下SQLite,算是有点收获吧,因此总结一下。

SQLite简介:

SQLite是用C语言编写的数据库引擎,可以运行在Linux、Windows、Mac平台上。

SQLite安装简单,下载,解压配置环境变量就好了,之后就可以用命令行进行操作。

SQLite中每个数据库都是以单个文件的形式存在的,传说一个数据库最大容量是2T。

在事物方面,允许多个进程在同一时间从同一数据库读取数据,但是呢,只有一个能进行写操作。

SQLite在使用时,是直接从磁盘上进行数据库读写的,他不支持远程链接。

SQLite的使用场景:

  最常见的就是安卓和IOS开发了,因为SQLite占用空间和内存很小,顶多也就几百k,把一些数据存到本地,不用通过网络与远程数据库交互。

  我还想到一个例子,与IOS开发的同志交流了一会儿,在IOS开发中, 我就问像用户名,密码这些东西是不是也是存到SQLite中了。这个他回答,不用,因为IOS中有一个专门的list集合NSUserDefaults,这个集合就是键值对,存一些基本信息,也可以存很多数据类型。这个我就i想到和H5里面的本地存储一个样,想当初用appcan这种开发混合应用的app时,里面也有个localstorage这样的东西,专门存储一些例如账户密码这些信息。当然IOS里现在有个更牛掰的东西coredata,是面向对象的,更好用。

SQLite命令操作

  1.执行sqlite3命令。
  当执行该命令的时候没有传递任何参数表示默认连接到了一个内存数据库,当退出该程序的时候,数据库自动销毁。
  2.退出命令:.quit 或.exit 。
       3.创建一个数据库:sqlite3 test.db
  注意:创建完毕该数据库后,不会立刻在磁盘上生成对应的文件,需要等待在该数据库中创建对象后,数据库文件才会写入到磁盘上。或者也可以用.databases 命令,也行。

  4.设置查询语句显示样式:
  .mode column  --设置以列的方式显示数据
  .headers on   --设置查询的时候显示列名
  .echo on      --设置执行Sql语句的时候回显,刚执行的命令
  .nullvalue NULL  --设置显示的时候把所有的空值显示为null

  .databases  --显示当前附加到管理器中的所有的数据库

  .tables 显示当前管理器中可以看到的所有的表

  .schema 显示数据库中的内容的脚本

  .schema 对象名  显示某个对象的脚本


  5.创建索引
  create index IX_mytable_name on mytable(name);

  --查看所有的索引
  .indices

  limit n ;等价于t-sql中的top

  offset n;跳过前几条。

6.日期函数:
select date()
select time();
select time(‘now‘,‘localtime‘);  --17:51:16
select datetime(‘now‘,‘localtime‘);--2017-07-06 17:51:35

介绍一款SQLite的管理工具:SQLiteStudio

技术分享

SQLite在C#中使用

  SQLite提供了多种语言操作的API,当然也有C#的。其书写方法几乎和ADO.NET的一摸一样。但是要引用System.Data.SQLite.dll,我们新建项目,用Nuget去直接安装System.Data.SQLite,这样可以。也可以去官网去下载安装包,安装完成之后,去引用这个dll。

表结构:

CREATE TABLE [mytable] (

[id] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,

[value] text  NULL

, email text   null);

 

C#代码:

 

    //创建连接字符串
            string constr = "Data Source=C:/SQLite/test.db;";
            //创建连接对象
            using (SQLiteConnection con = new SQLiteConnection(constr))
            {

                //创建SQL语句
                string sql = "select * from mytable";
                //创建命令对象
                using (SQLiteCommand cmd = new SQLiteCommand(sql, con))
                {

                    con.Open();
                    using (SQLiteDataReader reader = cmd.ExecuteReader())
                    {

                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                Console.WriteLine(reader.GetInt32(0)+" , "+reader.GetString(1));

                            }
                        }
                    }
                }
            }

技术分享

注意:可能会遇到 无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块,这种报错。解决办法,项目引用SQLite.Interop.dll,假如不起作用,替换一下System.Data.SQLite.dll的版本。

 最后,还封装了一个自己的类库,关于SQLite的,以后,该慢慢积累自己的类库了。

 http://git.oschina.net/sdadx/leiku/blob/master/SqlLibrary/SqliteHelper.cs

 
















以上是关于在C#上读取SQLite,第一个reader正常,第二个怎么都读不出来~~~求高手指点的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sql Server 从 C# 中的读取器读取数据

使用 IO 在 C# 中读取十六进制

SQLite的总结与在C#的使用

使用Monitor的Writer / Reader无法正常工作

怎样使用C#对数据库的每一行进行读取?

WinForm杂记:C#操作SQLite数据库(总结)