DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: emprorgame
今日帖子: 24
在线用户: 14
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 ds3000 (ds3000) ▲▲▲△△ -
注册会员
2021/4/21 11:09:51
标题:
求助:关于远程数据库操作 浏览:593
加入我的收藏
楼主: 手头有个小软件,公司用,公司办公跟生产基地不在同一个地方,这个软件2个地方的人都要用,内容不多,数据也没有保密的必要,所以就打算把数据放服务器,再写个客户端进行远程访问操作。问题如下:

1. 我怎么判断数据库连接正常,是不是每次操作数据库前都要判断一下?还是用一个定时器,间隔时间访问一下数据库,成功则表示连接正常?

2. 访问数据库表的时候,如果我要修改或增加信息该怎么操作,特别是修改数据,怎么控制避免产生脏数据之类的操作。

谢谢!
----------------------------------------------
-
作者:
男 lr46752881 (Anuo) ▲▲▲▲▲ -
注册会员
2021/4/21 12:23:26
1楼: 数据库是微软的sqlserver 用ado控件 ADOConnection和ADOQuery,不会此控件就百度一下
 
ADOQuery写查询sql语句开打数据库后,用ADOQuery的方法append edit delete新增 修改 删除提交操作。

脏数据自己写逻辑判断
----------------------------------------------
123
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2021/4/22 9:15:29
2楼: 数据库都是长连接,长连接在连接断开的时候基本都能知道。
但是你这个要走公网,要考虑网路问题。最好的方案是走http协议,把功能封装在服务器,客户机用http请求的方式来请求数据。
或者嫌麻烦那就用短连接的模式,就是要用到数据的时候才连接服务器,与数据库交互完毕就立刻断开连接。这样的做法是考虑到很多网络环境,交换机会强制断开一段时间内没有数据交互的网络连接。如果直接按局域网那种做法的话,那程序健壮性太次了。
----------------------------------------------
--
作者:
男 yy306 (yy306) ▲▲▲△△ -
注册会员
2021/4/22 10:34:09
3楼: 建议楼主直接安装一个远程控制软件(Teamview、anydesk、todesk等),连接到本地操作。省时省力。
----------------------------------------------
-
作者:
男 dmzn (dmzn) ★☆☆☆☆ -
盒子活跃会员
2021/4/22 10:47:26
3楼: 如果是新开发,可以考虑uniGUI直接写成Web模式,与开发client区别不大,公司部署,其它地方都能访问.好处是不用暴露数据库,升级也简单.

如果是现有胖客户端软件,那我回答一下你的两个疑问:
1.数据库连接是底层驱动处理的,你根本不需要关心.假如是要处理断线重连的话,可以用以下方法:伪代码
var nCounter: Integer
begin
  nCounter := 0; //计次数
  while nCounter < 2 do
  try
    if nCounter = 1 then //第一次查询失败后
    begin
      DoQuery('Select 1');
      //执行一个简单查询,判断链路是否正常
    end else

    if nCounter = 2 then //第二次查询失败(一般是链路断开引起)
    begin
      DoDisconnect;
      //断开链路
      doConnect;
      //重新连接
    end;

    DoQuery; //执行查询
  except
    Inc(nCounter); //累计错误次数
  end;

2.如果写入数据库的记录是单笔,则不存在写脏,因为成功/不成功是原子操作;如果是多笔,记得开数据库事务.
beginTrans;
try
  WriteDB;
  CommitTrans;//提交写入
except
  Rollback; //出错回滚
end;
----------------------------------------------
生活愉快.
作者:
女 google220 (google220) ▲▲▲▲▲ -
注册会员
2021/4/22 23:25:05
4楼: uniGUI,很想用,没有教程基本都死在沙滩上。
----------------------------------------------
菩提本无树,明镜亦非台,本来无一物,何处惹尘埃
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/4/23 16:45:33
5楼: 如果是新做,可以考虑上 DataSnap 多层。

通过互联网直接连接数据库, 也是可以的。
----------------------------------------------
-
作者:
男 hnxxcxg (咏南中间件) ★☆☆☆☆ -
盒子活跃会员
2021/4/23 19:25:54
6楼: 数据库中间件不就是干这个的吗?
----------------------------------------------
中间件QQ群: 92449782 博客: http://www.cnblogs.com/hnxxcxg/
作者:
男 ds3000 (ds3000) ▲▲▲△△ -
注册会员
2021/5/11 9:12:50
7楼: 首先谢谢楼上的各位朋友,谢谢!

其次这个软件我一个人做,只是作为一个工具用,使用频率不高,偶尔用一下,因为今年还有一个比较复杂的项目要做,我想抓紧把这个结束,所以才想用2层C/S方式,数据不存在加不加密,也就没考虑用中间件。
----------------------------------------------
-
作者:
男 xingyuwan (liugguo) ★☆☆☆☆ -
注册会员
2021/5/11 10:06:42
8楼: 有公网IP吗?还是搞动态域名?还是弄VPN?
为什么用c/s呢.
这情况适合用b/s.
----------------------------------------------
恭喜发财
作者:
男 xingyuwan (liugguo) ★☆☆☆☆ -
注册会员
2021/5/11 10:15:23
9楼: 用的不频繁的话,C/S也行,

远程连接sql和局域网一样啊.地址使用 www.xxxxxxx.com,3433 这样,当然你得申请个动态域名,还得在路由器上做端口映射.
比如:
   adoconnection1.Connected:=false;
   adoconnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=abcd1234'+';Data Source=ekifap3956.cnvpn.org,3433;Initial Catalog=DB001;connect.LoginPrompt:=False';
   adoconnection1.Connected:=true;

不用定时器,就和局域网一样,局域网你怎么获取连接状态的?
操作数据库前判断一下啊,
if not adoconnection1.Connected then adoconnection1.Connected:=true;

推荐用UNIDAC,别用ADO,更好用,简单设置一下就可以自动断线重联!

我用动态域名连接sqlserver用过,还是很稳定的.
----------------------------------------------
恭喜发财
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2021/5/12 20:39:24
0楼: b/s吧,开浏览器即可操作。
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。
又不靠它 delphi 吃饭,怕甚?
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行62.5毫秒 RSS