今天写一个添加语句时,出现了奇怪的问题:
string sql = "insert into dept(id,name) values(@id,@name)";
SqlDataAdapter adpt = new SqlDataAdapter(sql,con);
adpt.InsertCommand.Parameters.Add(new SqlParameter("@id",SqlDbType.Char,10));
adpt.InsertCommand.Parameters.Add(new SqlParameter("@name",SqlDbType.VarChar,30));
adpt.InsertCommand.Parameters["@id"].Value = txtId.Text;
adpt.InsertCommand.Parameters["@name"].Value = txtName.Text;
DataSet ds = new DataSet();
con.Open();
try
{
adpt.Fill(ds,"user");
string str = "添加成功";
Response.Write("<script>alert('" + str + "');</script>");
DataGrid1.DataSource = ds.Tables["user"].DefaultView;
/*
请注意这里,测试的时候我写了3种写法,报错一样,出现的奇怪的地方
3种写法如下:DataGrid1.DataSource = ds.Tables["user"].DefaultView;
 DataGrid1.DataSource = ds.Tables["user"];
 DataGrid1.DataSource = ds
出错信息如下:
出错提示:未将对象引用设置到对象的实例。
行 59:string sql = "insert into dept(id,name) values(@id,@name)";行 60:SqlDataAdapter adpt = new SqlDataAdapter(sql,con);
行 61:adpt.InsertCommand.Parameters.Add(new SqlParameter("@id",SqlDbType.Char,10));
行 62:adpt.InsertCommand.Parameters.Add(new SqlParameter("@name",SqlDbType.VarChar,30));
行 63:adpt.InsertCommand.Parameters["@id"].Value = txtId.Text;
记录都没有插入数据库
*/
DataGrid1.DataBind();
}catch(Exception ex)
{
throw ex;
string str = "添加失败";
Response.Write("<script>alert('" + str + "');</script>");
}
finally
{
con.Close();
}后来又把程序修改如下,出现了奇怪的问题
string sql = "insert into dept(id,name) values(@id,@name)";
SqlCommand cmd = new SqlCommand(sql,con);
cmd.Parameters.Add(new SqlParameter("@id",SqlDbType.Char,10));
cmd.Parameters.Add(new SqlParameter("@name",SqlDbType.VarChar,30));
cmd.Parameters["@id"].Value = txtId.Text;
cmd.Parameters["@name"].Value = txtName.Text;
SqlDataAdapter adpt = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
con.Open();
try
{
adpt.Fill(ds,"user");
string str = "添加成功";
Response.Write("<script>alert('" + str + "');</script>");
DataGrid1.DataSource = ds;
/*
请注意这里,测试的时候我用了3种写法,结果提示2种不同的错误,1个正常运行
DataGrid1.DataSource = ds;
出错信息:IListSource 不包含任何数据源。
行 76:  catch(Exception ex)
行 77:  {
行 78:  throw ex;
行 79:  string str = "添加失败";
行 80:  Response.Write("<script>alert('" + str + "');</script>");DataGrid1.DataSource = ds.Tables["user"].DefaultView;
出错信息:未将对象引用设置到对象的实例。
行 76: catch(Exception ex)
行 77: {
行 78:  throw ex;
行 79:  string str = "添加失败";
行 80:  Response.Write("<script>alert('" + str + "');</script>");DataGrid1.DataSource = ds.Tables[“user”];  成功运行
然而,无论提示出错还是成功运行,记录都插入数据库了
*/
DataGrid1.DataBind();
}
catch(Exception ex)
{
throw ex;
string str = "添加失败";
Response.Write("<script>alert('" + str + "');</script>");
}
finally
{
con.Close();
}
我开始以为,这两个程序应该是等效的,但是结果却……,为什么会出现这种奇怪的问题,请大侠们解释,谢谢!

解决方案 »

  1.   

    你设置DataAdapter的SelectCommand了没有,如果没有,你执行Fill就相当于没有做任何动作。这样你的DataSet当然没有Table了。
      

  2.   

    在你的程序中没有设置DataAdapter的SelectCommand的命令呀,所以你的dataset中根本就没有数据呀,当然不能显示了
      

  3.   

    两次的原因好象都是因为DataAdapter的SelectCommand.再注意con的打开和释放。
      

  4.   

    我记得使用SqlDataAdapter 的时候,不用对con操作,SqlDataAdapter 自动操动数据库的联接
      

  5.   

    第一种在FILL时没有selectcommand的对像所以错。
    第二种时你把SQL语句做为selectcommand对像传给SqlDataAdapter 。
    所以FILL有数据,但FILL没有结果也是错的。
      

  6.   

    看了大侠们的解释,有点懂了,再弱弱地问一下这两个语句的区别:
    SqlDataAdapter adpt = new SqlDataAdapter(sql,con);
    adpt.InsertCommand.Parameters.Add(new SqlParameter("@id",SqlDbType.Char,10));
    ------------------------------------------------------------
    SqlCommand cmd = new SqlCommand(sql,con);
    cmd.Parameters.Add(new SqlParameter("@id",SqlDbType.Char,10));
    SqlDataAdapter adpt = new SqlDataAdapter(cmd);
    还有就是为什么第二种写法,就算提示出错了,记录还是插入数据库了