- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 .net 测试应用程序,它创建表,使用它们,然后删除它们,多次。
当我使用 Firebird ADO.Net Data Provider 5.9.1 针对 Firebird 3.0.2 数据库运行此应用程序时,它立即失败,因为它必须创建一个与之前删除的表同名的表:表已经存在!
重新启动应用程序可以避免麻烦,但我不想在每次测试后重新启动它。
这question非常相似,但悬而未决,直接使用 Firebird isql
工具而不是 .Net 应用程序。
有没有办法在不重新启动应用程序的情况下实际删除 Firebird 中的表?
此应用程序测试了许多其他数据库,没有出现此问题:SQL-Server、SQL-Server Compact Edition、MySql、SQLite、Oracle、PostgreSQL。
这是 Firebird 的 MCVE 失败。用合适的代码替换前两行以获得连接字符串。所有其他代码只是 Firebird ADO.Net 数据提供程序和 NUnit。它并没有像我的实际应用程序那样完全失败,但我认为这是相同的潜在问题。
[Test]
public void CreateSelectDrop()
{
var cfg = TestConfigurationHelper.GetDefaultConfiguration();
var cnxStr = cfg.Properties[Environment.ConnectionString];
using (var cnx = new FbConnection(cnxStr))
{
cnx.Open();
using (var tran = cnx.BeginTransaction())
{
using (var cmd = cnx.CreateCommand())
{
cmd.Transaction = tran;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "create table test (id int not null primary key)";
cmd.ExecuteNonQuery();
}
tran.Commit();
}
}
using (var cnx = new FbConnection(cnxStr))
{
cnx.Open();
using (var tran = cnx.BeginTransaction())
{
using (var cmd = cnx.CreateCommand())
{
cmd.Transaction = tran;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "insert into test (id) values (1)";
cmd.ExecuteNonQuery();
}
tran.Commit();
}
}
using (var cnx = new FbConnection(cnxStr))
{
cnx.Open();
using (var tran = cnx.BeginTransaction())
{
using (var cmd = cnx.CreateCommand())
{
cmd.Transaction = tran;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select id from test";
using (var reader = cmd.ExecuteReader())
{
Assert.IsTrue(reader.Read());
Assert.AreEqual(1, reader.GetInt32(0));
Assert.IsFalse(reader.Read());
}
}
tran.Commit();
}
}
using (var cnx = new FbConnection(cnxStr))
{
cnx.Open();
using (var tran = cnx.BeginTransaction())
{
using (var cmd = cnx.CreateCommand())
{
cmd.Transaction = tran;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "delete from test";
cmd.ExecuteNonQuery();
}
tran.Commit();
}
}
using (var cnx = new FbConnection(cnxStr))
{
cnx.Open();
using (var tran = cnx.BeginTransaction())
{
using (var cmd = cnx.CreateCommand())
{
cmd.Transaction = tran;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "drop table test";
cmd.ExecuteNonQuery();
}
tran.Commit();
}
}
}
仅从表中选择是不够的。只有在我将删除添加到测试中后,问题才出现。它在最后一次提交事务时失败,即删除的事务提交,并显示消息:
FirebirdSql.Data.FirebirdClient.FbException : lock conflict on no wait transaction
unsuccessful metadata update
object TABLE "TEST" is in use
----> FirebirdSql.Data.Common.IscException : lock conflict on no wait transaction
unsuccessful metadata update
object TABLE "TEST" is in use
at FirebirdSql.Data.FirebirdClient.FbTransaction.Commit()
at NHibernate.Test.DialectTest.FirebirdDialectFixture.CreateSelectDrop()
根据 Nathan Brown in a Github discussion ,这个麻烦似乎仅限于 Firebird ADO.Net 数据提供者。他将范围缩小到从 2.7.7 版本切换到 3.0.0。
最佳答案
看起来表删除被延迟,直到使用它们的连接实际关闭,而不仅仅是返回到池中。清除连接池会导致那些延迟的丢弃实际完成。
所以在表删除之前添加类似以下代码的内容可以解决我的问题:
using (var connection = GetConnection())
{
FbConnection.ClearPool(connection);
}
已找到此解决方案 here在超过 5 000 人的孤立测试中。
看起来还有另一种选择,改为调用 FbConnection.ClearAllPool()
。虽然我没有检查过,但前者可能只清除提供的连接连接字符串的连接池,而后者清除所有连接的池,而不管它们的连接字符串。
由于它是一个具有一些通用逻辑和一些特殊性的测试应用程序,因此我实际用作解决方案的代码将是:
// Firebird will pool each connection created during the test and will
// marked as used any table referenced by queries. It will delays those
// tables drop until connections are actually closed.
// This results in other tests failing when they try to create tables with
// same name.
// By clearing the connection pool the tables will get dropped. This is done
// by the following code.
// Moved from NH1908 test case, contributed by Amro El-Fakharany.
var clearConnection = Sfi.ConnectionProvider.GetConnection();
try
{
var fbConnectionType = clearConnection.GetType();
var clearPool = fbConnectionType.GetMethod("ClearPool");
clearPool.Invoke(null, new object[] {clearConnection});
}
finally
{
Sfi.ConnectionProvider.CloseConnection(clearConnection);
}
关于.net - 在应用程序关闭之前,Firebird 实际上不会删除表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44353607/
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!