本站网址: YippeeSoft开心软件

本文链接: 20070810 smartphone sqlite

20070810 smartphone sqlite
http://www.yippeesoft.com

同事作终端,用了SQLITE,可是数据库操作有点慢
我问了一下,结果同事说底层软件不能和PC比什么的
我觉得作为一个嵌入式数据库,也不可能太慢

找了找资料
硬件配置上,MPX220采用了ARM4 OMAP1611的204MHz CPU

sqlite支持大部分sql92标准,创建表时注意下面几点:
先给个普遍使用的sql语句:CREATE TABLE "user" ("uid" integer PRIMARY KEY , "name" varchar (50) NOT NULL , "password" varchar (32) NOT NULL)
这里注意几点:
“INTEGER PRIMARY KEY”,表示自动增长的id,插入行时留空就能自动增长,如:INSERT INTO "user" ("uid", "name", "password") VALUES (NULL, \’name\’, \’pssword\’),或者INSERT INTO "user" ("name", "password") VALUES (\’name\’, \’pssword\’),另外sqlite允许插入被删除的id,如:DELETE FROM "user" WHERE "uid" = 0; INSERT INTO "user" ("uid", "name", "password") VALUES (1, \’name\’, \’pssword\’),

在插入数据和查询时都会经常遇到单引号(\’)的问题,轻则查询出错,重则导致sql注入,sqlite插入\’和mssql一样,使用\’\'来插入,同样不能插入(\\0),使用时比较简单的方法就是使用php自带的函数(sqlite_escape_string)来格式化,可以参考后面我给的类,注意sqlite_escape_string格式化时比较特别,不是只是简单的把\’转为\’\',具体可以查看php的帮助文档。

有没有注意到"user"呢,这里用双引号(")包括起来,在我们平时比较常见的mssql里是用[]来标记,mysql是用“来标记,不过sqlite比较。。。不知道怎么形容,看例子:
CREATE TABLE \’user\’ (\’uid\’ integer PRIMARY KEY , \’name\’ varchar (50) NOT NULL , \’password\’ varchar (50) NOT NULL)
CREATE TABLE "user" ("uid" integer PRIMARY KEY , "name" varchar (50) NOT NULL , "password" varchar (32) NOT NULL)
CREATE TABLE [user] ([uid] integer PRIMARY KEY , [name] varchar (50) NOT NULL , [password] varchar (32) NOT NULL)
上面3条语法都是可以的。
这里注意下,在mssql环境中我们有时候是使用CREATE TABLE [user] ([uid] [int] PRIMARY KEY , [name] [varchar] (50) NOT NULL , [password] [varchar] (32) NOT NULL),就是字段类型中我们可以使用[]来包括起来,而在sqlite下是不行的。另外还有地方:CREATE INDEX user_name ON "user" ("name"),发现没有,索引中的名字没有用"包括起来,不知道怎么搞的。。如果用了"或\’或[]就不能正常索引了貌似。

这是PC上的
try
&leftsign;
     //Connection string
     string connString = String.Format("Data Source=&leftsign;0&rightsign;;New=False;Version=3", DB_NAME);
     
     //Connecting database
     SQLiteConnection sqlconn = new SQLiteConnection(connString);
     
     //Open the connection
     sqlconn.Open();

     //Query
     string CommandText = "Select name from sqlite_master;";

     //SQLiteDataAdapter to fill the DataSet
     SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(CommandText, sqlconn);
     dataAdapter.Fill(ds);

     //Get the collection of rows from the DataSet
     DataRowCollection dataRowCol = ds.Tables[0].Rows;

     //Add the tables available in the DB to the combo box
     foreach (DataRow dr in dataRowCol)
     &leftsign;
         tablecombobox.Items.Add(dr["name"]);
     &rightsign;
     
     //Close the Connection
     sqlconn.Close();

&rightsign;              
catch (SQLiteException sqlex)
&leftsign;
   MessageBox.Show(sqlex.Message);
&rightsign;

手机:
SQLiteConnection conn = new SQLiteConnection();
           conn.ConnectionString = "Data Source=\\\\Storage\\\\Program Files\\\\t2\\\\test1.db;Version=3;New=False;Compress=True;";
           conn.Open();
           if (conn.State != ConnectionState.Open)
               return;
           SQLiteCommand cmd = conn.CreateCommand();
           cmd.CommandText = "select sff from sf where ss=\’"+textBox2.Text+"\’";
           IDataReader r= cmd.ExecuteReader();

           if (r.Read())
           &leftsign;
               textBox1.Text=r.GetString(0);
           &rightsign;

用VS2005的设备仿真器倒是和ACTIVESYNC连接了,可是该死的VS2003却没有办法进行TCP连接

例如
string time=DateTime.Now.ToString("yyyyMMddHHmmss");
DateTime dt=Convert.ToDateTime(time);
后面那句怎么改,才会成功转换回来?
DateTime dt = DateTime.ParseExact(time,"yyyyMMddHHmmss",System.Globalization.CultureInfo.CurrentCulture);

例如  
 —–表———  
 id     name     age   sex  
 1       tom       18     male  
 —————-  
 如何实现如果表中存在   name   =“tom”则更新   age   =   20  
 如果没有的话,则插入一条新的记录。
 string   sql   =   @"  
 IF   EXISTS   (SELECT   *   FROM   表   WHERE   [name]=\’tom\’)  
     UPDATE   …  
 ELSE  
     INSERT   …  
 END  
 ";  

 SqlCommand   cmd   =   new   SqlCommand("select   count(*)   from   theTable   where   [name]=\’tom\’",   cn);  
 int   c   =   int.Parse(cmd.ExecuteScalar().ToString());  
 
 if   (c   >0)  
 &leftsign;  
 //更新  
 &rightsign;  
 else  
 &leftsign;  
 //插入  
 &rightsign;

 string   sql   =   @"  
 IF   EXISTS   (SELECT   *   FROM   [表]   WHERE   [name]=\’tom\’)  
     UPDATE   [表]   SET   [age]=20   WHERE   [name]=\’tom\’  
 ELSE  
     INSERT   INTO   [表]   ([name],[age],[sex])   VALUES   (\’tom\’,20,\’male\’)  
 END  
 ";  
 
 一条SQL语句就足够了,   用不着象楼上的那么麻烦.  

 string   sql   =   @"  
 IF   EXISTS   (SELECT   *   FROM   [表]   WHERE   [name]=\’tom\’)  
     UPDATE   [表]   SET   [age]=20   WHERE   [name]=\’tom\’  
 ELSE  
     INSERT   INTO   [表]   ([name],[age],[sex])   VALUES   (\’tom\’,20,\’male\’)  
 END  
 ";  
 
 或者可以写在存储过程里

 还不如简单一点  
 直接先做一个Delete,然后Insert  
 
 如果存在,删除后新增,逻辑上没有问题,结果也是正确的  
 如果不存在,删除语句不作任何影响,再添加,效果相同  
 
 反正2次数据库操作是必然的了  
 那又何必多做一次无意义的If运算呢
 文件操作

若要执行此操作… 请参阅本主题中的示例…
创建文本文件 向文件写入文本  
写入文本文件 向文件写入文本  
读取文本文件 从文件读取文本  
向文件中追加文本 File.AppendText FileInfo.AppendText  
重命名或移动文件 File.Move FileInfo.MoveTo  
删除文件 File.Delete FileInfo.Delete  
复制文件 File.Copy FileInfo.CopyTo  
获取文件大小 FileInfo.Length  
获取文件属性 File.GetAttributes  
设置文件属性 File.SetAttributes  
确定文件是否存在 File.Exists  
读取二进制文件 对刚创建的数据文件进行读取和写入  
写入二进制文件 对刚创建的数据文件进行读取和写入  
检索文件扩展名 Path.GetExtension  
检索文件的完全限定路径 Path.GetFullPath  
检索路径中的文件名和扩展名 Path.GetFileName  
更改文件扩展名 Path.ChangeExtension  

目录操作

System.IO 类

目录操作
string[] drives = Directory.GetLogicalDrives(); //本地驱动器的名,如:C:\\等
string path = Directory.GetCurrentDirectory();    //获取应用程序的当前工作目录
Path.GetFileName(@"c:\\dir\\file.txt");             //获取子目录的名字,result的结果是file.txt
Directory.GetFiles(路径及文件名)                  //获取指定目录中的文件名(文件列表)
DirectoryInfo di = new DirectoryInfo(@"f:\\MyDir"); //构造函数创建目录
DirectoryInfo di=Directory.CreateDirectory(@"f:\\bbs"); //创建对象并创建目录
if (di.Exists == false) //检查是否存在此目录
di.Create(); //创建目录
DirectoryInfo dis = di.CreateSubdirectory("SubDir"); //以相对路径创建子目录
dis.Delete(true); //删除刚创建的子目录
di.Delete(true); //删除创建目录

文件操作
Directory.Delete(@"f:\\bbs2", true); //删除目录及其子目录和内容(如为假不能删除有内容的目录包括子目录)
Directory.GetDirectories 方法 //获取指定目录中子目录的名称
string[] dirs = Directory.GetDirectories(@"f:\\", "b*");
Console.WriteLine("此目录中以b开头的子目录共&leftsign;0&rightsign;个!", dirs.Length);
foreach (string dir in dirs) &leftsign; Console.WriteLine(dir); &rightsign;
Directory.GetFileSystemEntries //获取指定目录中的目录及文件名
Directory.GetLogicalDrives //检索此计算机上格式为“<驱动器号>:\\”的逻辑驱动器的名称,【语法同上】
Directory.GetParent //用于检索父目录的路径。
DirectoryInfo a = Directory.GetParent(path);
Console.WriteLine(a.FullName);Directory.Move //移动目录及其在内的所有文件
Directory.Move(@"f:\\bbs\\1", @"f:\\bbs\\2"); //将文件夹1内的文件剪到文件夹2内 文件夹2是刚创建的

Stream // 对字节的读写操作(包含对异步操作的支持) Reading Writing Seeking

BinaryReader和BinaryWriter // 从字符串或原始数据到各种流之间的读写操作

FileStream类通过Seek()方法进行对文件的随机访问,默认为同步

TextReader和TextWriter //用于gb2312字符的输入和输出

StringReader和StringWriter //在字符串中读写字符

StreamReader和StreamWriter //在流中读写字符

BufferedStream 为诸如网络流的其它流添加缓冲的一种流类型.

MemoryStream 无缓冲的流

NetworkStream 互联网络上的流

//编码转换
Encoding e1 = Encoding.Default;               //取得本页默认代码
Byte[] bytes = e1.GetBytes("中国人民解放军"); //转为二进制
string str = Encoding.GetEncoding("UTF-8").GetString(bytes); //转回UTF-8编码

原创文章,转载请注明: 转载自YippeeSoft开心软件

本文链接地址: 20070810 smartphone sqlite

历史博文

标签:, , , ,