当我尝试执行存储过程并获取空数据集时,我收到此错误。
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'。
请帮我告诉我代码中的错误。
先谢谢。
答案 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();
此代码可以使用。