首页 新闻 会员 周边 捐助

SQLite 查询不会

0
悬赏园豆:20 [已解决问题] 解决于 2013-06-17 16:30

额,新手,一点不会sqlite,想要查询一个表而已,却不太会,在网上找了些但都不对,帮忙解答下吧。

代码是这样的

private DataTable KeyWordsBindForGridControlTable1()
        {
            DataTable dataT = new DataTable();
            using (SQLiteConnection cn = new SQLiteConnection("Data Source=D://test.db;Pooling=true;FailIfMissing=false"))
            {
                cn.Open();
                using (SQLiteCommand cmd = new SQLiteCommand())
                {
                    cmd.Connection = cn;
                    cmd.CommandText = "SELECT * FROM [KeywordTable]  limit 20";
                    SQLiteDataReader drs = cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly);
                    dataT = drs.GetSchemaTable();
                    
                    //DataTable schemaTable = cn.GetSchema("KeywordTable"); //这句报错,不支持这样使用
                }
            }
            return dataT;
        }

可视化工具中看到的表是这样的:

这个第一列是表的字段啊,不应该是这样的,想要把查询出来的表直接绑定到Grid中呢,

所以求一个查询sqlite表的代码,先谢过啦~

W宁宁的主页 W宁宁 | 小虾三级 | 园豆:522
提问于:2013-06-17 15:20
< >
分享
最佳答案
0

using (SQLiteConnection conn = new SQLiteConnection(this.textBox1.Text))             {                 try                 {                     conn.Open();                       string cmdText = string.Format(@"select * from zentry");                     using (SQLiteCommand cmd = new SQLiteCommand(cmdText, conn))                     {                         SQLiteDataReader dr = cmd.ExecuteReader();                         while (dr.Read())                         {                             string content = dr.GetString(7);                             double secondsAbove = dr.GetDouble(6);                             DateTime begin = new DateTime(2000, 1, 1, 0, 0, 0);                             DateTime now = begin.AddSeconds(secondsAbove);                             this.richTextBox1.AppendText(now.ToString("yyyy-MM-dd HH:mm:ss") + "::::" + content + "\r\n");                           }                                 }

                }                 catch (Exception x)                 {

                }             }

收获园豆:7
甲_乙_丙_丁 | 小虾三级 |园豆:804 | 2013-06-17 15:44

这个也试过啦,这个是获取某一条数据之后就各个列的信息赋值给局部变量吧,我要的是一整张表的.....

W宁宁 | 园豆:522 (小虾三级) | 2013-06-17 15:48

@W宁宁: 

这是你的语句:

 SQLiteDataReader drs = cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly);
                    dataT
= drs.GetSchemaTable();
这表示啥?这表示你想要SchemaTable,就是数据列的信息。

