在C#中找不到表0错误

时间:2013-08-16 11:40:36

标签: c# asp.net data-binding

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

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控件中获取显示数据。按钮Click事件将值存储在数据库中两次,并给出错误'找不到表0'。

请帮我告诉我代码中的错误。

先谢谢。

6 个答案:

答案 0 :(得分:3)

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

xcode-select --install

答案 1 :(得分:0)

试试这个

    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)
        {
        }
    }

答案 2 :(得分:0)

完全错误。

您需要来自数据库的商店值,需要插入查询

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

但是您已经对select查询使用了insert查询。并且你必须在2次调用查询(dataadapter and executenonquery),所以数据插入两次。

首先阅读这篇文章Msdn

答案 3 :(得分:0)

您正在使用插入查询,因此您将获得null DataTable 在insert语句后写另一个select语句。

    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]

答案 4 :(得分:0)

问题在于:SqlDataAdapter da = new SqlDataAdapter(cmd);

你创建了一个适配器很好。但上面有两个问题:

1。)上述方法实际上用于指定SelectCommand的{​​{1}}。     Check MSDN here.

2。)您尚未指定要用于此适配器的SqlDataAdapter。 所以这样做:

SqlConnection

其中SqlDataAdapter da = new SqlDataAdapter(cmd, conn); 是您的conn对象。

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

一旦您执行了查询:行SqlConnection现在更改您的 cmd.ExecuteNonQuery(); 并指定存储过程执行 cmd查询

OR

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

答案 5 :(得分:0)

             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(); 

此代码可以使用。