为什么能插入数据却提示 “对象不能从 DBNull 转换为其他类型”

zmlzmlzml 2010-12-22 12:23:27
页面后台部分代码
protected void ibtnAdd_Click(object sender, ImageClickEventArgs e)
{
bool result=UserManager.ExistsUser(txtUserId.Text.Trim());
if (result)
{
Page.ClientScript.RegisterStartupScript(GetType(), "", "<script>alert('用户已存在,请更换用户。')</>");
txtUserId.Focus();
}
else
{
User user = new User();
user.Address = txtAddress.Text.Trim();
user.Email = txtEmail.Text.Trim();
user.Gender = int.Parse(rblGender.SelectedValue);
user.IDCardNo = txtIdCard.Text.Trim();
user.Mark = 0;
user.Money = 0;
user.PassAnswer = txtPassWord.Text.Trim();
user.PassQuestion = ddlQuestion.SelectedValue;
user.PassWord = txtPassWord.Text.Trim();
user.TelNo = txtTelNo.Text.Trim();
user.UserId = txtUserId.Text.Trim();
user.UserName = "新会员";
UserRole userRole = new UserRole();
UserState userState = new UserState();
userRole.RoleId = 4;
user.Role = userRole;
userState.UserStateId = 1;
user.UserState = userState;


int results = UserManager.AddUser(user);
if (results > 0)
{
Page.ClientScript.RegisterStartupScript(GetType(), "", "<script>alert('注册成功!待审核之后将成为本站会员。');location.href='Index.aspx'</>");
}
else
{
Page.ClientScript.RegisterStartupScript(GetType(), "", "<script>alert('注册失败,请联系管理员。');location.href='shenhe.aspx'</>");
}
}
}


数据访问
public static int AddUser(User user)
{
string sql =
"INSERT UserInfo (UserId, UserName, PassWord, RoleId, Gender, PassQuestion, PassAnswer, Email, TelNo, Address, IDCardNo, Money, UserState, Mark)" +
"VALUES (@UserId, @UserName, @PassWord, @RoleId, @Gender, @PassQuestion, @PassAnswer, @Email, @TelNo, @Address, @IDCardNo, @Money, @UserState, @Mark)";

sql += " ; SELECT @@IDENTITY";

try
{
SqlParameter[] para = new SqlParameter[]
{
new SqlParameter("@UserId",user.UserId),
new SqlParameter("@RoleId", user.Role.RoleId), //FK
new SqlParameter("@UserState", user.UserState.UserStateId), //FK
new SqlParameter("@UserName", user.UserName),
new SqlParameter("@PassWord", user.PassWord),
new SqlParameter("@Gender", user.Gender),
new SqlParameter("@PassQuestion", user.PassQuestion),
new SqlParameter("@PassAnswer", user.PassAnswer),
new SqlParameter("@Email", user.Email),
new SqlParameter("@TelNo", user.TelNo),
new SqlParameter("@Address", user.Address),
new SqlParameter("@IDCardNo", user.IDCardNo),
new SqlParameter("@Money", user.Money),
new SqlParameter("@Mark", user.Mark)
};

int newId = DBHelper.GetScalar(sql, para);
return newId;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
throw e;
}
}
...全文
294 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
钟独有芩 2010-12-22
  • 打赏
  • 举报
