【问题标题】:Cannot find table 0 error in C#在 C# 中找不到表 0 错误
【发布时间】:2013-08-16 11:40:36
【问题描述】:

当我尝试执行存储过程并获取空数据集时出现此错误。

private SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["learnaspConnectionString"].ConnectionString);

protected void btnregister_Click(object sender, EventArgs e)
{
        try
        {
            con.Open();
            SqlCommand cmd = new SqlCommand("dbo.RegisterInsert", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter p1 = new SqlParameter("@fname", txtfname.Text);
            SqlParameter p2 = new SqlParameter("@lname", txtlname.Text);
            SqlParameter p3 = new SqlParameter("@company", txtcompany.Text);
            SqlParameter p4 = new SqlParameter("@phone", txtphone.Text);
            SqlParameter p5 = new SqlParameter("@address", txtaddress.Text);
            SqlParameter p6 = new SqlParameter("@email", txtemail.Text);
            cmd.Parameters.Add(p1);
            cmd.Parameters.Add(p2);
            cmd.Parameters.Add(p3);
            cmd.Parameters.Add(p4);
            cmd.Parameters.Add(p5);
            cmd.Parameters.Add(p6);
            cmd.ExecuteNonQuery();

            con.Close();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);
            DataTable dt = ds.Tables[0];
            ListViewDetails.DataSource = ds;
            ListViewDetails.DataBind();
            lblmessage.Visible = true;
            lblmessage.Text = "Registration Completed Successfully!";
        }
        catch (SqlException ex)
        {
        }
}

我的存储过程是:

   CREATE PROCEDURE [dbo].[RegisterInsert] 
    -- Add the parameters for the stored procedure here
    @fname nvarchar(50),
    @lname nvarchar(50),
    @company nvarchar(50),
    @phone nvarchar(50),
    @address nvarchar(250),
    @email  nvarchar(250)   
       SET NOCOUNT ON;
        insert into [dbo].[register]
    ([fname],
     [lname],
     [company],
     [phone],
     [address],
     [email])
     values
     (@fname,
      @lname,
      @company,
      @phone,
      @address,
      @email)    
END

当我运行我的代码时,我无法在 Listview 控件中获取显示数据。按钮单击事件将值存储在数据库中两次并给出错误“找不到表 0”。

请帮我告诉我我的代码哪里错了。

提前致谢。

【问题讨论】:

  • 您希望在ds.Tables 中出现什么?因为你没有执行任何SELECT 语句
  • cmd.ExecuteNonQuery() 在任何情况下都不会返回 DataAdapter
  • 确实,正如@RGraham 所说,您的存储过程不会返回任何表,因此不会填充任何内容。您是否想从存储过程中重新调用Scope_Identity()technet.microsoft.com/en-us/library/ms190315.aspx
  • 我可以得到正确的代码来验证我的代码哪里错了吗?
  • 不要在 RegisterInsert 过程的底部添加 SELECT,除非它是选择单个插入的行退出。如果您想显示整个表格,请将其放在不同的存储过程中,然后从单独的 C# 函数中调用它。

标签: c# asp.net data-binding


【解决方案1】:

问题是数据集不包含任何表对象。因此 DS.Table[0] 不存在,会抛出错误。 在继续之前添加检查以确保数据集具有表。

    // check if ds has a table
    if(DS.TABLES.COUNT>0)
    {
       //check if ds.table[0] has any rows  
       if(DS.TABLES[0].ROWS.COUNT>0){
       //do something
    }
 }

