gpt4 book ai didi

sql-server - 无法使用 Delphi ZeosLib 和 Delphi 7 将 Unicode 插入 SQL Server 2008

转载 作者:行者123 更新时间:2023-12-02 23:19:31 28 4
gpt4 key购买 nike

我在使用 Delphi ZeosLib 和 Delphi 7 将 Unicode 插入 SQL Server 数据库,然后读取插入的值时遇到问题。我创建了一个简单的测试程序,首先插入然后查询插入的值。

测试表架构:

CREATE TABLE [dbo].[incominglog](
[message] [nvarchar](500) NULL
) ON [PRIMARY]

我已经上传了简单的测试程序源(包括 ZeosLib 源)- click here去下载。我还包含了 ntwdblib.dll,但您可以使用自己的。

测试程序还需要TNT组件,可以从here下载

使用测试程序,我插入的 Unicode 字符在检索时显示为问号 - 我不确定问题出在插入代码还是查询代码上。

我还尝试在插入之前将数据编码为 utf-8,然后在从 utf-8 检索后解码数据 - 请在测试程序源中搜索“//inserted as utf8”。我可以在解码后查看 Unicode,因此此方法有效。但是,对于我的实际应用程序,我无法编码为 UTF-8,因为 SQL Server 不完全支持 UTF-8 - 有些字符无法存储。请参阅我之前的问题here .

非常感谢任何指点。 :)

同时,这是测试程序的源代码:

unit Unit1;

interface

uses
ZConnection, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ZAbstractRODataset, ZAbstractDataset, ZAbstractTable, ZDataset,
StdCtrls, TntStdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
TntMemo1: TTntMemo;
Button2: TButton;
TntEdit1: TTntEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
FZConnection: TZConnection;
FZQuery: TZQuery;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
tntmemo1.Lines.Clear;
FZConnection := TZConnection.Create(Owner);
FZConnection.LoginPrompt := False;
FZQuery := TZQuery.Create(Owner);
FZQuery.Connection := FZConnection;
FZConnection.Protocol := 'mssql';
FZConnection.Database := 'replace-with-your-db';
FZConnection.HostName := 'localhost';
FZConnection.User := 'sa';
FZConnection.Password := 'replace-with-your-password';
FZConnection.Connect;
FZQuery.SQL.Text := 'SELECT * from incominglog';
FZQuery.ExecSQL;
FZQuery.Open;
FZQuery.First;
while not FZQuery.EOF do
begin
tntmemo1.Lines.add(FZQuery.FieldByName('message').AsString);
// tntmemo1.Lines.add(utf8decode(FZQuery.FieldByName('message').AsString)); //inserted as utf8
FZQuery.Next;
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
sqlstring, data:widestring;
begin
FZConnection := TZConnection.Create(Owner);
FZConnection.LoginPrompt := False;
FZQuery := TZQuery.Create(Owner);
FZQuery.Connection := FZConnection;
FZConnection.Protocol := 'mssql';
FZConnection.Database := 'replace-with-your-db';
FZConnection.HostName := 'localhost';
FZConnection.User := 'sa';
FZConnection.Password := 'replace-with-your-password';
FZConnection.Connect;
data:= tntedit1.Text;
// data:= utf8encode(tntedit1.Text); //inserted as utf8
sqlstring:= 'INSERT INTO INCOMINGLOG ([MESSAGE]) VALUES(N''' + data + ''')';
FZQuery.SQL.Text := sqlstring;
FZQuery.ExecSQL;
end;

end.

最佳答案

我还没有测试您的示例,但我能够使用 Delphi 7 VCL/CLX 和 zeoslib 在 SQL Server 上毫无问题地保存和检索数据库 Unicode 字符。

我认为在你的情况下,像这样改变你的保存程序就足够了:

procedure TForm1.Button2Click(Sender: TObject);
var
sqlstring : widestring;
data : UTF8String;
begin
FZConnection := TZConnection.Create(Owner);
FZConnection.LoginPrompt := False;
FZQuery := TZQuery.Create(Owner);
FZQuery.Connection := FZConnection;
FZConnection.Protocol := 'mssql';
FZConnection.Database := 'replace-with-your-db';
FZConnection.HostName := 'localhost';
FZConnection.User := 'sa';
FZConnection.Password := 'replace-with-your-password';
FZConnection.Connect;
data:= UTF8String( utf8encode(tntedit1.Text) );
sqlstring:= 'INSERT INTO INCOMINGLOG ([MESSAGE]) VALUES(:DATA)';
FZQuery.SQL.Text := sqlstring;
FZQuery.ParamByName('DATA').AsString := data;
FZQuery.ExecSQL;
end;

重点是将数据字符串变量更改为 UTF8String 类型,并使用参数将数据字符串传递给查询...老实说,我将它与 ZTable 和 Post 命令一起使用,但它应该与像你这样的 ZQuery 相同......

关于sql-server - 无法使用 Delphi ZeosLib 和 Delphi 7 将 Unicode 插入 SQL Server 2008,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17230419/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com