2013-08-16 72 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 
    } 
}