小编Cay*_*ian的帖子

使用 Native Client 10 将 TDateTime 字段插入 SQL 2008 DB

我们有一个用 Delphi 2007 编写的遗留应用程序,并且仍在使用 BDE(是的,它需要切换到 ADO,但有超过 500K 行,这是一项艰巨的工作)。它使用 SQL SERVER ODBC 连接连接到 SQL Server 2008 DB。我正在尝试切换到 SQL Server Native Client 10.0,并且遇到了一个有趣的问题。当尝试将记录插入包含日期时间字段的表时,我们收到以下错误:

Project DateTimeParamTest.exe raised exception class EDBEngineError with message 'General SQL error.
[Microsoft][SQL Server Native Client 10.0]Datetime field overflow. Fractional second precision exceeds the scale specified in
the parameter binding.'.
Run Code Online (Sandbox Code Playgroud)

在进行一些研究时,我看到了有关 TParameter 对象的 NumericScale、Precision 和 Size 参数的评论。TADOQuery会自动将参数分别设置为3、23、16,插入没有问题。如果我在 TQuery 对象上将参数设置为相同,则会收到与上面相同的错误。

有谁有这方面的经验并知道简单的解决方法吗?我为任何想尝试的人创建了以下示例代码。您只需要更改连接和 SQL 代码。

日期时间参数测试_Main.dfm:

object Form10: TForm10
  Left = 0
  Top = 0
  Caption = 'Form10'
  ClientHeight = 111
  ClientWidth = …
Run Code Online (Sandbox Code Playgroud)

delphi bde delphi-2007 sql-server-2008 sql-server-native-client

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

使用Delphi 2007从虚拟文件夹加载文件

我试图从其中一个Windows虚拟文件夹(例如,相机或iPhone图片文件夹)加载文件的内容.下面是我正在使用的一些示例代码:

procedure TfrmForm.ButtonClick(Sender: TObject);
Var
  Dialog: TAttachDialog;
  Enum: IEnumShellItems;
  Name: LPWSTR;
  Item: IShellItem;
  Strm: IStream;
  OStrm: TOLEStream;
  FStrm: TFileStream;
  Result: HRESULT;
  Buf: Array[0..99] Of Char;
  Read: LongInt;
begin
  Result := CoInitializeEx(Nil, COINIT_APARTMENTTHREADED Or
                                COINIT_DISABLE_OLE1DDE);
  If Succeeded(Result) Then
  Begin
    Dialog := TAttachDialog.Create(Self);
    Try
      Dialog.Options := [fdoAllowMultiSelect, fdoPathMustExist,
                         fdoFileMustExist];
      Dialog.Title := 'Select Attachments';

      If Dialog.Execute(Self.Handle) Then
      Begin
        If FAILED(Dialog.ShellItems.EnumItems(Enum)) Then
          Raise Exception.Create('Could not get the list of files selected.');

        While Enum.Next(1, Item, Nil) = S_OK Do
        Begin
          If (Item.GetDisplayName(SIGDN_NORMALDISPLAY, Name) = S_OK) …
Run Code Online (Sandbox Code Playgroud)

windows delphi

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

在T-SQL脚本中创建视图

我们正在运行SQL Server 2008 R2并创建一个归档函数,该函数将创建一个新数据库(以后可以脱机并存储在其他地方),然后将数据从我们的主数据库中取出并将其放入新数据库中,最后创建主数据库中的视图,用于查看新表中的存档数据.

我有创建数据库的脚本,在新数据库中创建存档表,从主数据库复制记录并将它们放入存档数据库并从主数据库中删除记录.现在我正在尝试编写视图的脚本:

declare @sql varchar(8000)
set @sql = 'create view [' + @srcdb + '].[dbo].[vw_artrans] as 
            select * from [' + @srcdb + '].[dbo].artrans
            union
            select * from [' + @archdb + '].[dbo].artrans'
exec (@sql)
Run Code Online (Sandbox Code Playgroud)

但是您无法传递DB的名称来创建视图.

所以我尝试了这个:

declare @sql varchar(8000)
set @sql = 'use ' + @srcdb + ' 
            go
            create view [vw_artrans] as 
            select * from [' + @srcdb + '].[dbo].artrans
            union
            select * from [' + @archdb + '].[dbo].artrans'
exec (@sql)
Run Code Online (Sandbox Code Playgroud)

但它现在抱怨GO语句(语法不正确).

