【问题标题】:UPDATED - Handle possible sql stored procedures exception更新 - 处理可能的 sql 存储过程异常
【发布时间】:2021-11-22 05:40:09
【问题描述】:

我在我的 asp.net WebAPI 上使用存储过程来验证给定输入是否为 GUID。如果是,它将检索一些数据,如果不是,它将“中断”。 我想要做的是添加一些错误/异常处理程序,以防万一出现问题,这样用户就不会看到那些“乱码”的东西。 另外,我想检查一下这个存储过程是否存在于数据库中,所以连接和读取是否正常。

这是我调用此过程的 .net 代码:

 SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
                con.Open();
                SqlCommand com = new SqlCommand("oid_validation", con);
                com.CommandType = CommandType.StoredProcedure;
                com.Parameters.Add(new SqlParameter("@oid", id));
                V_WEBSEARCH wb = null;

                using (SqlDataReader dr = com.ExecuteReader())
                {

                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            wb = new V_WEBSEARCH();
                            wb.name= dr.GetString(dr.GetOrdinal("name"));
                            wb.lastname= dr.GetString(dr.GetOrdinal("lastname"));
                            wb.birthday= dr.GetString(dr.GetOrdinal("birthday"));
                            wb.city= dr.GetString(dr.GetOrdinal("city"));
                            wb.country= dr.GetString(dr.GetOrdinal("country"));
                            wb.address= dr.GetString(dr.GetOrdinal("address"));
                        }
                    }
                    else
                    {
                        con.Close();
                        return Ok("error");
                    }
                }

【问题讨论】:

  • 为什么不直接将参数设为uniqueidentifier,然后在传递之前在C# 中进行验证?旁注:您的连接和命令对象应该在using 块中
  • 不——不要走这条路。这里有很多坏习惯。首先,您不应该使用 PRINT 与应用程序通信。您抛出错误并且不应该仅仅为了将它们转换为“消息”而捕获它们。您使用强类型参数来避免问题。我可以继续,但您需要更好的指南来编写 TSQL 和编写应用程序代码。
  • 不是,你声明了@oid varchar(16),而是声明了@oid uniqueidentifier
  • 您当前的应用程序参数创建代码实际上是addwithvalue,我们不应该使用它。
  • 执行@SMor 的建议并在存储过程中抛出,在 C# 中捕获 SqlException。

标签: sql asp.net sql-server asp.net-mvc


【解决方案1】:

您可以捕获并制定一些响应并引发错误。将对此的调用包装在 c# try catch 中(可能包装在 using 中)

try
{
    //execute the SQLCommand
   using (var conn = new SqlConnection(connectionString))
   using (var command = new SqlCommand("dbo.myfunguyprocedure", conn) {
        command.Parameters.Add("@someint", SqlDbType.Int).Value = someFunInt; 
        CommandType = CommandType.StoredProcedure }) {
              conn.Open();
              command.ExecuteNonQuery();
   }
}
catch (SqlException ex)
{
    Console.WriteLine("Inner Exception: " + ex.Message);
    Console.WriteLine();
    Console.WriteLine("Query Executed: myfunguyprocedure");
    Console.WriteLine();
}
finally
{
    ; //add any code you want if an exception is thrown or not
}


CREATE PROCEDURE dbo.myfunguyprocedure 
(@someint INT)
AS 
BEGIN TRY
  /* do something that might fail */
END TRY
BEGIN CATCH
    DECLARE
        @ErrorSeverity INT,
        @ErrorMessage varchar(max) ;
    SELECT
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorMessage = 'myfunguyprocedure Errored: ' + ERROR_MESSAGE() 
        + ' @someint = ' + CONVERT(VARCHAR, @someint) 
    RAISERROR (@ErrorMessage , @ErrorSeverity , 1) WITH LOG
END CATCH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多