数据库连接; ASP.net中的空引用异常错误

时间:2014-03-19 16:31:55

标签: c# asp.net

我知道有很多类似的问题被提出来了。我已经浏览了他们,几天后,我仍然无法理解我的代码出错了。我是初学者,所以如果我看起来有点傻话,请耐心等待。

这是我面临的问题。我正在尝试创建一个简单的asp.net注册页面,它将记录插入数据库(在SQL服务器上)。我的网络表单上有五个文本框,即

  • 用户名
  • 密码
  • 电子邮件
  • SecurityQuestion
  • SecurityAnswer 和提交按钮。

我有一个以这种方式编写的类文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;

public class Student 
{
private static string connStr = "server = localhost; initial catalog = DevelopTest; integrated security = true;";

public static void AddUser(string username, string password, string email, string question, string answer)
{
    string sqlStr = "INSERT INTO Student VALUES(@username, @pass, @email, @question, @answer, 1);"; 
    SqlConnection dbConn = new SqlConnection(connStr);
    SqlCommand sqlComd = new SqlCommand(sqlStr, dbConn);
    sqlComd.Parameters.AddWithValue("@username", username);
    sqlComd.Parameters.AddWithValue("@pass", password);
    sqlComd.Parameters.AddWithValue("@email", email);
    sqlComd.Parameters.AddWithValue("@question", question);
    sqlComd.Parameters.AddWithValue("@answer", answer);

    SqlTransaction tran = null;
    try
    {
        dbConn.Open();
        tran = dbConn.BeginTransaction();
        sqlComd.Transaction = tran; 
        sqlComd.ExecuteNonQuery();
        tran.Commit();
    }
    catch (SqlException e)
    {
        tran.Rollback();                        
    }
    finally
    {
        if (dbConn != null) { dbConn.Close(); }
    }


}

然后我按下这样的按钮点击:

protected void btnRegister_Click(object sender, EventArgs e)
{
Student.AddUser(tbUsernameRegs.Text, tbPassRegs.Text, tbeMailRegs.Text, tbSecretQnsRegs.Text, tbSecretAnswRegs.Text);
}

当我点击一个按钮时,我得到一个空对象引用异常。我理解空对象引用意味着我有一个未初始化的对象,但我已经试图发现错误已经好几天了,但仍然无法弄清楚我哪里出错了。

我希望可以帮助我解决这个问题。非常感谢。

编辑*这里是堆栈跟踪。

[NullReferenceException: Object reference not set to an instance of an object.]
Student.AddUser(String username, String password, String email, String question, String answer) +290
Registration.btnRegister_Click(Object sender, EventArgs e) +94
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9752490
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +196
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724

2 个答案:

答案 0 :(得分:4)

在你正在调用的catch块中

tran.Rollback();

不检查tran是否为空。如果连接尝试失败并且此处没有创建任何事务,则可能是这样:

dbConn.Open();
tran = dbConn.BeginTransaction();

因此,为tran变量添加检查null:

catch (SqlException e)
{
    if (tran != null)
    {
        tran.Rollback();                        
    }
}

答案 1 :(得分:0)

情侣小事。你应该明确你要插入的列,并且永远不要假设它们按正确顺序排列......限定插入...

insert into student ( UserName, Password, EMail, Question, Answer, FlagField )
   values ( @username, @pass, @email, @question, @answer, 1 )

如果表格中包含密码,电子邮件,用户名等列,那么会发生什么情况,那么这些列将无法正确配对。

抱歉ToString()建议,脑痉挛。无论如何,它是基于入站参数字符串抛出错误,尽管期望传递为NULL。您需要验证它们的进入,例如

if( username == null)
   username = "";
if( pass == null )
   pass = "";
etc...

然后,应用你的.Parameters.AddWithValue()调用