-1

我创建了与 Microsoft sql 数据库的连接,并尝试添加基本信息作为练习的一部分,但出现以下错误。

Object reference not set to an instance of an object

这就是我连接到数据库的方式

SqlConnection sqlConn; 
protected void butConnect_Click(object sender, EventArgs e)
{
    try
    {
        string connectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=lrmg;Integrated Security=True;";
        sqlConn = new SqlConnection(connectionString);
        sqlConn.Open();
        labMessage.Text = "a connection to your database was established";
    }
    catch (SqlException sqlE)
    {
        labMessage.Text = sqlE.Message;
    }
    catch (Exception exe)
    {
        labMessage.Text = exe.Message;
    }

这是我得到错误的地方

 protected void butSubmit_Click(object sender, EventArgs e)
 {
   try
    {
        string name = txtName.Text;
        string date = txtDate.Text;

        **SqlCommand cmd = sqlConn.CreateCommand();**

        cmd.CommandText = "INSERT INTO Canditate(Name, Doj) VALUES('" + name + "'," + date + ")";
        cmd.ExecuteNonQuery();
        labMessage.Text = "The value was inserted into your database";
    }
    catch (SqlException sqlE)
    {
        labMessage.Text = sqlE.Message;
    }
    catch (Exception exe)
    {
        labMessage.Text = exe.Message;
    }
}

我的印象是sql连接已打开,为什么会出现异常?

4

3 回答 3

3

您收到错误是因为参考变量sqlConn为空 - 这可能是因为

  • 从您的代码片段中,连接正在创建并在连接按钮单击中打开。所以你需要在提交之前点击连接
  • 假设这个 ASP.NET 代码最可能的原因可能不同——在这种情况下,每个请求都由不同的页面类实例提供服务——所以如果你在一个请求上打开连接(连接点击),它(那个变量)不会在下一个请求中可用(提交单击)。补救措施很简单——在您需要时创建并打开连接,即在提交点击中。另一方面,您可能需要了解有关 Web 编程模型的模式以避免此类错误。
于 2013-01-07T09:05:04.437 回答
2

您使用两个不同的事件来处理数据库。为什么?你听说过连接池吗?
可能在第一个事件(打开连接)和第二个事件(db insert)之间发生了一些事情并将你的全局变量 SqlConn 更改为 null 并且你得到了错误。(当然我假设您在尝试插入任何内容之前按下该按钮以打开连接)

有了连接池,就不再需要这种编程模式了,相反,当您需要更新/插入/删除/选择某些内容时,您打开连接,完成您的工作并立即关闭连接,而无需保持连接打开并消耗服务器上的资源和客户端。

try
{
    string connectionString = "Data Source=.\\SQLEXPRESS;" + 
                              "Initial Catalog=lrmg;Integrated Security=True;";
    using(SqlConnection sqlConn = new SqlConnection(connstring))
    {
        SqlCommand cmd = sqlConn.CreateCommand();**
        cmd.CommandText = "INSERT INTO Canditate(Name, Doj) VALUES(@name, @dt)";
        cmd.Parameters.AddWithValue("@name", txtName.Text);
        cmd.Parameters.AddWithValue("@dt", Convert.ToDateTime(txtDate.Text));
        cmd.ExecuteNonQuery();
        labMessage.Text = "The value was inserted into your database";
    }
}
catch (SqlException sqlE)
{
    labMessage.Text = sqlE.Message;

}
catch (Exception exe)
{
    labMessage.Text = exe.Message;
}

另请注意,您的代码会受到Sql Injection攻击,因为您使用字符串连接来构建您的 sql 文本。这是一种不好的做法,应该不惜一切代价避免

于 2013-01-07T09:06:50.833 回答
1

您应该有一个专用的方法来打开连接,每次使用连接时都会调用该方法。使用您当前的设置,butConnect_click 必须在同一请求中的 butSumbit_Click 之前调用。所以在butSubmit 中添加对butConnect 的调用。

于 2013-01-07T09:04:08.027 回答