SQL Server 2000 获取错误信息(不是在catch块中,以及在2000以下数据库)

  • 在sqlserver 2000数据库中,没有像sqlserver 2005一样的try...catch语句,然后可以在catch语句中获取错误信息,针对这种情况需要开发一个过程来获取错误信息,具体如下:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

--Mudassar Khan
/*
PRINT 1/0
DECLARE @err_num INT
SELECT @err_num=@@ERROR
DECLARE @errMsg VARCHAR(1000)
EXEC sp_GetErrorDesc_2000 @ErrorNo=@err_num, @ErrorDesc=@errMsg OUTPUT
SELECT @err_num, @errMsg
*/

ALTER PROCEDURE sp_GetErrorDesc_2000
	@ErrorNo int, 
	@ErrorDesc varchar(1000) output
AS
BEGIN
	SET NOCOUNT ON;
	CREATE TABLE #Log
	(
		Data varchar(8000),
		ContinuationRow int
	)


	DECLARE @sql varchar (100)
	SELECT @sql = '.master.dbo.xp_readerrorlog'
	INSERT #Log
	EXEC @sql


	DECLARE @err_no varchar(1000), 
			@err_mesg varchar(1000),
			@date varchar (30), 
			@charidx int 

	SELECT TOP 1 @err_no=data FROM #Log
	WHERE data LIKE '%' + CONVERT(varchar(4), @ErrorNo) + '%' ORDER BY data DESC

	--SELECT * FROM #Log WHERE
	-- data like '%' + @data + '%'

	SET  @charidx = CHARINDEX('spid', @err_no)
	SET @date = SUBSTRING(@err_no,0,@charidx)

	SELECT  @err_mesg = data FROM #Log 
	WHERE data LIKE '%' + @date + '%' 
	AND data NOT LIKE '%Error%'
	DROP table #Log

	SET @err_no = LTRIM(SUBSTRING(@err_no, @charidx + 7, LEN(@err_no)))
	SET @err_mesg = LTRIM(SUBSTRING(@err_mesg, @charidx + 7, LEN(@err_mesg)))
	SET @ErrorDesc = @err_no + char(13) + 'Desc: ' + @err_mesg + char(13) + 'Date: ' + @date 

	if @ErrorDesc is NULL
	BEGIN
		SET @ErrorDesc = 'No Log Error Message(Error_Numer='+CAST(@ErrorNo AS VARCHAR(30))+')'
		exec sp_altermessage @ErrorNo, 'WITH_LOG', 'TRUE'
	END
END

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

注意:因为上面代码是从日志中获取错误信息,而在错误第一次发生时,因为没有注册要登记指定错误号到日志,所以查不到对应日志,这时会返回一个“No Log Error...”的错误。只有再次发生这个错误时,才会返回真正的错误信息。

  • 在Sql 2005以上的数据库获取错误的过程如下:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

/*
PRINT 1/0
DECLARE @err_num INT
SELECT @err_num=@@ERROR
DECLARE @errMsg VARCHAR(1000)
EXEC sp_GetErrorDesc_2005 @ErrorNo=@err_num, @ErrorDesc=@errMsg OUTPUT
SELECT @err_num, @errMsg
*/

ALTER PROCEDURE sp_GetErrorDesc_2005
	@ErrorNo int, 
	@ErrorDesc varchar(1000) output
AS
BEGIN
	SET NOCOUNT ON;
	CREATE TABLE #Log08
	(
		LogDate DATETIME,
		ProcessInfo VARCHAR(300),
		[Text] VARCHAR(7000)	
	)

	--
	DECLARE @sql varchar (100)
	SELECT @sql = '.master.dbo.xp_readerrorlog'
	INSERT #Log08
	EXEC @sql
	
	--
	SELECT TOP 1 @ErrorDesc=aa.Data
	FROM (
		SELECT a.LogDate, ISNULL(CONVERT(VARCHAR(30),a.LogDate,120),'')+','+  ISNULL(a.[Text],'')+ISNULL(b.[Text],'') AS 'Data'
		FROM (
			SELECT *
			FROM #Log08 AS tt
			WHERE (
					tt.[Text] LIKE '%错误%'
					OR tt.[Text] LIKE '%Error%'
				)	
				AND tt.[Text] LIKE '%'+CAST(@ErrorNo AS VARCHAR(20))+'%'
		) AS a
		JOIN (
			SELECT *
			FROM #Log08 AS tt2	
		) AS b
		ON b.LogDate = a.LogDate 
			AND b.ProcessInfo = a.ProcessInfo 
			AND b.[Text] <> a.[Text]
	) AS aa
	ORDER BY aa.LogDate DESC	
	
	--
	if @ErrorDesc is NULL
	BEGIN
		SET @ErrorDesc = 'No Log Error Message(Error_Numer='+CAST(@ErrorNo AS VARCHAR(30))+')'
		exec sp_altermessage @ErrorNo, 'WITH_LOG', 'TRUE'
	END
	
	--
	DROP TABLE #Log08