【讨论】:

    【解决方案2】:

    试试这个

        private SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["learnaspConnectionString"].ConnectionString);
    
        protected void btnregister_Click(object sender, EventArgs e)
        {
            try
            {
                con.Open();
                SqlCommand cmd = new SqlCommand("dbo.RegisterInsert", con);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter p1 = new SqlParameter("@fname", txtfname.Text);
                SqlParameter p2 = new SqlParameter("@lname", txtlname.Text);
                SqlParameter p3 = new SqlParameter("@company", txtcompany.Text);
                SqlParameter p4 = new SqlParameter("@phone", txtphone.Text);
                SqlParameter p5 = new SqlParameter("@address", txtaddress.Text);
                SqlParameter p6 = new SqlParameter("@email", txtemail.Text);
                cmd.Parameters.Add(p1);
                cmd.Parameters.Add(p2);
                cmd.Parameters.Add(p3);
                cmd.Parameters.Add(p4);
                cmd.Parameters.Add(p5);
                cmd.Parameters.Add(p6);
                cmd.ExecuteNonQuery();
    
                SqlDataAdapter da = new SqlDataAdapter("Select * from register",con);//Here  you are using same cmd that is for insert so you call insert procedure twice and that's why insert data twice 
                DataSet ds = new DataSet();
                da.Fill(ds);
                DataTable dt = ds.Tables[0];
                ListViewDetails.DataSource = ds;
                ListViewDetails.DataBind();
                lblmessage.Visible = true;
                lblmessage.Text = "Registration Completed Successfully!";
    
    
                con.Close();
    
            }
            catch (SqlException ex)
            {
            }
        }
    

    【讨论】:

    • 很好。但是你能解释一下这条线吗?数据表 dt = ds.Tables[0];为什么要设置索引值??????
    • 当我运行我的代码时,我能知道如何显示该表中已经存在的所有数据行值吗?
    • 如果您希望页面加载时所有数据都出现在表格中,您应该在 page_load 事件中选择它
    • 你应该做的是从 SqlDataAdapter 复制开始的 6 行到 ListViewDetails.DataBind();在 page_Load 事件中
    • 最好创建一个单独的函数,复制其中的那些行并在 page_load 中调用该函数,并在 btnregister_Click 事件中代替这些行。
    【解决方案3】:

    完全错误。

    你想存储数据库中的值,需要插入查询

    你想从数据库中读取值,需要选择查询

    但您已将插入查询用于选择查询。 你必须在 2 次调用查询(dataadapter 和 executenonquery),所以数据插入了两次。

    先看这篇文章Msdn

    【讨论】:

      【解决方案4】:

      您正在使用插入查询,因此您得到空数据表。
      在插入语句之后再写一条选择语句。

          CREATE PROCEDURE [dbo].[RegisterInsert] 
      -- Add the parameters for the stored procedure here
      @fname nvarchar(50),
      @lname nvarchar(50),
      @company nvarchar(50),
      @phone nvarchar(50),
      @address nvarchar(250),
      @email  nvarchar(250)   
         SET NOCOUNT ON;
          insert into [dbo].[register]
      ([fname],
       [lname],
       [company],
       [phone],
       [address],
       [email])
       values
       (@fname,
        @lname,
        @company,
        @phone,
        @address,
        @email)
      
      select * from [dbo].[register]
      

      【讨论】:

        【解决方案5】:

        问题出在这行:SqlDataAdapter da = new SqlDataAdapter(cmd);

        很高兴您创建了一个适配器。但是上面一行有两个问题:

        1.) 上述方法实际上是用来指定SqlDataAdapterSelectCommandCheck MSDN here.

        2.) 您还没有指定 SqlConnection 用于此适配器。 所以这样做:

        SqlDataAdapter da = new SqlDataAdapter(cmd, conn);
        

        其中conn 是您的SqlConnection 对象。

        看到你代码的最后8行,看来你基本上是想显示数据。

        因此,一旦您执行查询:行cmd.ExecuteNonQuery();现在更改您的 cmd 并分配执行以下操作的存储过程Select查询

        您可以将 cmd 中的 Select 查询指定为:Select * from register,但是您还需要将命令类型更改为:cmd.CommandType=CommandType.Text;

        【讨论】:

          【解决方案6】:
                       con.Open();
                  SqlCommand cmd = new SqlCommand("dbo.RegisterInsert", con);
                  cmd.CommandType = CommandType.StoredProcedure;
                  SqlParameter p1 = new SqlParameter("@fname", txtfname.Text);
                  SqlParameter p2 = new SqlParameter("@lname", txtlname.Text);
                  SqlParameter p3 = new SqlParameter("@company", txtcompany.Text);
                  SqlParameter p4 = new SqlParameter("@phone", txtphone.Text);
                  SqlParameter p5 = new SqlParameter("@address", txtaddress.Text);
                  SqlParameter p6 = new SqlParameter("@email", txtemail.Text);
                  cmd.Parameters.Add(p1);
                  cmd.Parameters.Add(p2);
                  cmd.Parameters.Add(p3);
                  cmd.Parameters.Add(p4);
                  cmd.Parameters.Add(p5);
                  cmd.Parameters.Add(p6);
                  SqlDataAdapter da = new SqlDataAdapter(cmd);
                  DataSet ds = new DataSet();
                  da.Fill(ds);
                  DataTable dt = new DataTable();
                  dt = ds.Tables[0];
          
                  ListViewDetails.DataSource = dt;
                  ListViewDetails.DataBind();
                  con.close();
                  lblmessage.Visible = true;
                  lblmessage.Text = "Registration Completed Successfully!";
          

          你没有正确定义数据表。

          DataTable dt = new DataTable();
          

          这样绑定数据源

           ListViewDetails.DataSource = dt;
          

          现在绑定数据后关闭连接。

          con.close(); 
          

          此代码将起作用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-07-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-17
            • 2015-02-08
            • 2021-07-01
            • 1970-01-01
            相关资源
            最近更新 更多