我熟悉使用ADO(dbGo)的Microsoft SQL服务器世界,我已经为该环境编写了许多应用程序.现在我有一个遗留的Delphi 7应用程序和Firebird 2.5数据库,我必须维护它.
但我发现如果2个客户端应用程序执行此操作:
SQLQuery.SQL.Text := 'Update mytable set field1 = 11 where keyfield = 99'
SQLQuery.Execute;
Run Code Online (Sandbox Code Playgroud)
在几乎完全相同的时间,第二个应用程序立即出现"死锁"错误.在SQL Server中,会有一段等待时间
ADOConnection.Isolationlevel = ilCursorstability;
ADOConnection.CommandTimeout := 5;
Run Code Online (Sandbox Code Playgroud)
在第二个客户端应用程序中引发任何异常之前.异常处理可能涉及在批处理过程中被视为非常不寻常的情况的回滚.这是合理的.5秒是计算机处理时间非常长的时间.
现在,我在Firebird客户端上使用相同方法的尝试毫无结果,因为"死锁"(实际上是使用中的记录)立即发生.
如果无法将数据库引擎配置为等待一些条件来改进(记录锁定要发布),那么现在责任必须由客户端应用程序开发人员负责,他们必须编写疯狂的慢速代码来克服我认为是主要的Firebird失败了.
一旦检测到"死锁",除非断开连接组件,否则不会清除该情况
while rowsupdated = 0 and counter < 5 do
begin
try
rowsupdated := SQLQuery.Execute;
except
SQLConnection.Connected := False;
SQLConnection.Connected := True;
end;
Inc(Counter)
end;
Run Code Online (Sandbox Code Playgroud)
当您在使用Delphi中的DBX时在Firebird中没有任何实质性的锁定容差时,如何构建健壮的多用户表更新客户端?
好的我知道这已经被弃用了,而且bde比Moses旧,但是我们还有一些遗留的应用程序还没有使用bde进行迁移.
有没有人成功安装bde与完全配置为Windows 7(32和64位)的interbase sql链接?
我发现了许多不同的帖子和可执行文件,但没有结论.
谢谢
我使用Firebird 的子字符串函数在机器上创建了一个视图,并且它有效.当我将数据库复制到另一台机器时,视图被破坏了.这是我使用它的方式:
SELECT SUBSTRING(field FROM 5 FOR 15) FROM table;
Run Code Online (Sandbox Code Playgroud)
这是机器上不接受该功能的输出:
token unknown: FROM
Run Code Online (Sandbox Code Playgroud)
两台计算机都有此配置:
有关为什么它在这些机器上表现不同的任何想法?
我正在使用Firebird,但最近数据库变得非常认真.实际上有很多delete语句在运行,以及更新/插入,并且数据库文件大小增长得非常快.在大量删除记录之后,数据库大小不会减少,更糟糕的是,我感觉实际上查询速度有所降低.为了解决这个问题,我们已经涉及了每日备份/恢复过程,但由于是时候完成了 - 我可以说使用Firebird真的很令人沮丧.
任何有关变通方法或解决方案的想法都将受到欢迎.
同时,我正在考虑转换到Interbase,因为我从朋友那里听说它没有这个问题 - 是这样的吗?
使用InterClient 7.5.1和8.1.5,在Java 8中创建新的JDBC连接失败
java.lang.NoClassDefFoundError: sun/io/ByteToCharConverter
Run Code Online (Sandbox Code Playgroud)
InterClient JDBC库似乎引用或使用此类.Java 7没有出现错误.有没有办法解决此错误?
此代码重现了Java 8上的问题:
package com.example.so25365952;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Main {
interbase.interclient.Connection conn;
public static void main(String[] args) {
try {
Class.forName("interbase.interclient.Driver");
DriverManager.getConnection("jdbc:interbase://localhost/data/mydb.gdb", "sysdba", "password123");
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
线程"main"中的异常java.lang.NoClassDefFoundError:interbase.interclient.Connection.connect中的interbase.interclient.Connection.connect(未知源)中的sun/io/ByteToCharConverter.(interknown.interclient.Driver.connect中的未知源)(未知来源)来自java.sql.DriverManager.getConnection(DriverManager.java:664)的java.sql.DriverManager.getConnection(DriverManager.java:247)at com.example.so25365952.Main.main(Main.java:14) by:java.lang.ClassNotFoundException:位于java.net.URLClassLoader $ 1.run(URLClassLoader.java:372)的sun.io.ByteToCharConverter,位于java.security的java.net.URLClassLoader $ 1.run(URLClassLoader.java:361).位于java..L.Tisc.Launcher的java.lang.ClassLoader.loadClass(ClassLoader.java:424)java.net.URLClassLoader.findClass(URLClassLoader.java:360)的AccessController.doPrivileged(Native Method)$ AppClassLoader.loadClass(Launcher. java:308)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 6更多
我正在创建一个简单的isql脚本,但它不起作用,我需要一些帮助来找出它的错误.
我需要连接到数据库并执行SQL文件.这是我的脚本,名为script.sql:
CONNECT 'localhost:C:\Monde\Servidor\db\monde.fdb' USER 'SYSDBA' PASSWORD 'masterkey';
update usuario
set senha = 'MYkWEn0kHLHHdm'
where login = 'rose'
Run Code Online (Sandbox Code Playgroud)
当我尝试连接到我的数据库使用:
isql.exe -i script.sql
Run Code Online (Sandbox Code Playgroud)
我得到以下消息:
Use CONNECT or CREATE DATABASE to specify a database
Expected end of statement, encountered EOF
Run Code Online (Sandbox Code Playgroud) 您好代码爱好者!
我有一个问题,这无疑是由于我的Delphi XE2知识缺乏经验.我会试着在这里解释一下.
介绍:
我有一个带数据的Interbase数据库.该数据库位于远程计算机上.我正在开发的客户端应用程序使用此数据库.由于必须在没有可用的网络连接时使用该应用程序,我必须使用公文包模型.这就是为什么我使用ClientDataSet来检索数据并以XML格式本地存储它.在我看来,使用本地数据库代替XML文件会更容易,但我还是不允许改变它.因此我仍然绑定到XML :(
由于数据的重要性,我希望尽可能保持安全.即使其他开发人员正在更改数据库的内部结构(例如,表中的字段被添加,重命名甚至删除),本地存储的数据仍然必须可用.
我现在做的是,我使用ClientDataSet从数据库中检索元数据.它分别存储在磁盘上.我计划做的下一件事是将数据库中的元数据与存储在本地数据集中的元数据进行比较.当我在字段中发现差异时,我在代码中创建了一个新的数据集,我建立了字段定义并在之后添加数据.换句话说,我只是创建一个新的本地数据集,它符合远程数据库中表的结构.
当我找到列(字段)删除或添加时,这很容易,但是当字段名称或数据类型发生更改时,它会变得有点困难.
我还没有考虑主键,外键和唯一键,但我也觉得必须这样做.
题:
我的问题主要是,我想知道这是否是正确的方法.实现这一点是相当有意义的,在我开始实现这一切之前,我想知道是否还有其他(更方便,更简单)的方法来实现我上面描述的内容.
在我看来,本地可用的数据优先于远程数据库中存储的数据.仅仅因为用户正在处理本地数据而不是直接处理远程数据.
有什么想法吗?我希望我能够充分澄清我的问题,如果没有,请询问,我会提供更多细节.我正在使用Interbase XE(SP5)和Delphi XE 2.
我在Interbase中有一个数据库,我想使用ActiveRecord直接从我的Rails应用程序访问它.我该怎么做?
我们处于这样一种情况,我们必须在2个数据库之间进行选择.我们目前使用的是Firebird,但有时因为它堆积了太多的交易历史或其他东西而滞后,因此应该采用备份恢复以使事情变得更好.
在我的具体情况中:数据库主要有填充数字字段的表.查询主要有内部联接.几乎与我插入和选择的速率相同.(但是在未来,我正在寻找更严格的选择)有3个主要表格,有几百亿的记录(每秒继续增长).
但我想看看哪个是最好的整体进入正常负载,如上面的那些,以及重载 - 比如选择和处理选定的字段,整体表现为事件触发和存储过程执行,我认为这是足够好的知识选择他们之间(更多的意见是受欢迎的),可能会帮助其他人民做出决定.
我问
PS:我现在暂不解决这个问题.也许会有人在正常的,每天的查询基础上真正处理数据库,问题和结果对我来说会更有用,其他人也会对这种情况感到不满.
我有一个扩展名的文件.ib.我猜它是Interbase或Firebird文件,但我无法确切地解决哪个问题.此外,尚不清楚确切地使用哪个版本的Interbase(或Firebird)来创建文件.
到目前为止我发现了什么:
我已经尝试了各种不同的软件来读取这个文件(FlameRobin,Firebird的isql.exe以及最新版本的Interbase),我得到的错误消息告诉我ODS("On Disk Structure")是版本9.这是相当旧的,并且约会Firebird从Interbase分叉的时间.
我已经设法连接到数据库并使用Firebird查询它,但是我得到的一些错误让我相信它实际上是一个Interbase数据库(如果需要,我可以进一步解释)
是否有一种简单的方法来确定我正在处理的数据库到底是什么类型的?即它是一个Interbase或Firebird文件,如果是这样,它是用哪个版本编写的?
编辑:gstat.exe -h使用Firebird 2.5运行的输出:
Database header page information:
Flags 0
Checksum 12345
Generation 7558
Page size 4096
ODS version 9.1
Oldest transaction 7506
Oldest active 7544
Oldest snapshot 7544
Next transaction 7549
Bumped transaction 1
Sequence number 0
Next attachment ID 5
Implementation ID 16
Shadow count 0
Page buffers 0
Next header page 0
Database dialect 1
Attributes force write
Variable …Run Code Online (Sandbox Code Playgroud)