小编Jam*_* L.的帖子

从SQL Server 2008表中的XML字段中提取属性

我有一个包含多个列的表,其中一xml列是一列.我没有在查询中使用的命名空间.对于所有记录,XML数据始终是相同的结构.

受控数据

create table #temp (id int, name varchar(32), xml_data xml)

insert into #temp values
(1, 'one',   '<data><info x="42" y="99">Red</info></data>'),
(2, 'two',   '<data><info x="27" y="72">Blue</info></data>'),
(3, 'three', '<data><info x="16" y="51">Green</info></data>'),
(4, 'four',  '<data><info x="12" y="37">Yellow</info></data>')
Run Code Online (Sandbox Code Playgroud)

期望的结果

Name    Info.x   Info.y   Info
-----   -------  -------  -------
one       42       99     Red
two       27       72     Blue
three     16       51     Green
four      12       37     Yellow
Run Code Online (Sandbox Code Playgroud)

部分工作

select Name, xml_data.query('/data/info/.').value('.', 'varchar(10)') as [Info]
from   #temp
Run Code Online (Sandbox Code Playgroud)

它返回NameInfo列.我无法弄清楚如何在不使用命名空间的情况下提取属性值.例如,以下查询返回错误:

查询1

select Name, xml_data.query('/data/info/@x') …
Run Code Online (Sandbox Code Playgroud)

xml-attribute sql-server-2008

28
推荐指数
1
解决办法
5万
查看次数

批处理文件脚本到zip文件

我有这种模式的文件夹结构.我刚刚在每个子目录中显示了两个子目录和2个文件,但通常我在单个级别上有n个子目录,在它们下面有单个级别的文件(但可以是n个文件).

Directory master
subDirectory x:
  file1
  file2
Directory y:
  file 3
  file 4
Run Code Online (Sandbox Code Playgroud)

我需要创建一个Windows脚本,一个从主目录运行的批处理文件,并给我两个包含各自文件的zip文件x.zip和y.zip.

我知道我的脚本必须使用for和zip命令但我正在试图让它工作,因为我无法理解这些命令的语法和谷歌搜索似乎没有帮助.

我找到了这样的命令, for %f in ("*.*") do zip "%~nf.zip" "%f" 但它似乎只有在没有子文件夹的情况下才直接存在.

windows batch-file

17
推荐指数
5
解决办法
19万
查看次数

Delphi TImageList位图更改

我正在使用Delphi XE2 Update 3. Update 4与我们的某些第三方组件不兼容,因此我们尚未更新.

我在我的应用程序中使用TImageList.我已经注意到很多次从源视图切换到窗体视图(F12)时,突然之前未修改的单元将被修改.如果我保存按F12导致的更改,我可以查看源代码控制并看到TImageList.Bitmap属性的几个字节已更改.这是TortoiseHg Workbench中的一个例子:

@@ -830,7 +830,7 @@
     Left = 760
     Top = 480
     Bitmap = {
-      494C01010200E402E40210001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+      494C01010200E802E80210001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
                   ^^  ^^  <-- two bytes changed
Run Code Online (Sandbox Code Playgroud)

有时会有其他微小的变化,但它总是仅限于TImageList.Bitmap数据中的几个孤立点.当我没有做出任何有意的改变时,不断将这些微不足道的变化推向源代码控制是一件非常痛苦的事情.

有谁知道为什么Delphi在源视图和表单视图之间切换时更改TImageList.Bitmap数据?有没有办法解决这个限制?

delphi version-control delphi-xe2 timagelist

15
推荐指数
1
解决办法
1116
查看次数

调试时Delphi App有"无调试信息"

我们构建了一个使用包和组件的应用程序.当我们调试应用程序时,IDE中的"事件日志"通常会显示我们的BPL正在加载而没有调试信息("无调试信息").这没有意义,因为我们所有的包和EXE都是使用debug构建的.

_(each project) | Options | Compiling_
[ x ] Assertions
[ x ] Debug information
[ x ] Local symbols
Symbol reference info = "Reference info"
[   ] Use debug .dcus
[ x ] Use imported data references

_(each project) | Options | Linking_
[ x ] Debug information
Map file = Detailed
Run Code Online (Sandbox Code Playgroud)

我们有4个项目,都是使用运行时pacakges构建的:

  1. Core.bpl
  2. Components.bpl
  3. Plugin.bpl(同时使用#1和#2)
  4. MainApp.exe(使用#1)

观察到的问题

1)我们多次调试时,Components.bpl加载了调试信息,但"Local Variables"窗口中的所有值都是空白的.如果将鼠标悬停在代码中的变量上,则没有弹出窗口,"评估"窗口也不显示任何内容("结果"窗格始终为空白).

2)有时事件日志显示各种BPL的"无调试信息".例如,如果我们激活Plugin.bpl项目并设置它的Run | 将参数的主机应用程序作为MainApp.exe,然后按F9,除Plugin.bpl模块外,所有模块似乎都加载"Has Debug Info".加载时,事件日志显示"无调试信息".但是,如果我们关闭应用程序并立即按F9,它将再次运行它而不重新编译任何东西,这次Plugin.bpl加载了调试("有调试信息").

问题

1)什么会导致"局部变量"窗口显示值?

2)当BPL符合调试并且所有调试文件(dcu,map等)都可用时,为什么BPL有时会在没有调试信息的情况下加载?

delphi debugging packages bpl delphi-xe2

13
推荐指数
2
解决办法
8237
查看次数

在Visual Studio中关闭整行复制

当光标位于空行并且没有选择时,Visual Studio 2010中有一个设置可以关闭复制和剪切命令.但是,当光标不在空白行并按ctrl + C时,它总是将整行复制到剪贴板.我觉得这很烦人,因为我总是首先突出显示它,复制它,然后将光标放在我要粘贴的位置,然后按ctrl + V. 但是,有时我会错过v并点击c,它用当前行的文本替换剪贴板上的文本,我必须从头开始...

有没有人知道如果没有选择就关闭复制,无论光标是否在空白行?

copy-paste visual-studio-2010

12
推荐指数
1
解决办法
2161
查看次数

随着xml文档的增长,交叉应用xml查询的性能呈指数级下降

是)我有的

我有一个可变大小的XML文档,需要在MSSQL 2008 R2上解析,如下所示:

<data item_id_type="1" cfgid="{4F5BBD5E-72ED-4201-B741-F6C8CC89D8EB}" has_data_event="False">
  <item name="1">
    <field id="{EA032B25-19F1-4C1B-BDDE-3113542D13A5}" type="2">0.506543009706267</field>
    <field id="{71014ACB-571B-4C72-9C9B-05458B11335F}" type="2">-0.79500402346138</field>
    <field id="{740C36E9-1988-413E-A1D5-B3E5B4405B45}" type="2">0.0152649050024924</field>
  </item>
  <item name="2">
    <field id="{EA032B25-19F1-4C1B-BDDE-3113542D13A5}" type="2">0.366096802804087</field>
    <field id="{71014ACB-571B-4C72-9C9B-05458B11335F}" type="2">-0.386642801354842</field>
    <field id="{740C36E9-1988-413E-A1D5-B3E5B4405B45}" type="2">0.031671174184115</field>
  </item>
</data>
Run Code Online (Sandbox Code Playgroud)

.

我想要的是

我需要将其转换为常规表类型数据集,如下所示:

item_name field_id                             field_type  field_value
--------- ------------------------------------ ----------- ---------------
1         EA032B25-19F1-4C1B-BDDE-3113542D13A5 2           0.5065430097062
1         71014ACB-571B-4C72-9C9B-05458B11335F 2           -0.795004023461
1         740C36E9-1988-413E-A1D5-B3E5B4405B45 2           0.0152649050024
2         EA032B25-19F1-4C1B-BDDE-3113542D13A5 2           0.3660968028040
2         71014ACB-571B-4C72-9C9B-05458B11335F 2           -0.386642801354
2         740C36E9-1988-413E-A1D5-B3E5B4405B45 2           0.0316711741841
3         EA032B25-19F1-4C1B-BDDE-3113542D13A5 2           0.8839620369590
3         71014ACB-571B-4C72-9C9B-05458B11335F 2           -0.781459993268
3         740C36E9-1988-413E-A1D5-B3E5B4405B45 2           0.2284423515729 …
Run Code Online (Sandbox Code Playgroud)

