SQL Server 2008とASP.NET C#を使用しており、計算された行を返すストアドプロシージャがあります。SQL Serverと矛盾のないエラーの種類を処理する方法
プロセスを実行する前にパラメータの値を確認したいのですが、パラメータ値が間違っている場合はカスタムエラーメッセージを返したいと思います。
UI側では、別のテキストを返し、エラータイプに応じて別のウィンドウを使用する必要があります。例:
- パラメータ値が間違っているときのエラー。
- 処理されないエラーが発生しました。
私は現在、データベースでこの種のSPを使用していますが、エラーの種類を識別するためにstate引数とseverity引数を使用しようとしました。しかし私は、私のパラメータエラーと同じ状態番号を返す非対処エラーといくつかの競合があり、間違ったウィンドウが表示されます。重大度を使用すると、同じ重大度のエラーが返されることがあります。 #Cからの
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
:
私はあなたをより見やすく持っている簡単な例を与える上記のコードで
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;
}
を、日付が正しく表示されますが、プログラムがメッセージを返しません「内部エラー:...」SPにエラーがありました。
私はいくつかのアイデアを持っていますが、私はあなたの視点とそれを行う最良の方法を知りたいだけです。
ありがとうございました。
あなたの提案では、「チェック」SPは2回呼び出されます。しかしそれは良い考えです!プロセスと同じSPで「チェック」ロジックを維持する方法はありますか?私はいつか、spの始めに2つの日付を比較するのは簡単ではないことを意味し、spの終わりにある可能性があります。 – Dan
はい、私の例では2回呼び出されます。もちろん、SPが他の場所で使用されていない場合は、SPからチェックを完全に削除し、常にチェックを最初に呼び出すクライアントアプリケーションに依存することができます。 私は別のアプローチを与えるために答えを広げました –
あなたの答えは@Joelありがとうございます。実際には、私はついにあなたの代替案のようにOUTPUTパラメータを実装しました。この段階ではユーザー定義のメッセージを使用しないため、これは私にとって最適なソリューションです。このプロジェクトでは使用しないでください。 – Dan