我是个数据库初学者,买了一本电子工业出版社的《Viual Studio2005+SQL Server2005数据库应用系统开发》自学。学到如何更新DataSet数据的方法时,发现书中的源程序在运行后不能达到书中所说的功能:“执行后,可将学号为2002080520的记录的T_S_NAME字段的值更改为设定的“王小军”,并将结果提交到数据源中的T_STUDENT表中”,而只是将数据源中表T_STUDENT的第一行记录的T_S_NAME字段的值更改了,并不涉及学号为多少。以下是书中源代码,请各位高手帮我看看,是否是书中的印刷错误抑或是别的,究竟将如何实现这一功能啊。谢谢!源代码如下:
//引用系统命名空间
using System;
using System.Data;
using System.Data.SqlClient;
//项目生成的命名空间
namespace ConsoleApplication2
{
    //项目中的类
    class Program
    {
        //项目执行入口
        static void Main()
        {
           string connectionString = GetConnectionString();
            //定义数据库连接对象
            SqlConnection connection = new SqlConnection(connectionString);
            //定义SQL字符串
            String MySQL = "Select * From  T_STUDENT;";
            //定义数据适配器对象
            SqlDataAdapter MyAdapter = new SqlDataAdapter(MySQL, connection);
            
            {
                try
                {
                    //打开数据库连接
                    connection.Open();
                    //定义MyAdapter对象的UpdateCommand属性使用的Update语句,这里仅按照指定的T_S_ID(学号)字段来更新表T_STUDENT的相应记录的T_S_NAME字段的值
                    MyAdapter.UpdateCommand = new SqlCommand("UPDATE T_STUDENT SET T_S_NAME = @StudentName " +
                       "WHERE T_S_AGE = @StudentAge", connection);
                    //定义UpdateCommand属性使用的参数名称、类型、长度、使用的表的字段名称,需要和表中的定义吻合起来
                    MyAdapter.UpdateCommand.Parameters.Add("@StudentName", SqlDbType.NVarChar, 6, "T_S_NAME");
                    //定义一个参数对象,并给其赋值
                    SqlParameter parameter = MyAdapter.UpdateCommand.Parameters.Add("@StudentAge", SqlDbType.Int);
                    parameter.SourceColumn = "T_S_AGE";
                    parameter.SourceVersion = DataRowVersion.Original;
                    parameter.SqlValue=29;
                    //定义数据集对象
                    DataSet MyDataSet = new DataSet();
                    //用表T_STUDENT的内容填充数据集对象
                    MyAdapter.Fill(MyDataSet, "T_STUDENT");
                    //定义数据行对象
                    DataRow MyRow = MyDataSet.Tables["T_STUDENT"].Rows[0];
                    //读者可以在这里更改字段的取值,然后可以发现数据库中的数据会被更改
                    MyRow["T_S_NAME"] = "王小军";
                    MyAdapter.Update(MyDataSet, "T_STUDENT");
                    Console.WriteLine("成功更新表中的数据");
                }
                catch (SqlException ex)
                {
                    Console.WriteLine(ex.ToString());
                    Console.ReadLine();
                }
                finally
                {
                    connection.Close();
                    Console.ReadLine();
                    Console.WriteLine("成功关闭到SQL Server 2005数据库的连接");                }
            }
        }
        //返回连接字符串的函数
        static private string GetConnectionString()
        {
            return "Integrated Security=Yes;Initial Catalog=DB_STUDENT;Server=ff89df21189f40f";        }
    }
}

解决方案 »

  1.   

    //定义数据行对象 
    DataRow MyRow = MyDataSet.Tables["T_STUDENT"].Rows[0];   // 是这里指定的修改第 1 行
      

  2.   

    //引用系统命名空间 
    using System; 
    using System.Data; 
    using System.Data.SqlClient; 
    //项目生成的命名空间 
    namespace ConsoleApplication2 

        //项目中的类 
        class Program 
        { 
            //项目执行入口 
            static void Main() 
            { 
              string connectionString = GetConnectionString(); 
                //定义数据库连接对象 
                SqlConnection connection = new SqlConnection(connectionString); 
                //定义SQL字符串 
                String MySQL = "Select * From  T_STUDENT;"; 
                //定义数据适配器对象 
                SqlDataAdapter MyAdapter = new SqlDataAdapter(MySQL, connection); 
                
                { 
                    try 
                    { 
                        //打开数据库连接 
                        connection.Open(); 
                        //定义MyAdapter对象的UpdateCommand属性使用的Update语句,这里仅按照指定的T_S_ID(学号)字段来更新表T_STUDENT的相应记录的T_S_NAME字段的值 
                        MyAdapter.UpdateCommand = new SqlCommand("UPDATE T_STUDENT SET T_S_NAME = @StudentName " + 
                          "WHERE T_S_AGE = @StudentAge", connection); 
                        //定义UpdateCommand属性使用的参数名称、类型、长度、使用的表的字段名称,需要和表中的定义吻合起来 
                        MyAdapter.UpdateCommand.Parameters.Add("@StudentName", SqlDbType.NVarChar, 6, "T_S_NAME"); 
                        //定义一个参数对象,并给其赋值 
                        SqlParameter parameter = MyAdapter.UpdateCommand.Parameters.Add("@StudentAge", SqlDbType.Int); 
                        parameter.SourceColumn = "T_S_AGE"; 
                        parameter.SourceVersion = DataRowVersion.Original; 
                        parameter.SqlValue=29; 
                        //定义数据集对象 
                        DataSet MyDataSet = new DataSet(); 
                        //用表T_STUDENT的内容填充数据集对象 
                        MyAdapter.Fill(MyDataSet, "T_STUDENT"); 
                        //定义数据行对象 
                        DataRow MyRow = MyDataSet.Tables["T_STUDENT"].Rows[0]; 
                        //读者可以在这里更改字段的取值,然后可以发现数据库中的数据会被更改 
                        MyRow["T_S_NAME"] = "王小军"; 

                        MyDataSet.Tables["T_STUDENT"].Rows[0]["T_S_NAME"]="王小军"; 
                        MyAdapter.Update(MyDataSet, "T_STUDENT"); 
                        Console.WriteLine("成功更新表中的数据"); 
                    } 
                    catch (SqlException ex) 
                    { 
                        Console.WriteLine(ex.ToString()); 
                        Console.ReadLine(); 
                    } 
                    finally 
                    { 
                        connection.Close(); 
                        Console.ReadLine(); 
                        Console.WriteLine("成功关闭到SQL Server 2005数据库的连接");                 } 
                } 
            } 
            //返回连接字符串的函数 
            static private string GetConnectionString() 
            { 
                return "Integrated Security=Yes;Initial Catalog=DB_STUDENT;Server=ff89df21189f40f";         } 
        } 
    }
      

  3.   

    那些DATASET DATATABEL DATAGRIG DATALIST等我都搞晕了
      

  4.   

    楼上几位高手都没有解决问题,我想实现的功能是:“执行后,可将学号为2002080520的记录的T_S_NAME字段的值更改为设定的“王小军”,并将结果提交到数据源中的T_STUDENT表中”,而不是每次都只修改数据源第一行的结果,问题等待解决中...