2013-08-16 48 views
0

我得到这个错误,当我尝试执行存储过程并获得空数据集。在C中找不到表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 

我不能够得到的数据显示在列表视图控件,当我在数据库运行我code.Button Click事件卖场值的两倍,并给出error'Cannot找到表0'。

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

在此先感谢。

+3

你希望在'ds.Tables'中做些什么?因为你不执行任何'SELECT'语句 – CodingIntrigue

+0

cmd.ExecuteNonQuery()在任何情况下都不会返回DataAdapter – Cris

+0

事实上,正如@RGraham所说,你的存储过程不会返回任何表,所以什么都不会被填充。你是否想要从存储过程中重新调用'Scope_Identity()'? http://technet.microsoft.com/en-us/library/ms190315.aspx – Jodrell

回答

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

这很好。但你能解释这条线吗? DataTable dt = ds.Tables [0];你为什么设置索引值? –

+0

它工作正常,谢谢。 –

+0

当我运行我的代码时,我可以知道如何显示该表中已存在的所有数据行值。 –

0

完全错误的。

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

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

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

第一次读到这篇文章Msdn

0

您使用插入查询,所以你越来越空的DataTable。
在插入语句后写入另一个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] 
0

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

它好,你创建了一个适配器。但是有两个问题在上面:

1.)上述方法实际上用于指定SelectCommandSqlDataAdapterCheck MSDN here.

2.)您还未指定要使用此适配器的什么SqlConnection。 所以,做这种方式:

SqlDataAdapter da = new SqlDataAdapter(cmd, conn); 

其中conn是你SqlConnection对象。

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

所以一旦你执行查询:线路cmd.ExecuteNonQuery();现在改变你的cmd和分配,要么做的Select查询存储过程

OR

可以特异性选择在cmd中查询为:Select * from register,但您需要将命令类型更改为:cmd.CommandType=CommandType.Text;

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!"; 

您还没有正确定义数据表。以这种方式

ListViewDetails.DataSource = dt; 

数据源的

DataTable dt = new DataTable(); 

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

con.close(); 

此代码将工作。

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