捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:方便好用的远程数据库对象V1.3
mmzmagic 38094 2009/7/20 21:06:28
to james_ : 说的是, 我还是把它删了吧 :)
To iking : 存储过程是支持的, 事务和UpdateBatch暂不支持
iking 38091 2009/7/20 18:53:58
感谢mmz先。
目前这个版本还不支持 事务、存储过程、UpdateBatch方法 吧?
james_ 38085 2009/7/20 14:22:34
對了,DSock本身免費的嗎?如果不是免費,這樣放到開源那邊恐怕不好
mmzmagic 38082 2009/7/20 10:16:47
to james_: 是我提交时大意 忘记执行Gobunit目录里的Clean.bat了,已经将不需要的文件删除了。
to youcheng:  感谢你的细心测试,你说的问题是个BUG,我已经修复。请更新
youcheng 38078 2009/7/20 8:57:59
google上最新版本R4,服务器端重启,客户端不能自动连接到服务器了。
james_ 38075 2009/7/20 0:23:15
建议lz加强源码管理,不要把没用的文件放上svn(如*.~*),这样对自己管理源码有好处:)
mmzmagic 38073 2009/7/19 18:02:39
支持dxsock和二进制对象的版本,已经提交到google svn了,大家有需要的可以通过下边的svn地址检出。
http://mmzrmo4delphi.googlecode.com/svn/trunk/
mmzmagic 38068 2009/7/19 12:31:50
to yzqyb: 客户端有简单认证,如果实际应用,肯定需要自己根据项目情况增加一些认证措施。
to carcode: 你说的这个真不算问题,如果有需要你可以在服务端给其他客户端发个修改了那个表的通知。
to newapple :1.日期(字符串存储)查询要用19位长度的字符串如:2009-01-01 12:00:00
2.因为Filter属性被我的代码使用了:)
to dcopyboy:下一版本将自动查找ID字段,就不要求非要在第1个了。我还是不建议指定ID字段的字段名,那样使用起来会不太方便,还是做成自动的好些 :)。

to All: 谢谢大家支持,希望喜欢它的朋友一起来把这个东东越做越好,让更多的人能得到它提供的方便和高效。
dcopyboy 38065 2009/7/19 8:38:56
使用ADOQuery对象的Insert,Post方法新增数据时,存在问题!
1.要指定自增长ID字段为第一字段,不合理。
2.实际在插入更新时存在BUG。

笔者认为,不如我们指定自增长字段名更为合理,下列修改就是针对本想法的:
修改untRmoDbClient单元的下列2个过程:
procedure TRmoClient.OnBeforeDelete(DataSet: TDataSet);
var
  I: Integer;
  lsql: string;
  Result, ltablename: string;
 // Lkey, lvalue: string;
  Lindex: integer;
begin
  //获取表名
  lsql := LowerCase(TADOQuery(DataSet).Filter);
  if Pos('select', lsql) > 0 then begin
    if lglst = nil then
      lglst := TStringList.Create;
    GetEveryWord(lsql, lglst, ' ');
    for i := 0 to lglst.Count - 1 do
      if lglst.Strings[i] = 'from' then begin
        Lindex := i;
        Break;
      end;
    if Lindex < 2 then
      ExceptTip('SQL语句错误!');
    ltablename := '';
    for i := Lindex + 1 to lglst.Count - 1 do
      if lglst.Strings[i] <> '' then begin
        ltablename := lglst.Strings[i];
        Break;
      end;
    if ltablename = '' then
      ExceptTip('SQL语句错误!');
  end
  else
    ExceptTip('无法自动提交,请先执行select');
  //获取方法
  with DataSet.Fields do begin
    if DataSet.FindField(IndexField) <> nil then
      Result := 'delete from ' + ltablename + Format(' where ' + IndexField + '=%d', [FieldbyName(IndexField).AsInteger])
    else
      Result := 'delete from ' + ltablename + Format(' where %s=%d', [Fields[0].FieldName, Fields[0].AsInteger]);
    ExeSQl(Result);
  end;
end;

procedure TRmoClient.OnBeginPost(DataSet: TDataSet);
var
  I: Integer;
  lsql: string;
  Result, ltablename: string;
  Lkey, lvalue: string;
  Lindex: integer;
  IDFileName: string;
