非Windows环境下使用Mono连接Sqlite数据库手记
时间:2010-11-24 来源:aisk
Mono的配套IDE MonoDevelop虽然目前没有VS强大但是对于小型开发来说已经是绰绰有余了,不过目前最大的囧境就是对于Web开发没有设计试图,页面需要自己手动写HTML代码。
首先我们去Mono的项目主页:http://www.mono-project.com/Main_Page下载需要的工具。
对于Windows用户,如果已经安装有.net运行环境,可以不安装Mono运行环境(不过Sqlite的Ado.net驱动得单独下载),需要安装的只有Gtk#以及Monoevelop;
对于Linux用户,常见发行版(Ubuntu、Fedora)已经安装有Mono运行环境以及Gtk#,而Monoevelop可以去软件包管理中安装(主要要把数据库插件选上,如果需要做Web开发的调试服务器而不单独使用Apache的话还要装上XSP这个轻量级Web服务器)以及MonoDevelop;
对于MacOSX用户,需要安装Mono运行环境,Gtk#,以及Monoevelop,另外目前MonoDevelop在Mac下本地化有问题,中文不能正常显示,请删除包中中文简体繁体语言,使用英文。
下面是MonoDevelop的主界面截图:
下面我们新建一个控制台工程,工程名为MonoTest。
接下来在解决方案一栏右击References-Edit References…,添加对Mono.Data.Sqlite的引用(如果使用MS.net运行环境的话请另行下载Sqlite的Ado.net驱动):
然后在.cs中加上using Mono.Data.Sqlite; 接下来的就简单了,所有相关类都以Sqlite打头,比如SqliteConnection,SqliteDataAdapter,SqliteCommand。
下面写一个简单的实例程序,在命令行下运行,可以接受用户指令。
首先,在Main方法中添加一个Do…While…循环,定义一个字符串变量cmd,然后在循环中接受用户输入指令读入cmd中,判断cmd中的字符串,如果为“q”的话推出循环结束程序,如果为未定义指令则提示用户输入错误,如果为定义好的指令的话则执行相应函数。
这里是一个简单的源代码,只实现了简单的创建数据库,打开数据库,关闭数据库,执行输入的Sql语句。创建指令为“create [数据库名]”,打开为“open [数据库名]”,关闭为“close [数据库名]”,执行Sql语句为“sqlcmd [SQL语句]”。更多的功能没有实现,也没有做完善的意外检测,因此运行起来经常出错(表砖我……)
using System;
using System.Data;
using Mono.Data.Sqlite;
using System.IO;
namespace MonoTest
{
class MainClass
{
public static void Main (string[] args)
{
string cmd=null;
SqliteConnection con=new SqliteConnection();
con=null;
do
{
Console.Write(“->”);
cmd=Console.ReadLine();
string[] cmdarr=cmd.Split(‘ ‘);
//foreach(string a in cmdarr)
//{
// Console.WriteLine(a);
//}
if (cmdarr[0]==”create”)
CreateDb(cmdarr[1]);
else if (cmdarr[0]==”open”)
con=OpenDb(cmdarr[1]);
else if (cmdarr[0]==”close”)
{
CloseDb(cmdarr[1],con);
}
else if (cmdarr[0]==”sqlcmd”)
{
string cmdstr=null;
for (int i=1;i<cmdarr.Length;i++)
{
cmdstr=cmdstr+cmdarr[i]+” “;
}
//Console.WriteLine(cmdstr);
ExecuteSqlCmd(cmdstr,con);
}
else
{
Console.WriteLine(“Wrong command line,you can input ‘help’ for help.”);
}
}
while
(cmd!=”q”);
if (con.State==ConnectionState.Open)
con.Clone();
Console.WriteLine(“Quiting…”);
}
protected static void CreateDb (string DbName)
{
//Is this file exists?
if(File.Exists(DbName))
{
Console.WriteLine(“This file is already exist!”);
return;
}
else
{
//Create DatabaseFile
try
{
SqliteConnection.CreateFile(DbName);
Console.WriteLine(“Database File ‘”+DbName+”‘ is created successfully!”);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
return;
}
}
//Open Database
protected static SqliteConnection OpenDb (string DbName)
{
SqliteConnection con=new SqliteConnection(“Data Source=”+DbName);
if (!File.Exists(DbName))
Console.WriteLine(“Database ‘”+DbName+”‘ isn’t exist,please check your input.”);
else
{
//Open Database file
try
{
con.Open();
Console.WriteLine(“Database ‘”+DbName+”‘ opend successfully.”);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
return con;
}
//Close Database
protected static void CloseDb (string DbName,SqliteConnection con)
{
if(con==null)
Console.WriteLine(“There is not a database opend.”);
else
{
if (con.State==ConnectionState.Open)
{
con.Close();
Console.WriteLine(“Database closed successfully.”);
}
else if (con.State==ConnectionState.Closed)
Console.WriteLine(“DThere is not a database opend.”);
}
return;
}
protected static void ExecuteSqlCmd (string CmdStr,SqliteConnection con)
{
if (con.State==ConnectionState.Open)
{
try
{
SqliteCommand sqlcmd=new SqliteCommand(CmdStr,con);
sqlcmd.ExecuteNonQuery();
Console.WriteLine(“SQL command executed successfully.”);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
else if (con==null)
Console.WriteLine(“There is not a Database Connection.”);
else
Console.WriteLine(“There is not a Database Connection.”);
//Console.WriteLine(CmdStr);
return;
}
}
}
运行截图: