其实我们建立了同样名称的数据库登录用户后,数据库中的表我们照样不能使用时因为sid的不同,就是系统登录表和数据库用户表中的用户名相同,单是sid字段,数据库中的还是以前旧系统的sid值,所以我们就要把它对应成我们新建的,数据库靠sid来识别用户。
这里可以使用存储过程sp_change_users_login。它有三种动作,分别是report,update_one和auto_fix。
运行sp_change_users_login ‘report’,系统会列出当前数据库的孤立用户数。
我们只需要选择当前数据库为testdb,然后运行
sp_change_users_login ‘update_one’,’test’,’test’
系统就会提示修复了一个孤立用户。
如果没有建立test的登录用户,还可以用
sp_change_users_login ‘Auto_Fix’, ‘test’, NULL, ‘testpassword’
来创建一个登录用户名为test,密码为testpassword的用户与之对应。
好了,到这里通常情况下,数据库对象得到访问问题已经解决了。如果有多个数据库中有同一个用户的数据表,只需要选择不同的数据库,执行update_one的那个就行了。
根据SQLite 的原子提交原则,任何时候,都只有一个排它的"写入锁",当一个事务发生了写入操作,其后任何其他线程/进程都将不能写入数据库的任何一部分.
测试表明,如果发生并发写入,线程将陷入停顿状态,竞争锁的双方都不能继续往下执行.这将导致严重的并发问题.
由上面的分析得知,尽管SQLite可以同时使用多个事务,但始终只用一个事务能够写入数据,所以,可以等同的认为,SQLite只用一个事务.
* 注:普通的查询操作也是默认带事务的.
申明一个全局(静态)的事务对象,在程序任何地方使用事务,都将使用该事务对象。如果同时有其他的更新操作,也将使用该事务对象,从而保证所有的事务操作 为一个事务对象,避免数据库被其他线程锁定。另外,由于没有使用分散的多个事务,有助于改善应用程序的整体性能。
* 注:本策略不适合高度并发的场合,如果想取得较高的并发性能,请尽量缩短事务使用的时间,或者使用其他RDBMS。
---sqlite3数据库 整个数据库备份
C:>sqlite3 test.sqlite3
SQLite version 3.5.4
Enter ".help" for instructions
sqlite> .output test.sqlite3.sql
sqlite> .dump
sqlite> .exit
C:> sqlite3
---数据库 单个表备份
C:>sqlite3 test.sqlite3
SQLite version 3.5.4
Enter ".help" for instructions
sqlite> .tables messages schema_info
sqlite> .output test_messages.sqlite3.sql
sqlite> .dump messages
sqlite> .exit
C:> sqlite3
---数据库 恢复,适合整库及单表
C:>sqlite3 new.sqlite3
SQLite version 3.5.4
Enter ".help" for instructions
sqlite> .read test.sqlite3.sql
sqlite> .exit
C:>
前些日子我发了一份ASP.NET面试题 清单. 有一些访客比较保守,觉得我是没事找事,里面都是些很琐碎的问题。剩下的人则说“蛮不错的,我得去看一看其中的一些问题” 我更喜欢后者的回复,我觉得后者才是正确的态度。
当然我并不想把.NET软件开发概括为一些简单的小问题,我只是想让大家多思考。我相信一个真正优秀的ASP.NET(及WinForm)开发人员应该不仅仅会拖放控件到设计器中,也应该掌握更多的东西。一个优秀的赛车比赛选手很了解他自己的坐驾,他知道哪些可以做?哪些不能做?
所以我准备了另外一份清单——一份扩展的清单,供你使用。这是我上个星期在从博伊西去波特兰的路上写在一块板上的,并且我也考虑到了那些觉得我的清单过于琐碎的意见,试图把这个清单按节管理。如果你从来没有深入ASP.NET,你肯定不会知道所有ASP.NET问题的答案。如果你是一个独立顾问,你可能从来没有遇到过这些概念。但在我呆在科林斯的这4年中,这些问题我都遇到过。因此,是否全面理解这些问题也许与你是不是一个优秀的开发者没有关系,但在遇到问题时它的确可以帮你节省不少时间。
参考手册
1. The C++ Programming Language (Special Edition), Bjarne Stroustrup
裘宗燕(译), 机械工业出版社
C++始创者、一代宗师Bjarne Stroustrup的经典之作,仅次于C++标准的权威书籍。
2. C++ Primer 3th, Stanley B.Lippman, Josee Lajoie
潘爱民(译), 张丽(译), 中国电力出版社
C++元老Stanley B.Lippam撰写的C++语法、语义层面的百科全书,极具参考价值。
3. The C++ Standard Library : A Tutorial and Reference, Nicolai M. Josuittis
侯捷(译), 孟岩(译), 华中科技大学出版社。
专业C++程序员必备的C++标准程序库(ISO98)的参考手册,也是新手学习标准库的良好教程。
1. 你们的项目组使用源代码管理工具了么?
应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。
2. 你们的项目组使用缺陷管理系统了么?
应该用。ClearQuest太复杂,我的推荐是BugZilla。
3. 你们的测试组还在用Word写测试用例么?
不要用Word写测试用例(Test Case)。应该用一个专门的系统,可以是Test Manager,也可以是自己开发一个ASP.NET的小网站。主要目的是Track和Browse。
4. 你们的项目组有没有建立一个门户网站?
要有一个门户网站,用来放Contact Info、Baselined Schedule、News等等。推荐Sharepoint Portal Server 2003来实现,15分钟就搞定。买不起SPS 2003可以用WSS (Windows Sharepoint Service)。
5. 你们的项目组用了你能买到最好的工具么?
应该用尽量好的工具来工作。比如,应该用VS.NET而不是Notepad来写C#。用Notepad写程序多半只是一种炫耀。但也要考虑到经费,所以说是“你能买到最好的”。
6. 你们的程序员工作在安静的环境里么?
需要安静环境。这点极端重要,而且要保证每个人的空间大于一定面积。
Sqlite3内部采用UTF8存储,但是为转成GB2312就必须调用编码函数,太麻烦了,于是今天琢磨出一种让sqlite3内部存储汉字采用GB2312的方法,将字段设为BLOB,然后保存汉字的GB2312编码的字节数组就OK了。但是把词库的所有字段从TEXT转换成BLOB,结果查询时用where word = ’hello’竟然无法查询出结果,随手改成where word like ’hello’竟然可以,估计是BLOB无法用”=”查询。
using System;
using System.Text;
using System.Data;
using Finisar.SQLite;
namespace SqliteConvert
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
//打开以前的库
SQLiteConnection sqliteConn = new SQLiteConnection(@"Data Source=d:projectDrEye.db;New=False;Compress=True;Version=3;");
sqliteConn.Open();
SQLiteDataAdapter sqliteDa = new SQLiteDataAdapter("select * from DrEye",sqliteConn);
DataSet sqliteDs = new DataSet();
sqliteDa.Fill(sqliteDs);
//创建新库
SQLiteConnection sqliteConnNew = new SQLiteConnection(@"Data Source=d:projectDrEye.new1.db;New=True;Compress=True;Version=3");
sqliteConnNew.Open();
//建表
SQLiteCommand sqliteCmdNew = sqliteConnNew.CreateCommand();
sqliteCmdNew.CommandText = "CREATE table DrEye (word TEXT Primary Key,explanation BLOB,InflectedForm BLOB)";
sqliteCmdNew.ExecuteNonQuery();
//插入数据
SQLiteDataAdapter sqliteDaNew = new SQLiteDataAdapter("select * from DrEye", sqliteConnNew);
SQLiteCommandBuilder sqliteCbNew = new SQLiteCommandBuilder(sqliteDaNew);
DataSet sqliteDsNew = new DataSet();
sqliteDaNew.Fill(sqliteDsNew);
Console.WriteLine(sqliteDs.Tables[0].Rows.Count);
Console.WriteLine(sqliteDsNew.Tables[0].Rows.Count);
foreach(DataRow dr in sqliteDs.Tables[0].Rows)
{
DataRow sqliteDrNew = sqliteDsNew.Tables[0].NewRow();
sqliteDrNew[0] = dr[0];
sqliteDrNew[1] = EncodingConvert(dr[1].ToString());
if (dr[2].ToString() != "")
{
sqliteDrNew[2] = EncodingConvert(dr[2].ToString());
}
sqliteDsNew.Tables[0].Rows.Add(sqliteDrNew);
break;
}
sqliteDaNew.Update(sqliteDsNew);
Console.WriteLine("Game over!");
Console.ReadLine();
}
//将字符串转换成字节
static byte[] EncodingConvert(string utf8String)
{
byte[] ansiCode;
ansiCode = Encoding.Default.GetBytes(utf8String);
return ansiCode;
}
}
}
用这个连接串存储中文
SQLiteConnection conn = new SQLiteConnection();
conn.ConnectionString = "Data Source=test1.db;New=False;Compress=True;Synchronous=Off;UTF8Encoding=True;Version=3";
using System;
using System.Data.SQLite;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data;
/// <summary>
/// sqlite 的摘要说明
/// </summary>
public class sqlite
{
SQLiteConnection con;
public sqlite()
{
//
// TODO: 在此处添加构造函数逻辑
//
con = new SQLiteConnection(@"Data Source=D:My DocumentsVisual Studio 2005WebSitesajaxtestApp_Datanews2.sqlite");
}
public void exesql(string cmdtxt)
{
SQLiteCommand cmd = new SQLiteCommand(cmdtxt, con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
public Table getre(string cmdtxt)
{
Table tb = new Table();
SQLiteCommand cmd = new SQLiteCommand(cmdtxt, con);
con.Open();
SQLiteDataReader dr=cmd.ExecuteReader();
while (dr.Read())
{
TableRow nrow = new TableRow();
for (int i = 0; i < dr.FieldCount; i++)
{
TableCell tc = new TableCell();
tc.Text = dr[i].ToString();
nrow.Cells.Add(tc);
}
tb.Rows.Add(nrow);
}
con.Close();
return tb;
}
}
自己写的sqlite操作类如上,使用命令行可以显示中文。自己调用方法如下
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class sltest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
sqlite sl = new sqlite();
//sl.exesql("insert into msg values(1,'sasdasd','asdlkjalksdjsd',2007-06-14)");
Table tb = sl.getre("select * from msg");
Response.Write(tb.Rows[0].Cells[1].Text);
}
}
}
编码UTF8和UTF16都试过,这是怎么回事呢?
以往大家在asp.net开发小型项目经常使用Access,现在可以使用sqlite。
SQLite是一个小型的C程序库,实现了独立的,可嵌入的,零配置的SQL数据库引擎。特性包括:
事务操作是原子,一致,孤立,并且持久的(ACID),即使在系统崩溃和电源故障之后。
零配置——不需要安装和管理。
实现了绝大多数SQL92标准。 (不支持的特性)
整个数据库存储在一个单一的文件中。
数据库文件可以在不同字节序的机器之间自由地共享。
支持最大可达2T的数据库。 (241 字节)
字符串和BLOB类型的大小最大可达 2G 字节(231字节)。
小的代码: 完整配置的少于250KB,忽略一些可选特性的少于150KB。
在大多数常见操作上比流行的客户/服务器数据库引擎更快。
简单,易于使用的API。
内建TCL绑定。 另外提供可用于许多其他语言的绑定。
具有良好注释的源代码,95%经过测试。
独立:没有外部依赖。
源代码位于公共域。 可用于任何用途。
使用非常简单,使用安装上面二进制包直接使用VS2005的连接到数据库,
下面是简单的使用sqlite代码,和access一样。使用前需要先添加引用,需要引用的dll就在安装目录下面
SQLiteConnection con = new SQLiteConnection("Data Source=D:\foo.db;");
//con.Database = @"D:foo.db";
string cmdtxt = "select * from film";
SQLiteCommand cmd = new SQLiteCommand(cmdtxt, con);
con.Open();
try
{
Console.WriteLine(cmd.ExecuteScalar());
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
con.Close();
目录
1 建立数据库档案
2 在sqlite3提示列下操作
3 SQL的指令格式
4 建立资料表
5 建立索引
6 加入一笔资料
7 查询资料
8 如何更改或删除资料
9 其他sqlite的特别用法
10 小结
建立数据库档案
用sqlite3建立数据库的方法很简单,只要在shell下键入(以下$符号为shell提示号,请勿键入):
$ sqlite3 foo.db
如果目录下没有foo.db,sqlite3就会建立这个数据库。sqlite3并没有强制数据库档名要怎么取,因此如果你喜欢,也可以取个例如foo.icannameitwhateverilike的档名。