在 Delphi 中使用 SQLserver varchar(1000)

Consume SQLserver varchar(1000) in Delphi

我正在 delphi 7 和 SQL 服务器 2008 R2 上工作。

Sql 服务器存储过程返回一个 varchar(1000) 并且 delphi 无法捕获 varchar(1000),它只能捕获少于 300 个字符。 我正在使用 TStoredProc 组件。

是否可以在 delphi 中捕获 varchar(1000) 字符串,或者我是否需要使用 varbinary?

如何在 delphi 中捕获 varbinary 类型?

SQL 服务器示例代码

create procedure test
as
select testdata = convert( varchar(1000),'thousand characters data')

如果我要返回 varbinarydata 如何在 delphi

中捕获它
create procedure test
as
select testdata = convert( varbinary(1000),'thousand characters data')

下面是我的 delphi 代码来加载 varbinary 字段,我变得无效 class 类型转换,我被困在这里:(

button click
var
    blob: TStream;
begin
  fProcDesc := TStoredProc.Create(self);
  fProcDesc.DatabaseName := fDatabaseName;
  fProcDesc.StoredProcName := 'dbo.test';
  fProcDesc.open ;
  blob := fProcDesc.CreateBlobStream(fProcDesc.FieldByName('testdata'),bmWrite) //Invalid class typecast

end

"is it posible to catch varchar(1000) string in delphi " 是的。我认为你似乎怀疑它的原因是你的测试有缺陷。

下面是访问 Sql 服务器的 D7 应用程序的完整源代码和 DFM 摘录 使用 Ado 组件,并最终表明 D7 可以处理长字符串 来自 Sql 服务器。它returns一串2048个As。为使用 BDE 而编写的等效项目也是如此。所以你的问题出在别处。我希望,顺便说一句,该项目表明 使用 Ado 进行简单的 Sql 服务器访问是多么容易。

接下来我修改了上面的项目来执行你的 "test" 存储过程。返回的字符串的长度是 24,正如我预期的那样,因为字符串 'thousand characters data' 的长度是 24。在 SP 中对 Convert() 函数进行 VarChar 调用对此没有影响,因为'VarChar' 中的 'Var' 表示 'variable length',即 不是 填充到定义的宽度 1000。

如果我把你的 'test' SP 的定义改成

select testdata = convert( char(1000),'thousand characters data')

那么在我的 Ado 和 BDE 项目中返回的字符串的长度都是 1000,这正是我所期望的。

您之前说过您花了 4 个小时试图 w/o 成功找到您的问题。您可以尝试将您的项目复制到一个新文件夹,添加 TAdoConnection 和全局搜索并替换其 .Pas 和 .Dfm 文件,以将您的 BDE 组件替换为它们的 Ado 等效项。再过四个小时,看看你能走多远。

存储过程:

CREATE PROCEDURE [dbo].[spTestLongString](@input varchar(2048))
AS
BEGIN
  SET NOCOUNT ON;
  SELECT Upper(@Input)
END

代码:

uses
  Windows, Messages, SysUtils,  Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, StrUtils, DB, ADODB;

type
  TForm1 = class(TForm)
    btnOpen: TButton;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    Memo1: TMemo;
    procedure btnOpenClick(Sender: TObject);
  private
    procedure TestStoredProc;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.TestStoredProc;
var
  S1,
  S2 : String;
begin
  S1 := DupeString('a', 2048);
  AdoQuery1.SQL.Text := 'dbo.spTestLongString @input = :input';
  AdoQuery1.Parameters.ParamByName('input').Value := S1;
  AdoQuery1.Open;
  S2 := AdoQuery1.Fields[0].AsString;
  Memo1.Lines.Text := Format('Len:%d'#13#10'value:%s', [Length(S2), S2]);
end;

procedure TForm1.btnOpenClick(Sender: TObject);
begin
  TestStoredProc;
end;

DFM:

  object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
      'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security In' +
      'fo=False;Initial Catalog=MATest;Data Source=mat410\ss2014'
    LoginPrompt = False
    Provider = 'SQLOLEDB.1'
  end
  object ADOQuery1: TADOQuery
    Connection = ADOConnection1
    CursorLocation = clUseServer
    Parameters = <
      item
        Name = 'input'
        Attributes = [paNullable]
        DataType = ftString
        NumericScale = 255
        Precision = 255
        Size = 2048
        Value = Null
      end>
    Prepared = True
    SQL.Strings = (
      'dbo.spTestLongString @input = :input)
    Left = 80
    Top = 16
  end
end