在 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
我正在 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