我用dataAdapter查询了数据库中两表连接的数据,Fill到dataset中后
不知道怎样才能更新到数据库中,请高手赐教!!!!!

解决方案 »

  1.   

    yourdataAdapter.Update(yourds);
    yourds.AcceptChanges();
      

  2.   

    yourdataAdapter.Update(yourds);
    yourds.AcceptChanges();这个好像只能修改一个表的查询吧
      

  3.   

    用视图是可以   
    但是我想这样的查询会很多   那样建立视图会很不方便
    以前是用delphi开发的 它可以修改数据  然后直接写到数据库
    不知道在C#里有什么类似的方法  万分感谢
      

  4.   

    yourdataAdapter.Update(yourds);
    yourds.AcceptChanges();
    ================================
    更新整个数据集,数据集里更改过的表都会提交更改
      

  5.   

    //还是给一个例子吧,从SQL Server和Access数据库进行两表连接更新的using System;
    using System.Data;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data.OleDb;
    using System.Data.SqlClient;public class DataRelationsExample : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.DataGrid dgrdCustomers, dgrdOrders;
    DataSet ds;
    SqlConnection sqlCn;
    SqlDataAdapter custAdapter;
    OleDbConnection oleDbCn;
    OleDbDataAdapter orderAdapter; private void MakeData()
    {
    ds = (DataSet)Cache.Get("myDataSet"); if(ds == null)
    {
    ds = new DataSet(); sqlCn.Open();
    custAdapter.Fill(ds, "Customers");
    sqlCn.Close();
    oleDbCn.Open();
    orderAdapter.Fill(ds, "Orders");
    oleDbCn.Close(); ds.Tables["Customers"].PrimaryKey = new DataColumn[]{ds.Tables["Customers"].Columns["CustomerID"]};
    ds.Tables["Orders"].PrimaryKey = new DataColumn[]{ds.Tables["Orders"].Columns["订单ID"]}; DataRelation custOrderRel = ds.Relations.Add("CustomersToOrders",
    ds.Tables["Customers"].Columns["CustomerID"],
    ds.Tables["Orders"].Columns["客户ID"]);
    Cache.Insert("myDataSet", ds);
    }
    }

    private void BindData()
    {
    dgrdCustomers.DataSource = ds.Tables["Customers"];
    dgrdOrders.DataSource = ds.Tables["Orders"];
    Page.DataBind();
    } protected void Page_Load(object sender, EventArgs e)
    {
    //数据库中两张表必须有主键
    sqlCn = new SqlConnection(@"server=.;database=Northwind;uid=sa;pwd=sa;");
    custAdapter = new SqlDataAdapter("SELECT CustomerID, CompanyName, ContactName, ContactTitle FROM CustomersCopy ORDER BY CustomerID", sqlCn);
    oleDbCn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("northwind.mdb"));
    orderAdapter = new OleDbDataAdapter("SELECT 订单ID, 客户ID, 订购日期, 到货日期, 发货日期 FROM 订单Copy ORDER BY 客户ID", oleDbCn);
    if(!Page.IsPostBack)
    {
    Cache.Remove("myDataSet");
    }
    MakeData();
    if(!Page.IsPostBack)
    {
    BindData();
    }
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    InitializeComponent();
    base.OnInit(e);
    }

    private void InitializeComponent()
    {    
    this.dgrdCustomers.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgrdCustomers_DeleteCommand);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void dgrdCustomers_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    DataRow tempRow = ds.Tables["Customers"].Rows.Find(e.Item.Cells[1].Text);
    tempRow.Delete();

    //使用CommandBuilder对象自动产生insert,update,delete语句
    //使用时的两个约束
    //1.必须指定一条select命令(可以在DataAdapter构造函数里指定,也可以使用SelectCommand属性指定)
    //2.必须指定至少一个主键或唯一的列作为Select命令里必需的列
    //由CommandBuilder建立的Update语句含有一个Where条件,仅在Fill方法最后一次被调用后列的所有值
    //都没有被更改过时才更新记录
    SqlCommandBuilder sqlCb = new SqlCommandBuilder(custAdapter);
    OleDbCommandBuilder oleDbCb = new OleDbCommandBuilder(orderAdapter);

    //只查询改变的行(仅仅是改变了的记录在网络上传递)
    DataSet dsChanges = ds.GetChanges();
    if (dsChanges != null)
    {
    oleDbCn.Open();
    orderAdapter.DeleteCommand = oleDbCb.GetDeleteCommand();
    //更新数据库
    orderAdapter.Update(dsChanges, "Orders");
    oleDbCn.Close();
    sqlCn.Open();
    custAdapter.DeleteCommand = sqlCb.GetDeleteCommand();
    custAdapter.Update(dsChanges, "Customers");
    sqlCn.Close();
    }
    ds.AcceptChanges();
    Cache.Insert("myDataSet", ds);
    BindData();
    }
    }
      

  6.   

    我是刚学C#,大概的语句如下
    OracleConnection conn = new OracleConnection("Data Source=TT;User ID=TTTest;Password=11111");
    OracleDataAdapter  adapter = new OracleDataAdapter("select a.*,b.* from student a,class b where a.classid=b.classid",conn);
    OracleCommandBuilder builder = new OracleCommandBuilder(adapter);
    数据可以显示在dataGridView中,就是不可以更新,但是dataAdapter查询单表是可以更新的
    赐教下  TKS!
      

  7.   

    To:amandag(高歌) 举个例子:
    SELECT [id], [stuNo],(SELECT [name] FROM [majors] WHERE [no] = [stu].[majorId]) AS 专业 FROM [stu]
    这样的查询语句查询出来的[专业]列,我修改了,怎么更新数据库?借LZ的帖子问一个,谢谢了~
      

  8.   

    你现在给的信息不足,但我可以肯定地告诉你,即使是跨数据库类型的数据在DataSet中进行两表连接也是可以更新源数据的
      

  9.   

    你给的实例其实还是分开查询了两个表
    我的意思是一次查询里包含两个表
    比如 select a.*,b.* from a,b where a.id=b.id
    这个查询里有包含两个表的字段,我知道查询出来没问题  
    但是就是不知道怎样更新到数据库中
      

  10.   

    wt3056(「马儿.快爬!) :你还是再开一贴吧,你最少要说明是WebForm还是winform,用的是什么控件...
      

  11.   

    winform在DataGridView里修改,其他和LZ一样~
      

  12.   

    你就解说下怎样一个 包含两个表的查询 
    怎样更新   webForm  winform  用什么控件 都无所谓   
    最主要是能完成更新功能就好
      

  13.   

    说错了  是一个类似select a.*,b.* from a,b where a.id=b.id
    的查询怎样更新
      

  14.   

    To phtiger:不好意思,才看清楚你的是两表连接,我需要再考虑一下
      

  15.   

    update yourtablea  set yourtablea.acol=''
    from yourtablea a,yourtableb b where a.id=b.id
    这样就可以了。
      

  16.   

    这样?  
    但是修改数据是放给用户修改的   一般是在DataGridView里修改的
    等用户修改好了再提交  这样的话就不能写Update语句吧
    难道还要自己去对用户修改的数据构造update语句?
      

  17.   

    经过我短暂的思考...如果你的数据是两表查询,而且已经打算用dataset,不妨每个表对应一个datatable,建立datarelation进行关联...否则的话应该没有简单办法...需要自己构造update语句...sorry,我只能想到这么多了
      

  18.   

    除了自己构造update语句  还有没有其更他好的建议  顶顶顶顶顶!!!!!
      

  19.   

    你在DataSet中有一个Table[0]是采用了两表连接而查询出的结果表.你需要跟改0表时同时更新对应的数据库中的两个表的数据.
    其实不管你用什么方法,还会用上update的.
      

  20.   

    女上司对我特别照顾,可我是个结过婚的人,我该怎么办?http://community.csdn.net/Expert/topic/5515/5515498.xml?temp=.4312403
      

  21.   

    建议在更新的时候通过存储过程传入必要的字段,在存储过程中处理更新逻辑。多表的更新参考:
    http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx