Как правильно обработать это исключение dbnull? - PullRequest
0 голосов
/ 30 апреля 2019

Эта ошибка возникает, только если в базе данных не указан ни один пользователь. Я понятия не имею, почему это происходит. Я думал, что обработал исключение, но, видимо, нет.

Обработка dbnull была в порядке, пока я не внес изменения в код и хранимую процедуру, где ошибка снова возвращается.

Я пытался, но это не сработало.

   if (!DBNull.Value.Equals(cmd.ExecuteScalar()))
                        {
                         userId = Convert.ToInt32(cmd.ExecuteScalar());
                        }


тип ошибки


Object cannot be cast from DBNull to other types. 
  Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

 Exception Details: System.InvalidCastException: Object cannot be cast from DBNull to other types.

Source Error: 



Line 31:                     try
Line 32:                     {
Line 33:                         userid = Convert.ToInt32(cmd.ExecuteScalar());
Line 34:                     }
Line 35:                     catch (SqlException sqlEx)



[InvalidCastException: Object cannot be cast from DBNull to other types.]
   System.DBNull.System.IConvertible.ToInt32(IFormatProvider provider) +52
   System.Convert.ToInt32(Object value) +30
   clockin.RegisterUser(Object sender, EventArgs e) in C:\Users\na3307\source\repos\WebApplication2\WebApplication2\clockin.aspx.cs:33
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9782698
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +204
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +12
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +15
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1639


ASPX

   protected void RegisterUser(object sender, EventArgs e)
    {
        int userid = 0;
        string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand("clocking"))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    Session["username"] = txtUsername.Text;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@Username", txtUsername.Text.Trim());
                    cmd.Parameters.AddWithValue("@b", DropDownList1.SelectedValue.ToString());
                    cmd.Connection = con;
                    con.Open();

                    try
                    {
                        userid = Convert.ToInt32(cmd.ExecuteScalar());
                    }
                    catch (SqlException sqlEx)
                    {
                        if (sqlEx.Message.StartsWith("dbnull name "))
                        {
                            Label1.Text = "DBnull";
                        }                        
                        else
                            throw;
                    }



                    string message = string.Empty;


                    switch (userid)
                    {
                        case -1:
                            message = "You have already clocked in, TRY AGAIN LATER";
                            Label1.Text = message;

                            break;
                        case -2:
                            message = "Not ready to clock in yet OR User not registered!";
                            Label1.Text = message;
                            break;
                        default:
                            message = txtUsername.Text + ", You have clocked in successfully.";
                            Label1.Text = message;
                            break;

                    }

                }
            }
        }

хранимая процедура

CREATE PROCEDURE [dbo].[clocking]
      @Username NVARCHAR(100),
     @b nvarchar(100)

AS
BEGIN
  SET NOCOUNT ON;

            SELECT SCOPE_IDENTITY() -- UserId     
     IF EXISTS(select createddate,count(*) from clockin  where username = @Username and eventname = @b
group by createddate
HAVING COUNT(createddate) = 1
)
BEGIN
  SELECT -1 -- Username exists.
                  
END
         
      ELSE IF EXISTS(SELECT userid FROM selected WHERE Username = @Username and datepart(hour, CURRENT_TIMESTAMP) BETWEEN (select timein from timing) and (select timeout from timing) and
eventname = @b)

      BEGIN
                 INSERT INTO [clockin]
                     ([Username]
                     ,[CreatedDate],
                      [time],
                      [eventname]

)
            VALUES
                     (@Username                    
                    ,GETDATE(),
                     CURRENT_TIMESTAMP,
                     @b
)
      END          

  ELSE IF NOT EXISTS(SELECT userid FROM selected WHERE Username = @Username and eventname = @b)

BEGIN
  SELECT -2 -- Not ready to clock in yet OR User not registered!
                  
END
        
 
BEGIN
    update selected
set times =
(select count (*) from clockin
where selected.username = clockin.username)

END

END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...