sql-server performance sqlxml sql-server-2008-r2 cross-apply

11
推荐指数
1
解决办法
9960
查看次数

TBitmap32.LoadFromStream() 自动识别图片格式

我正在使用 Delphi XE2(更新 3)和 GR32。我无法用于TBitmap32.LoadFromStream()加载图像数据。它引发以下异常:

Project MyApp.exe raised exception class EInvalidGraphic with message 'Bitmap image is not valid'.
Run Code Online (Sandbox Code Playgroud)

代码

uses GR32, GifImg, PngImage, Vcl.Graphics;

var
  pic: TBitmap32;
  bs: TBytesStream;
begin
  bs := TBytesStream.Create(TClientDataSet(cds).FieldByName('filedata').AsBytes);
  try
    pic := TBitmap32.Create;
    try
//      bs.SaveToFile('c:\delme.png');
//      pic.LoadFromFile('c:\delme.png');
      pic.LoadFromStream(bs); // <- EInvalidGraphic exception
      // do something with 'pic'
    finally
      FreeAndNil(pic);
    end;
  finally
    FreeAndNil(bs);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

解决方法

如果我对LoadFromStream()代码进行注释并取消对前两行的注释,它就会起作用——因此它能够在从文件加载图像时确定图像格式。在此示例中,bs包含有效的 PNG 图像。但是,有时它可能是 GIF、JPG、BMP 或其他图形格式。

我也知道我可以使用一个中间对象(例如,TPNGImageTJPEGImage等),加载使用图像数据LoadFromStream()向中间对象,然后Assign()它向 …

delphi image-formats graphics32

5
推荐指数
2
解决办法
6443
查看次数

鼠标滚轮将消息发送到错误的控件

我正在使用Windows XE2,TVirtualStringTreeTComboBox作为内置编辑器.

当我TComboBox直接在表单上放置时,在运行时我可以下拉列表,鼠标滚轮可以上下滚动列表中的项目(根据需要).但是,当TComboBox在运行时通过TVirtualStringTree就地编辑器创建时,即使新创建的组合框具有焦点,鼠标滚轮的WM_MOUSEWHEEL消息也会发送到树控件而不是组合框.

这很明显,因为组合框下拉列表中的项目不会滚动.相反,组合框后面的树控件滚动.组合框的固定部分随树一起移动,但下拉列表与组合框的固定部分断开连接并且不移动(如图所示).

树控件如何在下拉列表后面滚动的示例

在这两种情况下TComboBox.Style都设置为csDropDownList.当组合框创建为树的就地编辑器时,它以这种方式完成:

FCBox := TComboBox.Create(TreeControl);
FCBox.Visible := False;
FCBox.Parent := TreeControl;
// ... add items to combo box ...
FCBox.Visible := True;
FCBox.SetFocus;
FCBox.DroppedDown := True;
Run Code Online (Sandbox Code Playgroud)

鼠标在哪里悬停并不重要.它可以直接在组合框下拉列表中的项目上,并且后台中的树控件仍然是滚动的树控件.滚动组合框中项目的唯一方法是使用其滚动条.

什么会导致聚焦控件的父级接收鼠标滚轮消息而不是控件本身(在这种情况下,TComboBox)?

delphi mousewheel windows-messages delphi-xe2

5
推荐指数
1
解决办法
1116
查看次数

简单的浮点数会失去精度

我正在使用Delphi XE2 Update 3.即使是最简单的浮点数(如3.7)也存在精度问题.鉴于此代码(32位控制台应用程序):

program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses System.SysUtils;