END

GO

  • 最终写一个总的获取错误信息的过程如下,即:可以自动检查当前数据是2000,还是2005来返回错误信息,代码如下:
/****** Object:  StoredProcedure [dbo].[sp_GetErrorDesc]    Script Date: 09/20/2021 09:28:36 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

/*
PRINT 1/0
DECLARE @err_num INT
SELECT @err_num=@@ERROR
DECLARE @errMsg VARCHAR(1000)
EXEC sp_GetErrorDesc @ErrorNo=@err_num, @ErrorDesc=@errMsg OUTPUT
SELECT @err_num, @errMsg
*/

ALTER PROCEDURE [dbo].[sp_GetErrorDesc]
	@ErrorNo int, 
	@ErrorDesc varchar(1000) output
AS
BEGIN
	SET NOCOUNT ON;

	--
	DECLARE @CurProductMajorVer INT
	SELECT @CurProductMajorVer=CAST(ugsi.ProductMajorVersion AS INT)
	FROM dbo.UDF_GetServerInfo() AS ugsi
	
	--
	IF @CurProductMajorVer<9  --SQL Server 2000 and below
	BEGIN
		EXEC sp_GetErrorDesc_2000
			@ErrorNo = @ErrorNo,
			@ErrorDesc = @ErrorDesc OUTPUT
	END
	ELSE	--SQL Server 2005 and above
	BEGIN
		EXEC sp_GetErrorDesc_2005
			@ErrorNo = @ErrorNo,
			@ErrorDesc = @ErrorDesc OUTPUT
	END	
END


GO


注意:上面代码中的UDF_GetServerInfo函数可以参照另一个文章获取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要从 SQL Server 数据库获取乘客列表并将其动态添加到表格,你需要使用 Java 的 JDBC(Java Database Connectivity)来连接到数据库并执行相应的查询操作。以下是一个示例代码,演示了如何实现这个功能: ```java import java.sql.*; public class PassengerListGUI extends JFrame { private JTable table; private DefaultTableModel tableModel; public PassengerListGUI() { setTitle("Passenger List"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(500, 400); setLocationRelativeTo(null); tableModel = new DefaultTableModel(); table = new JTable(tableModel); tableModel.addColumn("name"); tableModel.addColumn("password"); tableModel.addColumn("telephone"); tableModel.addColumn("id"); tableModel.addColumn("birthday"); tableModel.addColumn("name_real"); tableModel.addColumn("vip_check"); tableModel.addColumn("score"); fetchPassengerData(); } private void fetchPassengerData() { try { // 连接到 SQL Server 数据库 String url = "jdbc:sqlserver://localhost:1433;databaseName=YourDatabaseName"; String user = "YourUsername"; String password = "YourPassword"; Connection connection = DriverManager.getConnection(url, user, password); // 执行查询操作 Statement statement = connection.createStatement(); String query = "SELECT name, password, telephone, id, birthday, name_real, vip_check, score FROM passenger"; ResultSet resultSet = statement.executeQuery(query); // 遍历结果集并添加到表格 while (resultSet.next()) { String[] rowData = new String[8]; rowData[0] = resultSet.getString("name"); rowData[1] = resultSet.getString("password"); rowData[2] = resultSet.getString("telephone"); rowData[3] = resultSet.getString("id"); rowData[4] = resultSet.getString("birthday"); rowData[5] = resultSet.getString("name_real"); rowData[6] = resultSet.getString("vip_check"); rowData[7] = resultSet.getString("score"); tableModel.addRow(rowData); } // 关闭连接和资源 resultSet.close(); statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` 在上面的代码,首先创建了一个 `PassengerListGUI` 类,该类继承自 `JFrame`。在构造方法,我们创建了一个带有列名的表格,并调用 `fetchPassengerData()` 方法来获取乘客数据并将其添加到表格。 在 `fetchPassengerData()` 方法,我们首先建立与 SQL Server 数据库的连接,并执行查询操作来获取乘客数据。然后,我们遍历结果集并将每一行数据添加到表格的模型。 请确保替换示例代码数据库连接信息(`url`、`user`、`password`)为你自己的数据库连接信息,并适配表格的列名和数据类型以匹配你的实际数据库结构。 这只是一个简单的示例,你可能还需要根据具体需求进行调整和优化。另外,请确保在使用 JDBC 时导入了正确的 JDBC 驱动程序,以便与 SQL Server 进行连接和通信。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值