回复
字段里没有时间
这是数据库自动生成的代码
代码里没有包含时间
USE [NetShop]
GO
/****** 对象: Table [dbo].[UserInfo] 脚本日期: 12/22/2010 00:45:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[UserInfo](
[UserId] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[UserName] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[PassWord] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[RoleId] [int] NOT NULL,
[Gender] [int] NOT NULL,
[PassQuestion] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[PassAnswer] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Email] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[TelNo] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Address] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[IDCardNo] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Money] [float] NOT NULL,
[UserState] [int] NOT NULL,
[Mark] [int] NOT NULL,
CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
USE [NetShop]
GO
ALTER TABLE [dbo].[UserInfo] WITH CHECK ADD CONSTRAINT [FK_UserInfo_RoleInfo] FOREIGN KEY([RoleId])
REFERENCES [dbo].[UserRole] ([RoleId])
GO
ALTER TABLE [dbo].[UserInfo] WITH CHECK ADD CONSTRAINT [FK_UserInfo_UserState] FOREIGN KEY([UserState])
REFERENCES [dbo].[UserState] ([UserStateId])
loveheronly 2010-12-22
  • 打赏
  • 举报
回复
是不是插入的是时间的?
你给数据库默认时间为getdate()就可以了
来自故乡的风 2010-12-22
  • 打赏
  • 举报
回复
感觉“空值”在C#里很难控制的。下面的文章的最后部分,有这方面的例子:

http://www.asp.net/data-access/tutorials/creating-a-business-logic-layer-cs

即使字段允许为空,也不能直接用“null”赋值。他用的是这种方法:
if (supplierID == null) product.SetSupplierIDNull();
else product.SupplierID = supplierID.Value;
if (categoryID == null) product.SetCategoryIDNull();
else product.CategoryID = categoryID.Value;
钟独有芩 2010-12-22
  • 打赏
  • 举报
回复

页面代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Register.aspx.cs" Inherits="SysManage_Register" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link href="../Styles/Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div style="width: 1024px">
<div style="width: 100%">
<div style="width: 50%; float: left; text-align: right">
登录名:</div>
<div style="width: 50%; float: left">
<asp:TextBox ID="txtUserId" runat="server" CssClass="inputCss"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtUserId"
ErrorMessage="用户名不能为空!" ForeColor="Red"></asp:RequiredFieldValidator>
</div>
</div>
<div style="width: 100%">
<div style="width: 50%; float: left; text-align: right">
密码:</div>
<div style="width: 50%; float: left">
<asp:TextBox ID="txtPassWord" runat="server" CssClass="inputCss" TextMode="Password"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtPassWord"
ErrorMessage="密码不能为空!" ForeColor="Red"></asp:RequiredFieldValidator>
</div>
</div>
<div style="width: 100%">
<div style="width: 50%; float: left; text-align: right">
确认密码:</div>
<div style="width: 50%; float: left">
<asp:TextBox ID="txtpwd" runat="server" CssClass="inputCss" TextMode="Password"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ErrorMessage="密码不能为空!"
ForeColor="Red" ControlToValidate="txtpwd"></asp:RequiredFieldValidator>
<asp:CompareValidator ID="CompareValidator1" runat="server" ControlToCompare="txtPassWord"
ControlToValidate="txtpwd" ErrorMessage="二次密码不一致" ForeColor="Red"></asp:CompareValidator>
</div>
</div>
<div style="width: 100%">
<div style="width: 50%; float: left; text-align: right">
性别:</div>
<div style="width: 50%; float: left">
<asp:RadioButtonList ID="rblGender" runat="server" RepeatDirection="Horizontal">
<asp:ListItem Selected="True" Value="1">男</asp:ListItem>
<asp:ListItem Value="0">女</asp:ListItem>
</asp:RadioButtonList>
</div>
</div>
<div style="width: 100%">
<div style="width: 50%; float: left; text-align: right">
密码问题:</div>
<div style="width: 50%; float: left">
<asp:DropDownList ID="ddlQuestion" runat="server" Width="146px" CssClass="buttonCss">
<asp:ListItem>您最要好的小学同学?</asp:ListItem>
<asp:ListItem>您爱人的姓名?</asp:ListItem>
<asp:ListItem>您爸妈的生日?</asp:ListItem>
<asp:ListItem>您的小学名称?</asp:ListItem>
<asp:ListItem>您最要好的教师姓名?</asp:ListItem>
<asp:ListItem>您最好的网友的姓名?</asp:ListItem>
<asp:ListItem>您最爱看的电影是什么?</asp:ListItem>
<asp:ListItem>您最爱的球迷是谁?</asp:ListItem>
<asp:ListItem>您的初恋情人是谁?</asp:ListItem>
<asp:ListItem>您的仇人是谁?</asp:ListItem>
<asp:ListItem>您最纳闷儿的事儿是什么?</asp:ListItem>
</asp:DropDownList>
</div>
</div>
<div style="width: 100%">
<div style="width: 50%; float: left; text-align: right">
密码答案:</div>
<div style="width: 50%; float: left">
<asp:TextBox ID="txtAnwser" runat="server" CssClass="inputCss"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ErrorMessage="密码答案不能为空"
ForeColor="Red" ControlToValidate="txtAnwser"></asp:RequiredFieldValidator>
</div>
</div>
<div style="width: 100%">
<div style="width: 50%; float: left; text-align: right">
Email:</div>
<div style="width: 50%; float: left">
<asp:TextBox ID="txtEmail" runat="server" CssClass="inputCss"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator6" runat="server" ControlToValidate="txtEmail"
ErrorMessage="Email不能为空!" ForeColor="Red"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ErrorMessage="Email格式不正确!"
ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ForeColor="Red"
ControlToValidate="txtEmail"></asp:RegularExpressionValidator>
</div>
</div>
<div style="width: 100%">
<div style="width: 50%; float: left; text-align: right">
电话号码:</div>
<div style="width: 50%; float: left">
<asp:TextBox ID="txtTelNo" runat="server" CssClass="inputCss"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator8" runat="server" ControlToValidate="txtTelNo"
ErrorMessage="电话号码不能为空!" ForeColor="Red"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server" ErrorMessage="电话号码格式不正确!"
ControlToValidate="txtTelNo" ForeColor="Red" ValidationExpression="((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)"></asp:RegularExpressionValidator>
</div>
</div>
<div style="width: 100%">
<div style="width: 50%; float: left; text-align: right">
地址:</div>
<div style="width: 50%; float: left">
<asp:TextBox ID="txtAddress" runat="server" CssClass="inputCss"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server" ErrorMessage="地址不能为空!"
ControlToValidate="txtAddress" ForeColor="Red"></asp:RequiredFieldValidator>
</div>
</div>
<div style="width: 100%">
<div style="width: 50%; float: left; text-align: right">
身份证号:</div>
<div style="width: 50%; float: left">
<asp:TextBox ID="txtIdCard" runat="server" CssClass="inputCss"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator7" runat="server" ControlToValidate="txtIdCard"
ErrorMessage="身份证号不能为空!" ForeColor="Red"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegularExpressionValidator3" runat="server" ErrorMessage="身份证号格式不正确!"
ControlToValidate="txtIdCard" ForeColor="Red" ValidationExpression="[\d]{6}(19|20)*[\d]{2}((0[1-9])|(11|12))([012][\d]|(30|31))[\d]{3}[xX\d]*"></asp:RegularExpressionValidator>
</div>
</div>
<div style="width: 100%">
<div style="width: 45%; float: left; text-align: right">
<asp:ImageButton ID="ibtnRes" runat="server" ImageUrl="~/Images/tjxx-01a.gif" CssClass="ImageButtom"
OnClick="ibtnRes_Click" Height="20px" />
</div>
<div style="width: 50%; float: right">
<asp:ImageButton ID="ibtnAdd" runat="server" ImageUrl="~/Images/tjbc-01.jpg" OnClick="ibtnAdd_Click"
CssClass="ImageButtom" Height="20px" />
</div>
</div>
</div>
</form>
</body>
</html>
haojuntu 2010-12-22
  • 打赏
  • 举报
回复
遇到这样的问题,一般就是将一下空值,转换成其它类型引起的,最好调试一下,问题就容易解决。
遥望那些年 2010-12-22
  • 打赏
  • 举报
回复
看看DBHelper.GetScalar()返回的值是多少,可能返回了DBNULL,而你又想把他转化为int,多以报错了
小鹏 2010-12-22
  • 打赏
  • 举报
回复
设置默认值,或者判断为空的情况。
gudujianxiao 2010-12-22
  • 打赏
  • 举报
回复
参数要定义类型 new SqlParameter("@UserId",user.UserId),
new SqlParameter("@UserId",SqlDbType.Int,user.UserId)
孟子E章 2010-12-22
  • 打赏
  • 举报
回复
你调试出哪行出错才好解决
cjh200102 2010-12-22
  • 打赏
  • 举报
回复
应该是某个字段值为空引起的。
xuan.ye 2010-12-22
  • 打赏
  • 举报
回复
[UserId] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[UserName] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[PassWord] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[RoleId] [int] NOT NULL,
[Gender] [int] NOT NULL,
[PassQuestion] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[PassAnswer] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Email] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[TelNo] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Address] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[IDCardNo] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Money] [float] NOT NULL,
[UserState] [int] NOT NULL,
[Mark] [int] NOT NULL,


这个字符集都不一样,保不准将来就要出错。

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