c# - 如何正确处理此 dbnull 异常?
问题描述
仅当数据库中没有指定用户时才会发生此错误。我不知道为什么会这样。我以为我处理了异常,但显然不是。
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
解决方案
推荐阅读
- apache-kafka - Kafka Streams Topology 不同的键但相同的模式
- r - 用 lubridate 加半个月
- go - 使用 firebase “in” 运算符会导致错误
- laravel - laravel nova 中的货币字段(输入)
- javascript - 如何使用 JqueryUI 在 datepicker 中更改日期格式?
- python - 如何使用 powershell 或 python 获取 Windows 服务的用户凭据
- css - CSS - 添加省略号而没有文本溢出
- laravel - Laravel 索引和存储视图在同一页面方法中
- java - 输入的行为不像预期的那样,java FileReader
- java - 如果存在则如何返回对象,否则返回可选的空