C# 从连接Firebird读取数据时出错
我们正在将数据从不同的源系统(Firebird、Oracle、SQL Server)迁移到一个目标系统(SQL Server) 从Firebird连接的连接异常读取数据时出错 我们正在使用的代码 用于创建SourceSystem对象的静态DbFactory类 基本DbManager类 从DbManager继承的FireBirdDbManager类 异常图像 运行3到4次迁移后,我们遇到异常。如果我重新启动服务,我们可以运行3到4次迁移 我们用来调用相应源系统的代码:C# 从连接Firebird读取数据时出错,c#,firebird,azure-cloud-services,C#,Firebird,Azure Cloud Services,我们正在将数据从不同的源系统(Firebird、Oracle、SQL Server)迁移到一个目标系统(SQL Server) 从Firebird连接的连接异常读取数据时出错 我们正在使用的代码 用于创建SourceSystem对象的静态DbFactory类 基本DbManager类 从DbManager继承的FireBirdDbManager类 异常图像 运行3到4次迁移后,我们遇到异常。如果我重新启动服务,我们可以运行3到4次迁移 我们用来调用相应源系统的代码: 我们是Firebird数
我们是Firebird数据库系统的新手,无法解决这个问题。另一方面,我们正在使用Visual Studio 2012 Azure云服务在通过ADO.NET数据提供程序(版本4.7.0)执行查询期间,通过任务管理器终止Firebird任务,从而重现Firebird 2.1.3.18185的问题。此后,我们始终收到以下例外情况:
System.Data.Entity.Core.EntityCommandExecutionException: An error occurred
while executing the command definition. See the inner exception for details.
---> FirebirdSql.Data.FirebirdClient.FbException: Error reading data from
the connection.
---> FirebirdSql.Data.Common.IscException: Error reading
data from the connection. at
FirebirdSql.Data.Client.Managed.Version10.GdsTransaction.BeginTransaction(Transa
ctionParameterBuffer tpb) in c: Users Jiri Documents devel NETProvider
working NETProvider src FirebirdSql.Data.FirebirdClient Client Managed
Version10 GdsTransaction.cs:line 162 at
FirebirdSql.Data.Client.Managed.Version10.GdsDatabase.BeginTransaction(Transacti
onParameterBuffer tpb) in c: Users Jiri Documents devel NETProvider working
NETProvider src FirebirdSql.Data.FirebirdClient Client Managed Version10
GdsDatabase.cs:line 571 at
FirebirdSql.Data.FirebirdClient.FbTransaction.BeginTransaction() in c: Users
Jiri Documents devel NETProvider working NETProvider src
FirebirdSql.Data.FirebirdClient FirebirdClient FbTransaction.cs:line 363
— End of inner exception stack trace —
在我们的例子中,通过禁用连接池(连接字符串:“…;pooling=false”)解决并验证了问题。我们感兴趣的是,根据[1]的事实,当连接在多个请求之间断开时,使用连接池时,这是预期的行为
我希望这个答案能帮助别人。在我们的案例中,此解决方案还可以与当前的ADO.NET 5.0.5一起使用
致以最良好的祝愿,
托马斯
[1] 我在执行该长度的查询时出现此错误>最大查询长度 在FireBird 4.x中,我从连接读取数据时出错 更新到6.6后,出现新错误“335544721:无法完成对主机的网络请求…” 通过拆分查询将其修复为较少的查询
(使用UTF-8时默认为8191个字符)“从连接读取数据时出错”通常表示连接意外关闭或以其他方式生成低级别IO错误。您使用的是哪个Firebird版本,以及哪个数据库连接库和版本?另外,请尝试禁用连接池。@MarkRotterVeel感谢您的输入。我需要与离岸团队核实,因为我们正在使用FlameRobin数据库管理员连接Firebird服务器。我们正在使用库DLL:FirebirdSql.Data.FirebirdClient和版本:4.8.0.0,删除了连接池和testing@MarkRotteveel还是一样的问题没有运气:(任何其他建议我能给你的唯一其他建议是升级到更新的Firebird版本(2.5.4)。要扩展我之前的评论,它看起来像服务器进程(对于Classic,它是每个连接)崩溃。这可能与使用带有错误的UDF有关,但也可能是由Firebird本身的错误引起的。自2.0.7以来,已有相当多的Firebird版本对服务器崩溃进行了错误修复。您可能还希望检查服务器的Firebird.log。禁用连接池(连接字符串:“…;池=false”)我也遇到了这个问题。令人遗憾的是,在ADO.net组件的5.12版发布之后,没有修复程序!!警告:这取决于应用程序的体系结构,但禁用池并不是每个应用程序的好选择,因为每次打开新连接都要花费大量时间。更好的解决方案是设置
connection.ConnectionLifeTime=60秒(大约),并让池管理器管理旧的连接。
public abstract class DbManager
{
private DbConnection m_DbConnection;
public virtual DbConnection DbConnection
{
get
{
if (m_DbConnection == null)
{
m_DbConnection = new SqlConnection();
}
return m_DbConnection;
}
set
{
this.m_DbConnection = value;
}
}
public virtual void SetConnectionString(Migration migration, DataTable dtConnectionDetails = null)
{
try
{
DbConnection.ConnectionString = string.Format("Server={0};Database={1};User ID={2};Password={3};",
migration.NetworkPartnerData.Server,
migration.NetworkPartnerData.Database,
migration.NetworkPartnerData.User,
AESEncryptionDecryptionUtility.DecodeBase64(migration.NetworkPartnerData.Password));
}
catch
{
throw;
}
}
public virtual void SetConnectionString(string connectionString)
{
try
{
DbConnection.ConnectionString = connectionString;
}
catch
{
throw;
}
}
public virtual DataTable ExecuteDataTable(string ConnectionString, string queryText)
{
throw new NotImplementedException();
}
}
public class FireBirdDbManager : DbManager
{
private FbConnection fbconnection;
public override DbConnection DbConnection
{
get
{
if (fbconnection == null)
{
fbconnection = new FbConnection();
}
return fbconnection;
}
set
{
this.fbconnection = value as FbConnection;
}
}
public override void SetConnectionString(Migration migration, DataTable connectionDetails)
{
this.DbConnection.ConnectionString = string.Format("Server={0};Database={1};Port=3050;User ID={2};Password={3};Pooling=true;MinPoolSize=0;MaxPoolSize=50;",
migration.NetworkPartnerData.Server,
migration.NetworkPartnerData.Database + BuildDatabaseName(Convert.ToString(connectionDetails.Rows[0]["CL_NBR"])) + ApplicationConstants.FIREBIRD_DBFILE_EXTENSION,
migration.NetworkPartnerData.User,
iMigrationTool.Common.AESEncryptionDecryptionUtility.DecodeBase64(migration.NetworkPartnerData.Password));
}
public override DataTable ExecuteDataTable(string ConnectionString, string queryText)
{
using (var connection = new FbConnection(ConnectionString))
{
try
{
DataTable dt = new DataTable();
connection.Open();
using (FbTransaction readTransaction = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
FbCommand readCommand = new FbCommand();
try
{
readCommand.CommandText = queryText;
readCommand.Connection = connection;
readCommand.Transaction = readTransaction;
FbDataAdapter da = new FbDataAdapter(readCommand);
da.SelectCommand.CommandType = CommandType.Text;
da.Fill(dt);
readTransaction.Commit();
}
catch
{
readTransaction.Rollback();
throw;
}
finally
{
readTransaction.Dispose();
if (connection.State == ConnectionState.Open)
{
connection.Close();
}
connection.Dispose();
}
return dt;
}
}
catch (Exception ex)
{
int errorCode = ex.HResult;
Logger.LogApplicationException(ex, null, "ERRORCODE:" + errorCode + "ConnectionString:" + ConnectionString, "MigrationWorker");
throw ex;
}
}
}
}
System.Data.Entity.Core.EntityCommandExecutionException: An error occurred
while executing the command definition. See the inner exception for details.
---> FirebirdSql.Data.FirebirdClient.FbException: Error reading data from
the connection.
---> FirebirdSql.Data.Common.IscException: Error reading
data from the connection. at
FirebirdSql.Data.Client.Managed.Version10.GdsTransaction.BeginTransaction(Transa
ctionParameterBuffer tpb) in c: Users Jiri Documents devel NETProvider
working NETProvider src FirebirdSql.Data.FirebirdClient Client Managed
Version10 GdsTransaction.cs:line 162 at
FirebirdSql.Data.Client.Managed.Version10.GdsDatabase.BeginTransaction(Transacti
onParameterBuffer tpb) in c: Users Jiri Documents devel NETProvider working
NETProvider src FirebirdSql.Data.FirebirdClient Client Managed Version10
GdsDatabase.cs:line 571 at
FirebirdSql.Data.FirebirdClient.FbTransaction.BeginTransaction() in c: Users
Jiri Documents devel NETProvider working NETProvider src
FirebirdSql.Data.FirebirdClient FirebirdClient FbTransaction.cs:line 363
— End of inner exception stack trace —