- 浏览: 157503 次
- 性别:
- 来自: 广州
最新评论
-
小强_Pumpkin:
写的真好 感谢博主
用 C# 访问 SQLite 入门(1) -
rowanh:
"第二页" 中文无法显示,有什么解决方法吗 ...
在 AIR 生成PDF和显示
用 C# 访问 SQLite 入门 (1)
SQLite 在 VS C# 环境下的开发,网上已经有很多教程。我也是从这些教程开始学习的。而要专门写下这一篇,是因为按照网上教程的例子,会遇到一些问题,特别是一些细节的设置,没有具体涉及,往往就让我这样的初学者碰壁,明明是全部照搬的却不断出错而不知解决方法。这里就特别记录和注明我遇到的问题和解决方法,让其他的初学者可以仿照处理。
这里用到的例子和C#语句,都是从网上来的。
1. 下载安装 Sqlite ADO.NET
可以从 sourceforge 下载: http://sourceforge.net/projects/sqlite-dotnet2/
安装则是按提示进行即可
2. 建立Sqlite 数据库文件
我是在 Firefox 下,安装 SQLite Manager 来建立的。例如,建立一个 Books.sqlite 数据库文件:
从 Firefox 菜单 启动 SQLite Manager, 点 Database -> New Database, 输入数据库文件名
然后选择保存路径,例如 把文件保存到 桌面。
点 Execute SQL , 在 Enter SQL 区域 输入建库语句,如下:
CREATE TABLE Book ( ID INTEGER, BookName VARCHAR(50), Price DOUBLE, Rowguid VARCHAR(70), PRIMARY KEY(ID) )
然后点 Run SQL 即可完成建库工作。
在 SQLite Manager 点 Database -> Close Database, 关闭数据库并退出 SQLite Manager.
3. 新建 C# Project, 引用 sqlite
新建一个 VC# 的 Windows Form Application, 命名为 dg2 (或其他名)。
在 VS 菜单, 点 Project -> Add Reference
在 .NET 下找到 System.Data.SQLite, 点 OK.
注意了,重点步骤:
在 VS 的右边,Soultion Explor , References, 点 System.Data.SQLite
然后, 在下面的 Properties 的 Copy Local, 选 True
这一步很重要,如果没有这个设置,以后在Debug 或 Build 后试运行,会提示找不到 System.Data.SQLite
4. 加入数据库文件
把数据库文件放到一个目录下。先建目录:
在右边的 Solution Explorer, 在Project名字上点鼠标右键,
在弹出选项,选 Add -> New Folder
然后,给 New Folder 改个名字, 例如 db
把数据库文件加入到这个 db 目录之下。
在 db 目录名上 点鼠标右键,在弹出菜单 选 Add -> Existing Item
然后,在打开的文件对话框,找到以前建立的数据库文件。如上面所示的例子,新建的 Books.sqlite 数据库文件是放在 桌面,我们就从桌面找到和选中这个文件,点 Add,即可把这个文件加入 db 目录下。
点一下 这个数据库文件,在下面的 Properties 选项 Copy to output Directory , 必须选 Copy always
注意: 这个设置很重要。否则就找不到数据库文件。
5. 建立相关类文件 Class
在 VS 菜单, 点 Project -> Add Class, 给个名字 Book.cs , 点 Add, 然后输入对 Book类 的定义:
public class Book { private int id; private string bookName; private decimal price; private string rowguid; public int ID { get { return id; } set { id = value; } } public string BookName { get { return bookName; } set { bookName = value; } } public decimal Price { get { return price; } set { price = value; } } public string Rowguid { get { return rowguid; } set { rowguid = value; } } public Book() { } public Book(int _id, string _bookname, decimal _price, string _rowguid) { id = _id; bookName = _bookname; price = _price; rowguid = _rowguid; } }
保存。
类似步骤,输入 数据库操作类: BookDAL.cs
public class BookDAL { public static bool CreateBook(Book book) { try { SQLiteConnection conn = new SQLiteConnection("Data Source=db/Books.sqlite;"); conn.Open(); SQLiteCommand cmd = conn.CreateCommand(); cmd.CommandText = "INSERT INTO Book(ID, BookName, Price, Rowguid) VALUES(@ID1, @BookName1, @Price1, @Rowguid1)"; cmd.Parameters.Add(new SQLiteParameter("ID1", book.ID)); cmd.Parameters.Add(new SQLiteParameter("BookName1", book.BookName)); cmd.Parameters.Add(new SQLiteParameter("Price1", book.Price)); cmd.Parameters.Add(new SQLiteParameter("Rowguid1", book.Rowguid)); int i = cmd.ExecuteNonQuery(); return i == 1; } catch (SQLiteException se) { MessageBox.Show(se.Message + " \n\n" + se.Source + "\n\n" + se.StackTrace + "\n\n" + se.Data); return false; } catch (ArgumentException ae) { MessageBox.Show(ae.Message + " \n\n" + ae.Source + "\n\n" + ae.StackTrace + "\n\n" + ae.Data); return false; } catch (Exception ex) { //Do any logging operation here if necessary MessageBox.Show(ex.Message + "\n\n" + ex.Source + "\n\n" + ex.StackTrace + "\n\n" + ex.Data); return false; } } public static bool UpdateBookByID(Book book) { try { using (SQLiteConnection conn = new SQLiteConnection("Data Source=db/Books.sqlite;")) { conn.Open(); SQLiteCommand cmd = conn.CreateCommand(); cmd.CommandText = "update Book set BookName=@BookName1,Price=@Price1, Rowguid=@Rowguid1 where ID=@ID1;"; cmd.Parameters.Add(new SQLiteParameter("ID1", book.ID)); cmd.Parameters.Add(new SQLiteParameter("BookName1", book.BookName)); cmd.Parameters.Add(new SQLiteParameter("Price1", book.Price)); cmd.Parameters.Add(new SQLiteParameter("Rowguid1", book.Rowguid)); int i = cmd.ExecuteNonQuery(); return i == 1; } } catch (ArgumentException ae) { MessageBox.Show(ae.Message + " \n\n" + ae.Source + "\n\n" + ae.StackTrace); return false; } catch (Exception ex) { //Do any logging operation here if necessary MessageBox.Show(ex.Message); return false; } } public static bool UpdateBookByGuid(Book book) { try { using (SQLiteConnection conn = new SQLiteConnection("Data Source=db/Books.sqlite;")) { conn.Open(); SQLiteCommand cmd = conn.CreateCommand(); cmd.CommandText = "update Book set ID=@ID1,BookName=@BookName1,Price=@Price1 where Rowguid=@Rowguid1;"; cmd.Parameters.Add(new SQLiteParameter("ID1", book.ID)); cmd.Parameters.Add(new SQLiteParameter("BookName1", book.BookName)); cmd.Parameters.Add(new SQLiteParameter("Price1", book.Price)); cmd.Parameters.Add(new SQLiteParameter("Rowguid1", book.Rowguid)); int i = cmd.ExecuteNonQuery(); return i == 1; } } catch (ArgumentException ae) { MessageBox.Show(ae.Message + " \n\n" + ae.Source + "\n\n" + ae.StackTrace); return false; } catch (Exception ex) { //Do any logging operation here if necessary MessageBox.Show(ex.Message); return false; } } public static bool DeleteBook(int ID) { try { using (SQLiteConnection conn = new SQLiteConnection("Data Source=db/Books.sqlite;")) { conn.Open(); SQLiteCommand cmd = conn.CreateCommand(); cmd.CommandText = "delete from Book where ID=@ID;"; cmd.Parameters.Add(new SQLiteParameter("ID", ID)); int i = cmd.ExecuteNonQuery(); return i == 1; } } catch (ArgumentException ae) { MessageBox.Show(ae.Message + " \n\n" + ae.Source + "\n\n" + ae.StackTrace); return false; } catch (Exception ex) { //Do any logging operation here if necessary MessageBox.Show(ex.Message); return false; } } public static Book GetBookByID(int ID) { try { using (SQLiteConnection conn = new SQLiteConnection("Data Source=db/Books.sqlite;")) { conn.Open(); SQLiteCommand cmd = conn.CreateCommand(); cmd.CommandText = "select * from Book where ID=@ID;"; cmd.Parameters.Add(new SQLiteParameter("ID", ID)); SQLiteDataReader dr = cmd.ExecuteReader(); if (dr.Read()) { Book book = new Book(); book.ID = dr.GetInt32(0); book.BookName = dr.GetString(1); book.Price = dr.GetDecimal(2); return book; } else return null; } } catch (ArgumentException ae) { MessageBox.Show(ae.Message + " \n\n" + ae.Source + "\n\n" + ae.StackTrace); return null; } catch (Exception ex) { //Do any logging operation here if necessary throw new Exception(ex.Message); } } public static DataTable GetAllBook() { DataTable dt = new DataTable(); try { SQLiteConnection conn = new SQLiteConnection("Data Source=db/Books.sqlite;"); conn.Open(); SQLiteCommand cmd = new SQLiteCommand(conn); cmd.CommandText = "SELECT * FROM Book"; cmd.CommandType = CommandType.Text; //Console.WriteLine(cmd.CommandText); SQLiteDataReader dr = cmd.ExecuteReader(); if (dr.HasRows) { dt.Load(dr); } else { //throw new NullReferenceException("No Record Available."); } dr.Close(); conn.Close(); } catch (ArgumentException ae) { MessageBox.Show(ae.Message + " \n\n" + ae.Source + "\n\n" + ae.StackTrace + "\n\n" + ae.Data); } catch (Exception ex) { //throw new Exception(ex.Message); MessageBox.Show(ex.Message + " \n\n" + ex.Source + "\n\n" + ex.StackTrace + "\n\n" + ex.Data); } return dt; } }
在数据库操作类,因为涉及数据库的操作,要在 using 部分,必须加入 using System.Data. SQLite 的引用等语句。
using System.Data; using System.Data.SQLite; using System.Windows.Forms;
注意了:
初学者都喜欢用别人的代码来做练习,拷贝过来,粘贴上去,可减少敲键盘的时间。但是,在网页上拷贝代码,然后贴到 VS里,会引起很多问题。例如 html 的控制符,空格等等,导致以后程序运行出错,而且不知道错误在哪里。明明在屏幕上看到人家的代码 与 你的代码是一样的,但就是出错。这个时候,就要仔细看看控制符和代码的问题。
要减少这类问题,在网页拷贝的代码, 先粘贴到一个纯文本的编辑器,例如 Notepad++ , 然后从 Notepad++ 选择和复制, 再粘贴到 VS 。
对于粘贴过来的代码,要特别注意其空格。例如, 下面这个就是从粘贴后的代码:
可以看到 第14行,18行 等的 空格特别长,当移动光标的时候,它是一个 空格!但实际上它并不是一个空格。一旦运行程序,就会提示记录记录为空,实际上是找不到 数据库文件,或 SQL语句错误等等。
处理的办法很简单, 就是在这些语句,手工逐个把空格删掉,然后按一下空格键加上空格。就可以发现自己加的空格位是比较小的,呵呵。
这些操作没有任何技术含量,但也值得分享一下,
:-
相关推荐
5. **ADO.NET数据库访问**:在25-29章中,读者将学习如何使用C#连接和操作数据库,包括SQL Server或SQLite等。内容涵盖数据连接、数据适配器、数据集、数据表以及存储过程的使用。 6. **高级主题**:除了基础内容,...
内容概要:本文档介绍了管理系统的基本概念以及开发过程,着重于如何用C#语言配合SQLite数据库从零开始创建一个简化的库存管理系统,涉及数据模型定义、数据访问层建立和控制器设计等多个方面。此外,还提及了实际...
【C#版QQ入门项目详解】 C#版QQ是一个基于C#编程语言开发的即时通讯软件,它允许用户通过输入IP地址与其他用户进行聊天并实现添加好友等功能。这个项目不仅涵盖了C#的基础语法和面向对象编程思想,还涉及到网络通信...
在C# WinForm中,我们通常使用ADO.NET(.NET Framework的数据访问组件)来与数据库进行交互。ADO.NET提供了DataSet、DataTable、DataRow等类,它们可以在内存中存储和操作数据,同时DataAdapter用于在数据库和内存中...
创建和管理数据库文件,定义表结构,以及操作数据的基本SQL语句(如CREATE、INSERT、SELECT、UPDATE、DELETE)是SQLite入门的基础。 2. **事务处理**:SQLite支持ACID(原子性、一致性、隔离性和持久性)事务,确保...
1. **变量、表达式和基本结构**:这部分讲解了C#的基础语法,如数据类型(包括整型、浮点型、字符串等)和变量的声明与使用。学习者会了解到如何定义常量,以及如何使用各种运算符,如算术运算符、比较运算符和逻辑...
总的来说,"宾馆网站模板.NET2.0+SQLite(带源码)"是一个集成了前后端和数据库的完整示例,可以帮助初学者快速入门ASP.NET Web Forms开发,并了解如何与SQLite数据库进行集成。对于有一定基础的开发者,这个模板也是...
《C#数据库入门经典》是一本专为初学者设计的指南,旨在帮助读者掌握使用C#语言进行数据库操作的基础知识。这本书涵盖了多个重要的知识点,包括C#与SQL的交互、OLEDB和ADO.NET数据访问技术。以下是这些核心概念的...
C# .NET允许开发者使用多线程和异步编程模型来处理实时数据,确保程序在处理大量数据时仍能保持响应。Task类和async/await关键字是实现异步操作的强大工具。 六、可视化和图表展示 工控上位机往往需要实时显示设备...
7. **多媒体与硬件访问**:讲解如何利用C#访问Android的摄像头、GPS、传感器等硬件设备,以及处理音频、视频等多媒体内容的方法。 8. **调试与性能优化**:书中会介绍使用Visual Studio或Monodevelop进行Android...
《C#数据库入门经典(第2版)》是一本针对初学者深入浅出介绍如何使用C#语言进行数据库操作的权威教程。这本书以其丰富的实例和详细的源代码,为读者提供了全面的学习路径,帮助他们掌握数据库编程的核心技能。 C#...
《C# Windows应用程序开发入门详解》 C#作为.NET框架的核心编程语言,因其简洁、高效、类型安全等特性,被广泛应用于Windows桌面应用程序的开发。本资源“经典C#入门案例.rar”提供了一系列完整的开源代码,旨在...
【C#入门级程序的源代码】是一个针对初学者的编程资源,主要涵盖了使用C#语言和ASP.NET框架开发窗体应用的基础知识。这个程序是一个简单的图片管理程序,旨在帮助学习者理解如何在C#环境下处理图形用户界面(GUI)...
2. 数据库访问:ADO.NET是.NET框架的一部分,用于连接和操作数据库,如SQL Server、SQLite等。 七、多线程与并发 C#支持多线程编程,通过Thread类或Task类实现并发执行,提高程序性能。 八、单元测试与调试 Visual...
在本教程中,你将学习如何在C#中管理用户账户,创建安全的登录系统,使用加密技术保护敏感信息,以及实现基于角色的访问控制。这些知识对于构建安全的Web应用至关重要。 数据库操作是大多数应用程序的基础。教程会...
1. **C#语言基础**:包括变量、数据类型、常量、运算符、控制结构(如if语句、switch语句、for循环、while循环和do-while循环)、数组、字符串以及方法的使用。 2. **面向对象编程**:C#是一种面向对象的语言,书中...
1. **书籍信息管理**:在C#源码中,可以创建一个名为`Book`的类,包含书籍的ID、书名、作者、出版社、出版日期等属性,并提供添加、删除、修改和查找书籍的方法。这些方法可能涉及数据库操作,使用ADO.NET或Entity ...
C#语法清晰,功能强大,适合初学者入门,也满足高级开发者的复杂需求。 在这个学生管理系统中,开发者可能使用了C#的类、对象、接口等核心概念来构建系统架构。例如,可能会有一个`Student`类,用于表示学生信息,...
1. 文档:可能是Markdown或PDF格式的教程,详细说明了如何开始设置和使用EF6与SQLite的CodeFirst开发。 2. 示例项目:一个简单的.NET项目,展示了如何配置和使用EF6与SQLite的代码示例。 3. 图像或图表:可能用于...
为了更好地组织代码,通常会将数据库表映射为C#类(实体类),并在数据访问层(DAL)实现与数据库的交互。实体类代表了数据库中的记录,而DAL则封装了对数据库的所有操作,这样可以提高代码的可读性和可维护性。 五...