读书人

ASP.net

发布时间: 2012-05-31 12:19:24 作者: rapoo

ASP.net 求助
protected void createOrder(string orderid, string uname)
{
string cnnstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection connection = new SqlConnection(cnnstr);
connection.Open();
string cmdstr = "insert into orders(orderId,uname,date,totalPrice,status) values(@orderId,@uname,@date,@totalPrice,@status)";
SqlCommand sqlcmd = new SqlCommand(cmdstr, connection);
sqlcmd.Parameters.AddWithValue("@uname", uname);
sqlcmd.Parameters.AddWithValue("@orderId", orderid);
sqlcmd.Parameters.AddWithValue("@date", DateTime.Now.ToString());
sqlcmd.Parameters.AddWithValue("@totalPrice", lblTotalPrice.Text);
sqlcmd.Parameters.AddWithValue("@status", "未付款");
SqlTransaction tran = null;
try
{
connection.Open();
//开启一个事务,并返回给tran
tran = connection.BeginTransaction();
sqlcmd.Transaction = tran;//指定sqlcmd对象属于tran事务
sqlcmd.ExecuteNonQuery();//插入记录(生成订单)
//向订单明细表中插入记录
cmdstr = "insert into orderDetails(orderid,pid,number,totalprice) values(@orderid,@pid,@number,@totalprice)";
sqlcmd.CommandText = cmdstr;
Label lblPrice, lblPid;
TextBox txtNumber;
//将购买的商品的信息一一添加到订单明细表中
for (int i = 0; i < ListView1.Items.Count; i++)
{
CheckBox ch = ListView1.Items[i].FindControl("CheckBox1") as CheckBox;
if (ch.Checked)
{
lblPrice = ListView1.Items[i].FindControl("totalPriceLabel") as Label;
lblPid = ListView1.Items[i].FindControl("pidLabel") as Label;
txtNumber = ListView1.Items[i].FindControl("txtNum") as TextBox;
sqlcmd.Parameters.Clear();//清空原来的sql参数,以便重新加入
sqlcmd.Parameters.AddWithValue("@pid", lblPid.Text);
sqlcmd.Parameters.AddWithValue("@orderid", orderid);
sqlcmd.Parameters.AddWithValue("@number", txtNumber.Text);
sqlcmd.Parameters.AddWithValue("@totalprice", lblPrice.Text);
sqlcmd.ExecuteNonQuery();//插入记录(生成订单详细)
sqlcmd.CommandText = "delete from shoppingcart where uname='" + uname + "' and pid=@pid";
sqlcmd.Parameters.Clear();
sqlcmd.Parameters.AddWithValue("@pid", lblPid.Text);
sqlcmd.ExecuteNonQuery();//删除当用顾客的购物车中的信息
}
}
/*sqlcmd.CommandText = "delete from shoppingcart where uname='" + uname +"'";
sqlcmd.ExecuteNonQuery();//删除当用顾客的购物车中的信息*/
tran.Commit();//提交事务
//Page.RegisterStartupScript("kk", "<script>alert('生成成功')</script>");
Response.Redirect("showorder.aspx");//转到查看订单页面
}
catch (Exception ex)//出错时
{
//回滚事务,数据库不作任务修改
tran.Rollback();
Page.RegisterStartupScript("kk", "<script>alert('出错')</script>");
Response.Write(ex.Message);
return;


}
}
这是一个生成订单的函数,orders为订单表,orderDetails为订单明细表,被选中的商品要添加到订单明细表中,并删除该商品在购物车表(shoppingcart)的数据,运行后报错
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

源错误:


行 227: {
行 228: //回滚事务,数据库不作任务修改
行 229: tran.Rollback();
行 230: Page.RegisterStartupScript("kk", "<script>alert('出错')</script>");
行 231: Response.Write(ex.Message);


源文件: e:\zuoye\showcart.aspx.cs 行: 229

堆栈跟踪:


[NullReferenceException: 未将对象引用设置到对象的实例。]
showcart.createOrder(String orderid, String uname) in e:\zuoye\showcart.aspx.cs:229
showcart.btnOrder_Click(Object sender, EventArgs e) in e:\zuoye\showcart.aspx.cs:165
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +105
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +107
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5087

[解决办法]
看看此时 tran的值
[解决办法]
真理:F5 调试
[解决办法]
connection.Open();这个操作做了两次,第二次导致报错了,所以tran是null值

读书人网 >asp.net

热点推荐