gpt4 book ai didi

c# - SQL Server 以及如何处理错误类型而不冲突

转载 作者:太空宇宙 更新时间:2023-11-03 14:15:15 24 4
gpt4 key购买 nike

我使用 SQL Server 2008 和 ASP.NET C#,我有一个返回一些计算行的存储过程。

我想在执行该过程之前检查参数值,如果参数值错误,我想返回自定义错误消息。

在 UI 端,我必须根据错误类型返回不同的文本并使用不同的窗口。示例:

  • 参数值错误时出错。
  • 未处理的错误。

我目前在数据库中使用这种SP,但我尝试使用状态参数甚至严重性参数来识别错误类型。但是我与非处理错误有一些冲突,返回与我的参数错误相同的状态号,所以错误的窗口出现了。如果我使用严重级别,我猜 SP 在某些情况下也可能返回具有相同严重级别的错误。

我给你一个简单的例子让你有更好的看法:

CREATE PROCEDURE dbo.GetData
@Date1 date,
@Date2 date
AS
BEGIN

-- check the parameters
IF @Date2 < @Date1
BEGIN
RAISERROR(N'Date 2 cannot be less than Date 1', 16, 2); -- <= Here State 2
return
END

-- process here...
DECLARE @Table1 TABLE ( name nvarchar(50) NOT NULL)

-- Supposing you have to insert a row with a NULL value
INSERT INTO @Table1 VALUES (NULL);
-- Thus, this query returns this error with the state 2 as well!
--Msg 515, Level 16, State 2, Procedure GetData, Line 21
--Cannot insert the value NULL into column 'name', table '@Table1'; column does not allow nulls. INSERT fails.

SELECT 'Record 1';
SELECT 'Record 2';
END

来自 C#:

List<string> data = new List<string>();

protected void Button1_Click(object sender, EventArgs e)
{
string errorMessage = string.Empty;
bool isErrorFromChecking = false;

if (GetValues(ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString,
new DateTime(2011, 01, 01), new DateTime(2011, 02, 01),
ref isErrorFromChecking, ref errorMessage))
{
Label1.Text = data[0].ToString();
return;
}

if (isErrorFromChecking)
{
Label1.Text = errorMessage;
return;
}
Label1.Text = string.Format("Internal Error: {0}.", errorMessage);
}

private bool GetValues(string connectionString, DateTime date1, DateTime date2,
ref bool isErrorFromChecking, ref string errorMessage)
{
data = new List<string>();
try
{
using (SqlConnection sqlCon = new SqlConnection(connectionString))
{
sqlCon.Open();
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlCon;
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.CommandText = "dbo.GetData";

sqlCmd.Parameters.AddWithValue("Date1", date1);
sqlCmd.Parameters.AddWithValue("Date2", date2);

SqlDataReader reader = sqlCmd.ExecuteReader();
while (reader.Read())
{
data.Add(reader[0].ToString());
}
reader.Close();
sqlCon.Close();
}
}
catch (SqlException ex)
{
if (ex.State == 2)
{
isErrorFromChecking = true;
errorMessage = ex.Message;
return false;
}
isErrorFromChecking = false;
errorMessage = ex.Message;
return false;
}
catch (Exception ex)
{
isErrorFromChecking = false;
errorMessage = ex.Message;
return false;
}

return true;
}

在上面的代码中,日期是正确的,但是程序没有返回消息“Internal Error: …”,尽管 SP 有错误。

我有一些想法,但我只想知道你的观点和最好的实现方式。

谢谢。

最佳答案

根据这个http://msdn.microsoft.com/en-us/library/ms178592.aspx当您自己提供消息字符串时,您将获得一个消息 ID 50000。我想您可以在 C# 代码中对此进行测试。

或者您可以在 SP 中指定 MsgID(值 > 50000),并在客户端代码中根据 MsgID 提供错误消息。

关于c# - SQL Server 以及如何处理错误类型而不冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6706172/

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