你看我的代码呢,直接就执行了查询:

 string cmdText = string.Format(@"select * from zentry");
                    using (SQLiteCommand cmd = new SQLiteCommand(cmdText, conn))
                    {
                        SQLiteDataReader dr = cmd.ExecuteReader();
                        while (dr.Read())
                        {
                            string content = dr.GetString(7);

=============================================

看出差别了吧?你设定了一个查询语句“SELECT * FROM [KeywordTable]  limit 20”,但是木有执行之。

甲_乙_丙_丁 | 园豆:804 (小虾三级) | 2013-06-17 16:10

怎么没有执行啦?不是给cmd.CommandText啦么。而且重点就是我不知道怎么获得表数据,我就找到了GetSchemaTable()这个啊

W宁宁 | 园豆:522 (小虾三级) | 2013-06-17 16:16

@W宁宁: 
 cmd.ExecuteReader();

这不就是一个?

还有很多其他方法吧,直接获得DataTable也是可以的吧。

甲_乙_丙_丁 | 园豆:804 (小虾三级) | 2013-06-17 16:18

@随心所欲:  对,没重点就是想要直接获得DataTable

W宁宁 | 园豆:522 (小虾三级) | 2013-06-17 16:22

@W宁宁: 

 while (dr.Read())
                        {
                            string content = dr.GetString(7);
                         }

您这样一条一条的循环读取不久完了吗?或者直接自己创建一个DataTable,然后一条一条赋予到DataTable里面也不费事啊,三五句代码的事情。

甲_乙_丙_丁 | 园豆:804 (小虾三级) | 2013-06-17 16:26

@随心所欲: 哈哈,被你拣到了哦,用SQLiteDataAdapter 就解决啦,谢谢啦

W宁宁 | 园豆:522 (小虾三级) | 2013-06-17 16:32

@W宁宁: 

你理解了ADO.Net的结构,就不怕这些小问题了。

甲_乙_丙_丁 | 园豆:804 (小虾三级) | 2013-06-17 16:43

@W宁宁: SQLiteDataAdapter.....汗止不住的流

Porbonan | 园豆:183 (初学一级) | 2013-06-17 16:56
其他回答(4)
0

lz是实现什么功能?把查到的结果绑到datagrid? 

这个第一列是表的字段啊,不应该是这样的,想要把查询出来的表直接绑定到Grid中呢

第一列就是表的字段啊,第二列是字段编号也就是列号,第三列是长度,都是字段的信息,没有问题

收获园豆:4
WuRang | 园豆:1730 (小虾三级) | 2013-06-17 15:30

好吧,按你这么说的话是表的信息,但是我要的是表的内容,这个表所存储的数据

支持(0) 反对(0) W宁宁 | 园豆:522 (小虾三级) | 2013-06-17 15:35

@W宁宁: 

dataT = drs.GetSchemaTable();你已经到得KeywordTable这个表的所有内容了,都存在
dataT 这个datatable中,你只需要把它作为数据源绑到datagrid上就行了。另外,你要看表的内容就在ds可视化工具“表”的下拉菜单中切换,SchemaTable是概要图表
支持(0) 反对(0) WuRang | 园豆:1730 (小虾三级) | 2013-06-17 15:42

@WuRang: “表”下拉中并没有其他的选择啊,我之前有直接绑定到DataGrid上的,但是显示的绑定后的数据和我在问题中截图的表一样~不是数据啊

支持(0) 反对(0) W宁宁 | 园豆:522 (小虾三级) | 2013-06-17 15:54

@W宁宁: 

看到问题了,

cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly); 
dataT = drs.GetSchemaTable();
这两句read到的是Schema,不是内容。可以自己写一个方法
 
public DataTable ExecuteDataTable(string sql, SQLiteParameter[] parameters) 
{ 
using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 
{ 
using (SQLiteCommand command = new SQLiteCommand(sql, connection)) 
{ 
if (parameters != null) 
{ 
command.Parameters.AddRange(parameters); 
} 
SQLiteDataAdapter adapter = new SQLiteDataAdapter(command); 
DataTable data = new DataTable(); 
adapter.Fill(data); 
return data; 
支持(1) 反对(0) WuRang | 园豆:1730 (小虾三级) | 2013-06-17 16:29

@WuRang: 谢谢大侠,刚刚结贴没看到最后发的这个!对不起啦

支持(0) 反对(0) W宁宁 | 园豆:522 (小虾三级) | 2013-06-17 16:34
0

你的代码是没错的。你在可视化工具中看到的数据, 是因为你选择的表是SchemaTable。注意看你的截图的左上角,那里可以切换表显示。

 

还有就是你的DataReader为何要那样用?你要读数据,直接用DataAdapter直接将数据Fill到DataTable即可。

收获园豆:5
幻天芒 | 园豆:37205 (高人七级) | 2013-06-17 15:37

但是不可以选择的啊,

dataT = drs.GetSchemaTable();

这个就是获得SchemaTable表吧,我刚刚找了下,也没有找到直接获取表的方法啊

支持(0) 反对(0) W宁宁 | 园豆:522 (小虾三级) | 2013-06-17 15:44

@W宁宁: 你是获取数据啊~Command的执行命令,获取数据要用DataAdapter。

如果执意要Command->DataReader,那么读数据也应该是while(reader.Read()){获取数据...}

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2013-06-17 16:03
0

GetSchemaTable()本来就是获取表的描述信息的,你直接cmd.ExecuteDataTable()不就可以了

收获园豆:2
SuperPiggy | 园豆:228 (菜鸟二级) | 2013-06-17 16:04

没有这个的

支持(0) 反对(0) W宁宁 | 园豆:522 (小虾三级) | 2013-06-17 16:11
0

看的直迷糊,啥时候查表也这么麻烦了,帮顶~

收获园豆:2
Porbonan | 园豆:183 (初学一级) | 2013-06-17 16:05

哈哈哈是吧,只要把它解决了就都不是问题了(小吹一下)

支持(0) 反对(0) W宁宁 | 园豆:522 (小虾三级) | 2013-06-17 16:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册