安装
FireBird两种模式:
- Server
- 嵌入式
采用嵌入式开发
官网:
https://firebirdsql.org/en/start/
官网下载:
https://firebirdsql.org/en/firebird-4-0-0-rc1/
下载安装64位的
操作系统:Windows 10
设置密码:Sister1
官方管理工具ISQL
SQL语句以;结束。
创建数据库(ISQL):命令窗口执行下列命令,并在相应文件夹检查是否创建成功。
\bin>isql -u sysdba -p masterkey
创建数据库ERDC:
SQL> CREATE DATABASE "D:\Projects\ClientTest\bin\Debug\Storage\XYZ.FDB";
Server version:
WI-V4.0.0.2353 Firebird 4.0 Release Candidate 1
SQL>
连接数据库ERDC:
SQL> connect "D:\Projects\ClientTest\bin\Debug\Storage\XYZ.FDB";
Server version:
WI-V4.0.0.2353 Firebird 4.0 Release Candidate 1
Database: "D:\Projects\ClientTest\bin\Debug\Storage\XYZ.FDB", User: DELL
创建表T2:
SQL> CREATE TABLE T2 (
CON> NAME VARCHAR(20),
CON> YEAR_RELEASED INTEGER
CON> );
查询表:
SQL> show tables;
T2
SQL> insert into T2 (NAME,YEAR_RELEASED) values ('guming',56000);
SQL> select * from T2;
NAME YEAR_RELEASED
==================== =============
guming 56000
SQL> connect "D:\Projects\ClientTest\bin\Debug\Storage\XYZ.FDB";
Statement failed, SQLSTATE = 08001
I/O error during "CreateFile (open)" operation for file "D:\PROJECTS\CLIENTTEST\BIN\DEBUG\STORAGE\XYZ.FDB"
-Error while trying to open file
-另一个程序正在使用此文件,进程无法访问。
锁库了
管理工具
firebird maestro V17.1.0.3新建数据库
管理不了4.0的数据库
据说V19版本可以管理FireBird V4.0。firebird maestro是上商业版的
- firebird maestro
- IBExpert 2021
- FlameRobin
- IBManager
- Dbeaver CE
管理工具,官网上可以查:
https://firebirdsql.org/en/third-party-tools/
有点夸张
嵌入版项目
嵌入版的功能强大,但是它也是有缺点的:只能允许一个连接
创建一个项目
Plugins下只需要一个文件:
从FireBird的安装目录下或下载的ZIP文件中拷贝文件到项目的可执行文件运行目录下:
fbclient.dll
ib_util.dll
icudt63.dll
icudt63l.dat
icuin63.dll
icuuc63.dll
Plugins下只需要一个文件,带目录拷贝过来:
engine13.dll
在这里借用Helper
https://blog.youkuaiyun.com/u011234288/article/details/108629829
稍许改造:
using FirebirdSql.Data.FirebirdClient;
using FirebirdSql.Data.Isql;
using FirebirdSql.Data.Services;
public class FireBirdHelper
{
//FDB文件的路径
public string path;
//连接字符串,通过方法GetConnString_Client生成
public string connStr ;
这个方法得到嵌入版4.0的连接字符串
/// <summary>
/// 嵌入式连接 代码生成
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public string GetConnString_Client()
{
FbConnectionStringBuilder cs = new FbConnectionStringBuilder();
// cs.ClientLibrary = $"{_pathSys}\\fbembed.dll";
cs.ClientLibrary = ".\\fbclient.dll";
cs.UserID = "SYSDBA";
cs.Password = "masterkey";
cs.Database = path;
cs.Charset = "UTF8";
cs.ServerType = FbServerType.Embedded;
return cs.ToString();
}
在Helper类中将connection提升为类级别的变量:
public FbConnection connection;
调用测试:
FireBirdHelper fdbHelper;
private void button1_Click(object sender, EventArgs e)
{
fdbHelper = new FireBirdHelper();
fdbHelper.path = "D:\\Projects\\ClientTest\\bin\\Debug\\Storage\\XYZFDB";
string conStr = fdbHelper.GetConnString_Client();
Console.WriteLine(conStr);
MessageBox.Show(conStr);
fdbHelper.connStr = conStr;
}
private void button2_Click(object sender, EventArgs e)
{
FbConnection fbconn = fdbHelper.OpenConnection();
if (fbconn!=null)
{
Console.WriteLine("连接成功:");
Console.WriteLine(fbconn.ConnectionString);
}
else
{
Console.WriteLine("Can not Connect the FireBird DB");
}
}
得到输出:
连接成功:
client library=.\fbclient.dll;user id=SYSDBA;password=masterkey;initial catalog=D:\Projects\ClientTest\bin\Debug\Storage\XYZ.FDB;character set=UTF8;server type=Embedded
读取数据:
string cmdText = "SELECT * FROM T2";
FbDataReader reader = fdbHelper.ExecuteReader(CommandType.Text, cmdText, null);
while (reader.Read())
{
Console.WriteLine(reader[0] + " " + reader[1]);
}
reader.Close();
插入数据:
//ExecuteNonQuery(CommandType cmdType, string cmdText, params FbParameter[] commandParameters)
// insert into T2 (NAME,YEAR_RELEASED) values ('guming',56000);
Random r = new Random(System.DateTime.Now.Second);
for (int i = 0;i < 1000;i++)
{
string cmdText = "INSERT INTO T2(NAME, YEAR_RELEASED) VALUES('guming"+ i + "', " + (40000 + r.Next(1,100)*100) + ");";
fdbHelper.ExecuteNonQuery(CommandType.Text, cmdText, null);
}
MessageBox.Show("插入数据完毕!");
清空表:
//DELETE FROM T2 WHERE NAME = '' AND YEAR_RELEASED = 0;
string cmdText = "DELETE FROM T2 WHERE 1=1;";
fdbHelper.ExecuteNonQuery(CommandType.Text, cmdText, null);
MessageBox.Show("清除数据完毕!");
借用的Helper中的事务ExecuteNonQuery并没有开启事务,修改一下,实现万条数据秒插:
public int ExecuteNonQuery(FbTransaction trans, CommandType cmdType, string cmdText, params FbParameter[] commandParameters)
{
FbCommand cmd = new FbCommand();
//using (FbConnection conn = OpenConnection())
{
//PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
cmd.Transaction = trans;
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
}
事务独立写,执行更快:
Random r = new Random(System.DateTime.Now.Second);
FbTransaction transaction = fdbHelper.connection.BeginTransaction();
using (FbCommand command = new FbCommand())
{
command.Connection = fdbHelper.connection;
command.Transaction = transaction;
for (int i = 0; i < 10000; i++)
{
command.CommandText = "INSERT INTO T2(NAME, YEAR_RELEASED) VALUES('guming" + i + "', " + (40000 + r.Next(1, 100) * 100) + ");";
command.ExecuteNonQuery();
}
transaction.Commit();
}
MessageBox.Show("开启事务插入数据完毕!");