在delphi中获取SQL Server的错误信息初探

在delphi中,利用ADO对SQL Server 进行操作的时候,往往会产生一些错误,在DELPHI里则表现为异常。例如:当我们往SQL Server里面插入一个具有唯一性约束的重复记录值,SQL Server则会引发编号为2627的错误:违反了 %1! 约束 ''%2!''。不能在对象 ''%4!'' 中插入重复键。在delphi里设计程序时,难免要做这样的异常处理。

下面是做的一个测试程序:

一个ADOConnection1,一个ADOCOmmand1,一个ListBox1用于显示错误信息:

ADOConnection1连接到SQL Server的数据库,
ADOCommand1使用ADOConnection1作为数据连接,
ADOCommand1.commandText:='insert into MyTable (stID,Score)values(2,54)';
//其中stID具有唯一性约束,如果数据库中已经存在stID=2的记录,则以上命令执行后将会产生一个2627的错误即异常,我们可以这样处理这个异常:
try
   ADOCommand1.Execute;
except
   //ADOCommand1.Connection等效于ADOConnection1,因为我做测试的时候是在一个函数里测试整个过程的,该函数并没有
   //直接引用ADOConnection1,当然也可以直接用ADOConnection1,完全是个人习惯问题
   ListBox1.Items.Add(IntToStr(ADOCommand1.Connection.Errors.Count));//取得产生的错误总数,在Errors集合中
   for I:=0 to ADOCommand1.Connection.Errors.Count-1 do    //准备取出产生的所有错误
   begin
       ListBox1.Items.Add(IntToStr(ADOCommand1.Connection.Errors[k].Number));//错误代码,这是Delphi转换过的代码?
       ListBox1.Items.Add(ADOCommand1.Connection.Errors[k].Source);//产生错误的源
       //产生错误的原生代码,即SQL Server的代码,在我们的例子中你将看到显示的是2627,因此这个代码才是我们真正需要的
       ListBox1.Items.Add(IntToStr(ADOCommand1.Connection.Errors[k].NativeNumber));
  end;

记得李维的《Delphi 5.X ADO_MTS_COM+高级程序设计篇》里好像讲到为什么会有Delphi转换过的代码和原生代码共存的问题,大约是DELPHI想封装所有的错误包括那些没有包含在SQL Server里的错误。

我们可以看ADOConnection里的属性,其中一个属性就是对Errors的封装:
Error=ADOInt.Error
Errors =ADOInt.Errors;
在ADOInt中对Error和Errors的定义:
Error = interface(IDispatch)
    ['{00000500-0000-0010-8000-00AA006D2EA4}']
    function Get_Number: Integer; safecall;
    function Get_Source: WideString; safecall;
    function Get_Description: WideString; safecall;
    function Get_HelpFile: WideString; safecall;
    function Get_HelpContext: Integer; safecall;
    function Get_SQLState: WideString; safecall;
    function Get_NativeError: Integer; safecall;
    property Number: Integer read Get_Number;   //该属性返回错误代码
    property Source: WideString read Get_Source;  //返回产生错误的源
    property Description: WideString read Get_Description;
    property HelpFile: WideString read Get_HelpFile;
    property HelpContext: Integer read Get_HelpContext;
    property SQLState: WideString read Get_SQLState;
    property NativeError: Integer read Get_NativeError;//返回产生错误的原生错误代码,即SQL Server的错误代码
  end;

  //对Errors的定义,其中Item[Index:Olevariant]的属性被定义成Default,因此可以用Errors[I]来访问,返回的对象是Error对象
  Errors = interface(_Collection)
    ['{00000501-0000-0010-8000-00AA006D2EA4}']
    function Get_Item(Index: OleVariant): Error; safecall;
    procedure Clear; safecall;
    property Item[Index: OleVariant]: Error read Get_Item; default;
  end;

转载于:https://www.cnblogs.com/eagletian/archive/2005/02/07/103033.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi是一种集成开发环境(IDE),可以用于创建Windows应用程序。要在Delphi备份SQL Server数据库,您可以使用以下步骤: 1. 首先,确保在Delphi安装了相应的数据库连接组件,例如ADO(ActiveX 数据对象)组件。 2. 在Delphi创建一个新的应用程序项目。 3. 使用ADO组件建立与SQL Server数据库的连接。在连接组件的属性,设置数据库的服务器名称、用户名和密码等信息。 4. 创建一个备份操作的按钮或菜单项,使用户能够触发备份操作。 5. 在备份操作的事件处理程序,编写代码以执行备份操作。以下是一个示例代码: ```delphi procedure TForm1.BtnBackupClick(Sender: TObject); var MyConnection: TADOConnection; BackupQuery: TADOQuery; begin // 创建SQL Server数据库连接 MyConnection := TADOConnection.Create(nil); MyConnection.LoginPrompt := False; MyConnection.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=False;' + 'User ID=username;Password=password;Initial Catalog=databaseName;Data Source=serverName'; try // 建立与数据库的连接 MyConnection.Connected := True; // 执行备份操作的SQL语句 BackupQuery := TADOQuery.Create(nil); BackupQuery.Connection := MyConnection; BackupQuery.SQL.Text := 'BACKUP DATABASE databaseName TO DISK = ''C:\backup\backup.bak'''; BackupQuery.ExecSQL; ShowMessage('数据库备份成功!'); except on E: Exception do ShowMessage('数据库备份失败:' + E.Message); end; // 释放资源 BackupQuery.Free; MyConnection.Free; end; ``` 以上代码示例,需要替换username、password、databaseName和serverName为实际的SQL Server数据库连接信息。备份操作将数据库备份保存到指定的文件路径(C:\backup\backup.bak)。 通过以上步骤,您可以在Delphi使用适当的代码来备份SQL Server数据库。请注意正确设置连接信息和备份路径,以确保成功备份数据库

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值