var s: Single; d: Double; x: Extended;
begin
  Write('Size of Single  -----  ');  Writeln(SizeOf(Single));
  Write('Size of Double  -----  ');  Writeln(SizeOf(Double));
  Write('Size of Extended  ---  ');  Writeln(SizeOf(Extended));  Writeln;

  s := 3.7;  d := 3.7;  x := 3.7;

  Write('"s" is ');                  Writeln(s);
  Write('"d" is ');                  Writeln(d);
  Write('"x" is ');                  Writeln(x);                 Writeln;

  Writeln('Single Comparison');
  Write('"s > 3.7"  is  ');          Writeln(s > 3.7);
  Write('"s = 3.7"  is  ');          Writeln(s = …
Run Code Online (Sandbox Code Playgroud)

delphi floating-point-precision

5
推荐指数
2
解决办法
2746
查看次数

TSQLQuery.FieldByName().AsString - > TStringStream破坏数据

我正在使用Delphi XE2.我的代码从SQL-Server 2008 R2数据库中提取数据.返回的数据是一个nvarchar(max)包含1,055,227字节数据的字段.我使用以下代码将字段数据保存到文件:

procedure WriteFieldToFile(FieldName: string; Query: TSQLQuery);
var
  ss: TStringStream;
begin
  ss := TStringStream.Create;
  try
    ss.WriteString(Query.FieldByName(FieldName).AsString);
    ss.Position := 0;
    ss.SaveToFile('C:\Test.txt');
  finally
    FreeAndNil(ss);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

当我在十六进制查看器中检查文件时,第一个524,287字节(正好是1/2兆字节)看起来是正确的.剩余的字节(524,288到1,055,227)都是空值(#0),而不是原始数据.

这是将字符串字段从a保存TSQLQuery到文件的正确方法吗?我选择使用TStringStream因为我最终会添加代码来对流上的数据做其他事情,这是我无法做到的TFileStream.

delphi stream sql-server-2008-r2 delphi-xe2

4
推荐指数
1
解决办法
1456
查看次数

(TSQLConnection)为什么Left和Top属性仅在.dfm文件中可用?

我只是好奇为什么你可以删除一个TSQLConnection表单,它将添加LeftTop属性.dfm:

object Form1: TForm1
  ...
  object SQLConnection1: TSQLConnection
    Left = 8
    Top = 8
  end
end
Run Code Online (Sandbox Code Playgroud)

但是当您在代码中创建它时,LeftTop属性不是TSQLConnection该类的成员:

interface

type
  TForm1 = class(TForm)
    SQLConnection1: TSQLConnection;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FSQLCon: TSQLConnection;
  public
    { Public declarations }
  end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  FSQLCon := TSQLConnection.Create(Self);
  FSQLCon.Left := 280;
  FSQLCon.Top := 200;
end;
Run Code Online (Sandbox Code Playgroud)

编译:

[DCC Error] Unit1.pas(30): E2003 Undeclared identifier: 'Left'
[DCC Error] Unit1.pas(31): …
Run Code Online (Sandbox Code Playgroud)

delphi components runtime

2
推荐指数
1
解决办法
291
查看次数

Delphi AnsiString操作 - PAnsiChar变得腐败?

我使用以下方法来移动和操纵AnsiString.它大部分时间都有效,但有时指向字符串的指针退出运行.给出以下代码:

var
  s: AnsiString;
  p: PAnsiChar;
  offset, idx, cnt: Integer;
begin
  s := 'some>very>long>string>with>field>delimiters>';
  p := @s[1];
  offset := 1;

  // find the 5th field
  cnt := 5;
  repeat
    idx := AnsiString.AnsiPos('>', p);
    Inc(p, idx);
    Inc(offset, idx);
    Dec(cnt);
  until cnt = 0;

  // insert a new field after the 5th field
  Insert(AnsiString('something new>'), s, offset);

  // skip other fields
  // insert other values
  // repeat
end;
Run Code Online (Sandbox Code Playgroud)

调试时,在repeat..until循环结束后,您可以查看检查器并查看p = 'field>delimiters>'.在之后Insert()的语句,s = 'some>very>long>string>with>something …

delphi pointers ansistring delphi-xe2

1
推荐指数
1
解决办法
1634
查看次数