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

            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”。

请帮助我让我知道我的代码哪里错了。

提前致谢。

4

6 回答 6

3

问题是数据集不包含任何表对象。因此 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
    }
 }
于 2015-07-10T19:44:40.370 回答
0

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

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

1.)上述方法实际上是用来指定SelectCommandSqlDataAdapter在此处查看 MSDN。

2.) 您尚未指定 SqlConnection此适配器的用途。所以这样做:

SqlDataAdapter da = new SqlDataAdapter(cmd, conn);

conn你的SqlConnection对象在哪里。

看到代码的最后 8 行,似乎基本上您想要显示数据。

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

或者

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

于 2013-08-16T12:13:05.483 回答
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)
        {
        }
    }
于 2013-08-16T11:47:02.900 回答
0

完全错误。

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

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

但是您已将 insert query 用于 select query 。并且您必须在 2 次(dataadapter 和 executenonquery)中调用查询,因此数据插入了两次。

先读这篇文章Msdn

于 2013-08-16T11:47:24.820 回答
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(); 

此代码将起作用。

于 2015-04-23T07:47:53.403 回答
0

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

    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]
于 2013-08-16T11:50:39.443 回答