为存档数据创建的数据库的名称是在脚本中动态确定的( …

t-sql sql-server-2008-r2

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

Delphi 2007和动态变量数组作为Var参数

我有一个允许用户选择记录的表单,然后这个表单返回记录的ID和调用表单可能需要的任意数量的字段值.为此,我有一个函数来处理创建选择表单并将所有值传递给调用表单和从调用表单传递所有值:

Function Execute(AOwner: TComponent; AConnection: TADOConnection;
  AEditor: String; AButtons: TViewButtons; Var AID: Integer;
  Var ARtnVals: Array of Variant): TModalResult;
Var
  I: Integer;
Begin
  frmSelectGrid := TfrmSelectGrid.Create(AOwner);
  Try
    With frmSelectGrid Do
    Begin
      Connection := AConnection;
      Editor := AEditor;
      Buttons := AButtons;
      ID := AID;

      Result := ShowModal;
      If Result = mrOK Then
      Begin
        AID := ID;
        //VarArrayRedim(ARtnVals, Length(RtnVals));  !! Won't compile
        //SetLength(ARtnVals, Length(RtnVals));      !! Won't compile either
        For I := 0 To High(RtnVals) Do
          ARtnVals[I] := RtnVals[I];                 // Causes runtime exception …
Run Code Online (Sandbox Code Playgroud)

arrays delphi variant

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

如何在使用 PHP SQLSRV_QUERY 时忽略 T-SQL 打印语句

我们正在将一些 PHP 5.3 内部 API 代码转换为 PHP 7.2。转换过程的一部分是从使用 mssql_* DB API 切换到使用 sqlsrv_* DB API。我们发现的一件事是,旧的 MSSQL_EXECUTE 语句会忽略存储过程中的任何 T-SQL Print 语句,但新的 SQLSRV_QUERY 语句不会。

例如,我有以下示例存储过程:

create procedure spTestPrintStmt
  @var1 varchar(50),
  @var2 varchar(50),
  @var3 varchar(50),
  @rtn1 varchar(50) out,
  @rtn2 varchar(50) out
as
begin

  print 'Starting spTestPrintStmt...';

  print 'Vars: ' + @var1 + ',' + @var2 + ',' + @var3;

  select @rtn1 = @var1, @rtn2 = @var2 + @var3;

  print 'Returned: ' + @rtn1 + ',' + @rtn2;

  return 0;
end;
go
Run Code Online (Sandbox Code Playgroud)

我使用以下 PHP …

php sql-server sqlsrv

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

将文件名作为字段包含在 LogParser 中

我有以下 LogParser 2.2 查询,它将从 Exchange 2010 集线器传输的 SMTP 日志中查找所有 SMTP 错误,并将其输出到 SQL Server 2008 R2 数据库。这工作正常,但我想添加错误起源的日志文件的名称作为字段名称(这将使跟踪有关错误的更多详细信息变得更加容易)。有没有办法将日志文件名包含在字段列表中?

"C:\Program Files (x86)\Log Parser 2.2\logparser.exe" 
"SELECT 
  'Prospect' as ExchangeServer, 
  'Receive' as SmtpType, 
  TO_LOCALTIME(TO_TIMESTAMP(STRCAT(STRCAT(EXTRACT_PREFIX(TO_STRING([#Fields: date-time]),0,'T'),' '),EXTRACT_PREFIX(EXTRACT_SUFFIX(TO_STRING([#Fields: date-time]),0,'T'),0,'.')),'yyyy-MM-dd HH:mm:ss')) as Timestamp, 
  connector-id as Connector, 
  EXTRACT_PREFIX(local-endpoint,0,':') as ServerIP, 
  TO_INT(EXTRACT_SUFFIX(local-endpoint,0,':')) as ServerPort, 
  REVERSEDNS(EXTRACT_PREFIX(local-endpoint,0,':')) as ServerName, 
  EXTRACT_PREFIX(remote-endpoint,0,':') as ClientIP, 
  TO_INT(EXTRACT_SUFFIX(remote-endpoint,0,':')) as ClientPort,
  REVERSEDNS(EXTRACT_PREFIX(remote-endpoint,0,':')) as ClientName, 
  TO_INT(EXTRACT_PREFIX(data,0,' ')) as Error, event as Event, data as Data, 
  context as Context 
INTO SmtpLog 
FROM 'E:\Log Files\SMTP\Receive\*.LOG' 
WHERE (event = '>') and ((data …
Run Code Online (Sandbox Code Playgroud)

logging smtp logparser exchange-server-2010

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