我正在研究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')
答案 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