在Delphi中使用SQLserver varchar(1000)

时间:2016-03-12 15:46:51

标签: delphi delphi-7

我正在研究delphi 7和SQL Server 2008 R2。

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

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

如何在delphi中捕获varbinary类型?

SQL server示例代码

int i=0;
while (i<Math.min(array[0].length,array.length)) {
    System.out.println(array[i][i]);
    i++;
}

如果我正在返回varbinarydata如何在delphi中捕获它

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

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

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

1 个答案:

答案 0 :(得分:4)

&#34;是否可以在delphi中捕获varchar(1000)字符串&#34;是的。我认为您似乎怀疑它的原因是您的测试存在缺陷。

下面是访问Sql Server的D7应用程序的完整源代码和DFM摘录 使用Ado组件,并最终显示D7可以处理长字符串 从Sql Server。它返回一个2048 As的字符串。编写使用BDE的等效项目也是如此。所以问题出在其他地方。我希望,顺便说一句,该项目表明 使用Ado进行简单的Sql Server访问是多么容易。

接下来我修改了上面的项目来执行你的&#34;测试&#34;存储过程。返回的字符串的长度是24,正如我预期的那样,字符串的长度为千字符数据&#39; 24.对你的VarChar调用SP中的Convert()函数没有任何区别,因为&#39; Var&#39;在&#39; VarChar&#39;表示可变长度&#39;,即填充到定义的宽度1000。

如果我更改了“测试”的定义。 SP阅读

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

然后我的Ado和BDE项目中返回的字符串的长度为1000,这正是我所期望的。

你之前说过,你花了4个小时试图找不到问题。您可以尝试将项目复制到新文件夹,添加TAdoConnection和全局搜索,并替换其.Pas和.Dfm文件,以使用其Ado等效项替换BDE组件。看看你在另外四个小时内到达了多远。

StoredProc:

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