none
求助:关于SqlDataAdapter.updateCommand的疑问 RRS feed

  • 问题

  • 代码:

    namespace 使用dataAdapter更新数据
    {
        class Program
        {
            static void Main(string[] args)
            {
                //创建链接
                string str = @"
                       server=.;
                       integrated security=true;
                       database=northwind;";
                SqlConnection conn = new SqlConnection(str);

                //查询命令和更新命令
                string qry = @"
                       select firstname,lastname,country
                       from Table1
                       where country='china'";

                string upd = @"
                       update Table1
                       set firstname=@firstname
                       where country='baxi'";
                try
                {
                    //使用DataAdapter和Dataset
                    SqlDataAdapter da = new SqlDataAdapter(qry, conn);
                    DataSet ds = new DataSet();
                    da.Fill(ds, "employees");
                    DataTable dt = ds.Tables["employees"];

                    //更新数据
                    dt.Rows[0]["firstname"] = "吴";

                    //使用updatecommand命令
                    SqlCommand cmd = new SqlCommand(upd, conn);
                    cmd.Parameters.Add("@firstname", SqlDbType.NVarChar, 10, "firstname");
                    da.UpdateCommand = cmd;
                    da.Update(ds, "employees");
                }

                catch (SqlException e)
                { Console.WriteLine(e); }

                finally
                { conn.Close();
                Console.WriteLine("update database is successed");
                }
               
            }
        }
    }
    原表

    结果表

    问题:我的更新语句   dt.Rows[0]["firstname"] = "吴"; 应该是使monkey1变成'吴'才对的。为什么会是monkey3变成"吴"的呢?country=baxi的那一行根本没有修改过,为什么会更新的?

    此问题困扰小弟多时,请各位大神给与帮助!

    2010年10月18日 9:14

答案

全部回复

  • 建議你的 SELECT 指令使用 ORDER BY 來排一下序,確保第一列的資料是 monkey1,因為看起來第一列是 monkey3。

    (PS: 因為我看不到圖,所以只能推斷第一列是 monkey3,不是預期的 monkey1)


    以下為簽名檔,請勿對號入座:
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    2010年10月18日 12:00
  • 谢谢大神的回答!

    试了用ORDER BY 來排序,但结果还是没变。

    在select命令中我已经用where country='china'来限定查询表格得到的dt只有monkey1和monkey2这两行,真想不明白为什么更新的是monkey3呢?

    敬请各位大神帮帮小弟解决疑惑

    2010年10月19日 1:05
  • 我猜测,monkey3是 country=baxi的第一条记录。把更新语句的where限定去掉,或者与查询语句保持一致,看看是否解决问题

     


    Mog Liang
    2010年10月20日 8:49
  • 谢谢大神们的关注。

    试了把更新句的where限定去掉,结果是monkey1,monkey2,monkey3都变成'吴'了。如果把更新语句的where限定与查询语句保持一致,结果是monkey1,monkey2都变成‘吴’。

    小弟真的有一点想不明白的:

    DataAdapter是根据查询语句来获取数据,然后用来填充dataset的,而datatable来源于dataset。由于查询语句只选择了monkey1,monkey2这两行,所以datatable也应该只有monkey1,monkey2这两行数据而已。更新语句   dt.Rows[0]["firstname"] = "吴 应该只能修改monkey1或monkey2才对的。为什么更新的竟然是monkey3?

    小弟为此困惑不已,恳请大神们继续给与帮助!

    2010年10月21日 0:49
  • 你好,

    你尝试使用CommandBuilders来生成CURD sql。当select集里包含主键的话,CommandBuilders就应该能工作。

    http://msdn.microsoft.com/en-us/library/tf579hcz.aspx

     


    Mog Liang
    2010年10月21日 1:25
  • 非常感谢版主的回答!

    使用CommandBuilders可以把问题解决了。

    如果可以的话,我很想知道为什么用SqlDataAdapter.updateCommand命令会得不到预期的结果,恳请各位大神们帮小弟解解疑惑!

    2010年10月22日 1:12