【问题标题】:An exception of type 'System.InvalidOperationException' occurred in System.Data.dll that inserting data into GridviewSystem.Data.dll 中出现“System.InvalidOperationException”类型的异常,将数据插入 Gridview
【发布时间】:2016-05-10 11:27:45
【问题描述】:

我尝试在 myconferences 页面上读取会话变量 Id 并用我的查询填充 Gridview,但我收到来自 cmd.ExecuteNonQuery() 的错误“System.InvalidOperationException”。如何解决?


我的代码

 public partial class MyConferences : System.Web.UI.Page
{
    internal User user;

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            BindGrid();

        }
    }

    private void BindGrid()
    {
        object user = Session["Id"];

        if(user != null)
        {
            user = Session["user"] as User;
        }

        string constr = ConfigurationManager.ConnectionStrings[0].ConnectionString;
        using(SqlConnection con = new SqlConnection(constr))
        {
            string query = "select Conferences.conferenceName , Conferences.conferencePlace , Conferences.conferenceDate , Conferences.category from Conferences inner join Users on Conferences.fk_Users = Users.Id where Users.Id =@Id";

            using(SqlCommand cmd = new SqlCommand(query))
            {

                cmd.Connection = con;
                cmd.Parameters.AddWithValue("@Id", ((object)user) ?? DBNull.Value);
                con.Open();
                GridView1.DataSource = cmd.ExecuteReader();
                GridView1.DataBind();                    
                cmd.ExecuteNonQuery();
                con.Close();
            }
        }
    }
}

也是登录页面上的用户对象。

  User u = new User();
                u.UserId = Convert.ToInt32(dr["Id"]);
                u.Name = dr["name"] != DBNull.Value ? dr["name"].ToString() : string.Empty;
                u.Surname = dr["surname"] != DBNull.Value ? dr["surname"].ToString() : string.Empty;
                u.Email = dr["email"] != DBNull.Value ? dr["email"].ToString() : string.Empty;
                Session["user"] = u;

【问题讨论】:

    标签: c# asp.net gridview ado.net sqlcommand


    【解决方案1】:

    但是我无法在Additional Information 中获得实际的异常详细信息,因为它不是英文的,但我可以直接看到的错误如下

    第一个错误,

    你在打电话 cmd.ExecuteNonQuery()con.Close(); 之后,因此它无法执行命令,因为连接不再打开。

    第二个错误,

    ExecuteNonQuery() 用于插入/更新查询。它将引发错误,因为查询返回的结果集可以使用ExecuteReader 等方法捕获,但不能通过ExecuteNonQuery 方法捕获

    实际上我不明白你为什么首先调用它,因为你已经使用cmd.ExecuteReader(); 加载了数据。

    如何解决

    删除这一行

    cmd.ExecuteNonQuery();
    

    并更正这一行,(这不是干净的方法,但我正在按照您当前的代码编写它)

    cmd.Parameters.AddWithValue("@Id", ((object)user) == null?(object)DBNull.Value:(object)((object)user).UserId);
    

    编辑

    完整代码

    private void BindGrid()
    {
        object id = Session["Id"];
    
        if(id != null)
        {
            user = Session["user"] as User;
        }
    
        string constr = ConfigurationManager.ConnectionStrings[0].ConnectionString;
        using(SqlConnection con = new SqlConnection(constr))
        {
            string query = "select Conferences.conferenceName , Conferences.conferencePlace , Conferences.conferenceDate , Conferences.category from Conferences inner join Users on Conferences.fk_Users = Users.Id where Users.Id =@Id";
    
            using(SqlCommand cmd = new SqlCommand(query))
            {
    
                cmd.Connection = con;
                cmd.Parameters.AddWithValue("@Id", user == null ? (object)DBNull.Value : (object)user.UserId);
                con.Open();
                GridView1.DataSource = cmd.ExecuteReader();
                GridView1.DataBind();                    
                con.Close();
            }
        }
    }
    

    【讨论】:

    • 当我按下点时我无法调用用户变量,所以我知道您是否缺少 using 指令或 assemble 引用?
    • @user5695111 - 因为我不知道您出于什么原因在您的函数中声明类型为 object 的新变量 object 已全局声明为 User 类类型。并且由于它是object 类型,它如何在其中包含UserId。我已经发布了完整的代码。应该适合你。
    • 另外,我不确定您为什么要检查此会话 Session["Id"],然后尝试访问另一个会话 Session["user"]。可以直接查看Session["user"]会话。但我没有改变那部分,并保持你使用的方式,认为你可能有一些逻辑。
    • 我可以在我的网站上使用电子邮件和密码登录,因此我的会话中有电子邮件和密码。但是这个页面我需要在我的会话中读取 UserId,因为会议表没有电子邮件,我无法通过我的会话访问该表,这就是我使用 Id 创建用户对象的原因。这样我就可以读取Id了。
    • 完整代码抛出错误 "cmd.Parameters.AddWithValue("@Id", user == null ? (object)DBNull.Value : (object)user.UserId);" user.UserId 抛出了“system.nullreferenceexception”类型的异常
    【解决方案2】:

    您正在尝试将一个对象传递给 Users.Id 字段(我假设它是一个 int)

    试试

    cmd.Parameters.AddWithValue("@Id", (int)user.UserId);
    

    【讨论】:

    • 他的User 类中没有Id 属性
    • @PawanNogariya 已更新。
    • 但是您首先访问对象的属性,然后检查它是否为空,如果用户为空,则会抛出错误。其次,您将UserId 解析为不可为空的int,因此此条件永远不会运行
    • 我刚刚更新了 OPs 代码以显示他应该作为参数传递的内容,但我会更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多