begin
  //获取表名
  lsql := LowerCase(TADOQuery(DataSet).Filter);
  if Pos('select', lsql) > 0 then begin
    if lglst = nil then
      lglst := TStringList.Create;
    GetEveryWord(lsql, lglst, ' ');
    for i := 0 to lglst.Count - 1 do
      if lglst.Strings[i] = 'from' then begin
        Lindex := i;
        Break;
      end;
    if Lindex < 2 then
      ExceptTip('SQL语句错误!');
    ltablename := '';
    for i := Lindex + 1 to lglst.Count - 1 do
      if lglst.Strings[i] <> '' then begin
        ltablename := lglst.Strings[i];
        Break;
      end;
    if ltablename = '' then
      ExceptTip('SQL语句错误!');
  end
  else
    ExceptTip('无法自动提交,请先执行select');
  //获取方法

  case TADOQuery(DataSet).State of //
    dsinsert: begin
        IDFileName := '';
        with DataSet.Fields do begin
        //如果第一个字段为只读,说明是自增长ID字段 改掉它
          if DataSet.FindField(IndexField) <> nil then begin
          IsInserIDfield := True;
          FieldbyName(IndexField).ReadOnly := False;
          IDFileName := IndexField;
          end
          else if Fields[0].ReadOnly = true then begin
          IsInserIDfield := True;
          Fields[0].ReadOnly := False;
          IDFileName := Fields[0].FieldName;
          end;
          Result := 'insert into ' + ltablename + '(';
          for i := 0 to count - 1 do
          if (IDFileName <> '') and (IDFileName <> Fields[i].FieldName) then
          Result := Result + Fields[i].FieldName + ',';
          Result := copy(Result, 1, length(Result) - 1);
          Result := Result + ') values (';
          for i := 0 to Count - 1 do
          if (IDFileName <> '') and (IDFileName <> Fields[i].FieldName) then begin
          case Fields[i].DataType of
          ftCurrency, ftBCD, ftWord, ftFloat, ftBytes: Result := Result + Fields[i].AsString + ',';
          ftSmallint, ftInteger: Result := Result + IntToStr(Fields[i].AsInteger) + ',';
          else
          Result := Result + '''' + Fields[i].AsString + '''' + ',';
          end;
          end;
          Result := copy(Result, 1, length(Result) - 1) + ')';
          ExeSQl(Result);
          if IsInserIDfield then begin
         //如果需要ID字段 自动获取
          if FQryForID = nil then
          FQryForID := TADOQuery.Create(nil);
          if DataSet.FindField(IndexField) <> nil then begin
          OpenAndataSet(Format('select max(%s) as myid from %s', [IndexField, ltablename]), FQryForID);
          Fieldbyname(IndexField).AsInteger := FQryForID.FieldByName('myid').AsInteger;
          end
          else begin
          OpenAndataSet(Format('select max(%s) as myid from %s', [Fields[0].FieldName, ltablename]), FQryForID);
          Fields[0].AsInteger := FQryForID.FieldByName('myid').AsInteger;
          end;
          end;
        end;
      end;
    dsEdit: begin
        with DataSet.Fields do begin
          Result := 'Update ' + ltablename + ' Set ';
          if DataSet.FindField(IndexField) <> nil then begin
          IDFileName := IndexField;
          Lkey := Fieldbyname(IndexField).FieldName;
          lvalue := Fieldbyname(IndexField).AsString;
          end
          else begin
          IDFileName := Fields[0].FieldName;
          Lkey := Fields[0].FieldName;
          lvalue := Fields[0].AsString;
          end;
          for I := 0 to count - 1 do // Iterate
          if (IDFileName <> '') and (IDFileName <> Fields[i].FieldName) then begin
          Result := Result + Fields[i].FieldName + '=';
          case Fields[i].DataType of //
          ftCurrency, ftBCD, ftWord: Result := Result + Fields[i].AsString;
          ftFloat: Result := Result + Fields[i].AsString;
          ftBytes, ftSmallint, ftInteger: Result := Result + IntToStr(Fields[i].AsInteger);
          else
          Result := Result + '''' + Fields[i].AsString + '''';
          end; // case
          Result := Result + ',';
          end; // for
          Result := copy(Result, 1, length(Result) - 1) + Format(' where %s=%s', [Lkey, lvalue]);
        end; // with
        ExeSQl(Result);
      end;
  end; // case
end;
其中的IndexField为指定自增长字段名,可定义在UntBaseProctol单元中!
newapple 38064 2009/7/19 5:18:36
1.用select * from xx where 日期>200x/x/x  会找到全部.. 
2.用adoquery.filter=true; adoquery.filtered=日期>200x/x/x..没问题但是有错误信息
sailgd 38063 2009/7/18 22:42:40
Thanks very much!!!!
noname272727 38049 2009/7/18 0:02:46
谢谢
james_ 38046 2009/7/17 23:29:00
ls的,这样也算问题么。。。
carcode 38045 2009/7/17 22:51:27
两个客户端启运,其中一个客户端修改或删除,而另一个客户端得不到通知或显示!希望解决!
james_ 38040 2009/7/17 18:17:50
good job~~
dmzn 38038 2009/7/17 16:39:15
严重支持!!小马同学出品的,堪称精品!!
ilove 38034 2009/7/17 14:53:25
还是用indy10好吧,indy10可以安装在d7-d2010下,这样就没有兼容的问题了
hsgrass 38033 2009/7/17 14:41:07
牛人阿,谢谢 :)
mmzmagic 38032 2009/7/17 13:23:21
To swgweb : 呵呵 谢谢你的热心,我回头创建一个SVN。
to thinknet:关于SQl注入的问题,应该由应用层根据项目情况在上层应用来做处理,因为如果在底层对各字段内容做处理的话,会降低使用效率。而且也不是每个项目都必须。
To All 感谢大家的支持,因为INDY有版本兼容的问题,我已经将客户端修改为Dxsock版本,这样不管那个版本的DELPHI都能编译(D2009除外),近期写个Demo后,连同支持大二进制字段一起上传到盒子。
szlbz 38031 2009/7/17 13:00:20
to iking:
   盒子上传不了。
第一页 上一页 下一页 最后页 有 71 条纪录 共4页 21 - 40
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表