我写了个数据库通用的类,类中包含查询,插入,删除数据库的各种操作;其中有这样一个函数,功能是给定SQL语句,查询返回dataset.
public static DataSet RetriveDataSet(string strsql) 

            if (strsql == null  ¦ ¦ strsql == string.Empty) 
            { 
                return null; 
            } 
             
            if (OraConn == null) 
                return null;             using (OracleDataAdapter da = new OracleDataAdapter(strsql, OraConn)) 
            { 
                DataSet ds = new DataSet(); 
                try 
                { 
                    da.Fill(ds); 
                     
                } 
                catch (OracleException e) 
                { 
                     
                } 
                return ds; 
            } 
}我想实现的功能是:
   某个数据库表的记录录入功能,在winform上添加一些控件,成为freeform的样式,如:textbox,combox等,然后将这些控件和数据库表中的具体字段绑定.我是这样做的:     
     1,通过菜单中的填加数据源功能,可视化生成dataset1(此数据源中包含某张数据库表),然后在窗口上放一些TEXTBOX等控件,并可视化的方式将dataset1表中的某些字段和控件绑定;
   2,调用数据库通用类中函数RetriveDataSet(string strsql),返回一个dataset
   3,将返回的dataset赋值给dataset1,即dataset1=dataset
我的问题是:
   在dataset1=dataset时,总是报无法将类型system.data.dataset隐式转换成dataset1;即使dataset1=(dataset1)dataset也不行. 请问,各位老大,我该怎样实现.或者有什么好的建议.我这种实现的思路有问题吗?谢谢!备注:
  我只所以这样做有两个原因: 
   1,可视化绑定控件比较直观,方便,省得写代码去绑定 
   2,定义了数据库操作类,其中包含各种数据库操作,这样比较统一. 
可惜总是通不过,请各位大侠指点!!

解决方案 »

  1.   

               using (OracleDataAdapter da = new OracleDataAdapter(strsql, OraConn))  
                {  
                    DataSet ds = new DataSet();  
                    try  
                    {  
                        da.Fill(ds);  
                          
                    }  
                    catch (OracleException e)  
                    {  
                          
                    }  
                    return ds;  
                }
    没有实例化
      

  2.   

    感谢回复;
    楼上说我oraconn没实例化;这里我只列出了通用类中的一部分,我在别出实例化过了,这个类本身没有任何问题;所以大家不要从这个类上找毛病;
    另外dataset1.datasource=dataset;这个dataset1中根本就没有datasource属性这一项;
    各位高手帮帮忙!谢谢!
      

  3.   

    报错出现在:dataset1=dataset 
    请问你的dataset1 是什么??是控件还是DataSet?
      

  4.   

    dataset1=dataset.copy();  //试试吧
      

  5.   

    public DataSet GetUserInfo(string username, string password)
        {
            conn.Open();        DataSet ds = new DataSet();        try
            {            SqlCommand cmd = new SqlCommand("GetUserLoginInfo", conn);            cmd.CommandType = CommandType.StoredProcedure;            cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = username;            cmd.Parameters.Add("@password", SqlDbType.VarChar).Value = password;            SqlDataAdapter dap = new SqlDataAdapter(cmd);            dap.Fill(ds, "GetUserLoginInfo");            conn.Close();
            }
            catch
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }        return ds;
        }Oracle 不熟悉 给个sql 的给你参考一下
      

  6.   

    上面的是 SQL Server 2000
      

  7.   

    你的dataset1肯定是自己包的一种类型吧,与DataSet没有继承关系吧
      

  8.   

    楼上的,我已经说过了,数据库操作类本身没问题,关键是在dataset1=dataset时,报错:"无法将类型system.data.dataset隐式转换成dataset1"
    dataset1是我通过数据工具填加的一个数据源
      

  9.   

    dataset1继承自DataSet类,可以dataset1->dataset, 不可以dataset->dataset1
      

  10.   

    虽然是2005自动生成的代码,但你可以看到的,一看就知道了。dataset1:DataSet 但里面属性和方法多出来很多
      

  11.   

    楼上的,我已经说过了,数据库操作类本身没问题,关键是在dataset1=dataset时,报错:"无法将类型system.data.dataset隐式转换成dataset1" 
    dataset1是我通过数据工具填加的一个数据源1.并没说你数据库操作类本身 有问题2.:"无法将类型system.data.dataset隐式转换成dataset1"  这种提示明显是说在类型转换过程中出现问题,就是你的dataset1和dataset之间不存在可以转换的类型关系3.dataset1是我通过数据工具填加的一个数据源  既然是这样,那你的dataset1到底是什么类型的?
    这么固执的人,根本没点接受建议的心态,别人说点什么都听不进去,问问题有用么?大家帮你有用么?
      

  12.   

    try dataset1.Tables[0] = dataset.Tables[0];
      

  13.   

    or try
    dataset1.Tables[0].Rows.Clear();
    foreach (DataRow row in dataset.Tables[0].Rows)
    dataset1.Tables[0].Rows.Add(row);
      

  14.   

    估计你搞的就是个BindingSource或者ObjectSource之类的东西dataset1.DataSource = ds.Tables[0];
      

  15.   

    qltouming(缘木渔人) ,这位兄弟,我其实不是说你的,我是说给我贴了SQL 2000代码那哥们,我讨厌所答非所问的,只不过你在我之前又发了一贴,所以你成了楼上的了,呵呵,对不住啊!
    通过各位的回复,我知道了dataset不能转成dataset1;那么大家遇到我这种情况是如何处理的,或者编程的思路是怎样的?是我这种思路有问题吗?望真正的高手给予指点!!!多谢
      

  16.   

    dataset1.DataSource = ds.Tables[0];dataset1里没有DataSource这个属性
      

  17.   

    楼主,是不是要说明一下你的dataset1 是哪个类的实例看了半天我都没看出来你的1,通过菜单中的填加数据源功能,可视化生成dataset1(此数据源中包含某张数据库表),然后在窗口上放一些TEXTBOX等控件,并可视化的方式将dataset1表中的某些字段和控件绑定; dataset1到底是个什么东西
      

  18.   

    如果你的dataset1 是继承于DataSet的一个子类的实例那只能说很抱歉苹果继承于水果苹果是水果(通过)水果是苹果(逻辑错误)是不能把父类型强制转化为子类型的,这个是逻辑错误
      

  19.   

    dataset1是一个数据集,继承与dataset;它是这样填加的:
    选择菜单"数据"-->"填加新数据源",然后在弹出的窗口中选择数据库,然后下一步,再选择数据库中的具体表.最后完成.
    这样,这个dataset1中就包含了某个具体的table了.在这个过程中,都是通过可视化方式生成的,自己没有写任何代码.
      

  20.   

    误会~算了你把你的dataset1的完整类型名,或者创建dataset1的相关代码搞出来,贴上来,这半天其实就这才是问题的关键
      

  21.   

    按照你的说法我的DataSet没有这个东西不过DataGridView倒是和你说的比较相似
      

  22.   

    现在我知道了,不能将dataset强制转成dataset1了.也就是我的程序这样是不能实现的,那么大家在做这样的功能是如何实现的,麻烦告诉个思路,多谢!
    其实我就是想做个freeform的格式数据界面,也就是自己在界面上加一些例如:TEXTBOX,COMBOX,等控件,然后将他们和数据源进行绑定.每次只显示一条记录,通过按钮"下一条"实现查看其它数据.实际的数据操作,我想都通过我自己写的数据库操作类中的函数进行.通过调用函数返回一个dataset,然后将此dataset和控件联系起来
    不知道大家是怎么实现的?
      

  23.   

    这是dataset1.xsd中的一部分,太多了,贴不下,截选了最前面的一段.namespace imgapp {
        using System;
        
        
        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
        [Serializable()]
        [System.ComponentModel.DesignerCategoryAttribute("code")]
        [System.ComponentModel.ToolboxItem(true)]
        [System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema")]
        [System.Xml.Serialization.XmlRootAttribute("DataSet2")]
        [System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")]
        public partial class DataSet1 : System.Data.DataSet {
            
            private COMM_METADATADataTable tableCOMM_METADATA;
            
            private System.Data.SchemaSerializationMode _schemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
            
            [System.Diagnostics.DebuggerNonUserCodeAttribute()]
            public DataSet1() {
                this.BeginInit();
                this.InitClass();
                System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
                base.Tables.CollectionChanged += schemaChangedHandler;
                base.Relations.CollectionChanged += schemaChangedHandler;
                this.EndInit();
            }
      

  24.   

    没有必要这样做,两个DataSet,搞重复了,
    如果你可视化添加的dataset1已经具体指定到表,那你RetriveDataSet就不会起什么作用了,也完全没有必要了
    这两个留下一个就可以建议留下RetriveDataSet方法页面上,你只建一个BindingSource或者ObjectDataSource就好了,
    //BindingSource for WinFormBindingSource bindingSource1 = new BindingSource();
    DataSet ds = RetriveDataSet(strSql);bindingSource1.DataSource = ds.Tables[0];
    dataGridView1.AutoGenerateColumns = true;
    dataGridView1.DataSource = bindingSource1;
    //ObjectDataSource for WebForm
    ObjectDataSource source = new ObjectDataSource();
    source.TypeName = typeof(这里是RetriveDataSet所属类的完整类型名).ToString();
    source.SelectMethod = "RetriveDataSet";
    source.SelectParameters[0].DefaultValue = "selec * from table";
    source.Select();
    this.GridView1.DataSource = source;
      

  25.   

    如果你是TEXTBOX,COMBOX,等控件,如果是WinForm可以用DataBindingMSDN示例:
    protected void BindControls()
            {            textBox1.DataBindings.Add(new Binding
                ("Text", ds, "customers.custName"));
                textBox2.DataBindings.Add(new Binding
                ("Text", ds, "customers.custID"));            DateTimePicker1.DataBindings.Add(new
                Binding("Value", ds, "customers.CustToOrders.OrderDate"));            Binding b = new Binding
                ("Text", ds, "customers.custToOrders.OrderAmount");
                b.Parse += new ConvertEventHandler(CurrencyStringToDecimal);
                b.Format += new ConvertEventHandler(DecimalToCurrencyString);
                textBox3.DataBindings.Add(b);
                textBox4.DataBindings.Add("Text", DateTimePicker1, "Value");
                BindingManagerBase bmText = this.BindingContext[
                DateTimePicker1];
                Console.WriteLine(bmText.GetType().ToString());            Console.WriteLine(bmText.Count);            bmCustomers = this.BindingContext[ds, "Customers"];            Console.WriteLine(bmCustomers.GetType().ToString());
                Console.WriteLine(bmCustomers.Count);            bmOrders = this.BindingContext[ds, "customers.CustToOrders"];
            }如果是WebForm的话,就得自己写给每个控件赋值的过程了,应该是在上一条下一条的按钮事件里去处理
      

  26.   

    28楼说的是针对Grid类的控件的做法。
    这个帖回得次数太多了……
      

  27.   

    你的返回值就是dataset了,还赋值给dataset1做什么啊
    可以直接赋值给datagridview.datasource()啊
      

  28.   

     感谢大家的回复;
       qltouming(缘木渔人),非常感谢你的回复,我是不是可以这样理解,我只能对所有TEXTBOX之类的控件
    都得写代码(textBox1.DataBindings.Add(new Binding("Text", ds, "customers.custName")); )去绑定了,
    不能用可视化方式通过属性去设置它的绑定了,是这样吗?
       我觉得这样挺费事的,其实我只所以要填加那个dataset1,最主要的想法就是可以不手写代码,直接通过属性设置就能将字段和控件绑定了。
       是不是VS里只能像您说的那样处理,不能实现像我这样的想法?因为我以前是用POWER BUILDER的,所以对VS
    写数据库的模式不是很清楚,感谢您的指点!
      

  29.   

    试一下这样可以吗Dataset1.Tables.Clear();
    Dataset1.Tables.Add(Dataset.Tables[表名]);
      

  30.   

    楼上的不行!
    一个TABLE只能属于一个DATASET,除非深度复制后才可以。
    另外LZ没有弄清楚正确的绑定思路,对基本的类型转化弄混了。。
    建议用BINDING吧
      

  31.   

    private void frmList_Load(object sender, System.EventArgs e)
    {
          
    Cname = new string[50];
    Fname = new string[50];
    Ftype = new string[50];

        initControl();
    initFind();
     
    } private void initFind()
    {
    cBoxCondA.Items.Clear();
    cBoxCondB.Items.Clear();

    cBoxCondA.Items.AddRange(ComFun.express);
    cBoxCondB.Items.AddRange(ComFun.express);

    cBoxCondA.SelectedIndex = 7;
    cBoxCondB.SelectedIndex = 7;
    } private void initControl()
    {
    connect = new SqlConnection(ComString.ConnectS);
    DisplayDataSet = new DataSetFSYH(); } public void DataLoading()
    {
    this.DaList=new SqlDataAdapter(cmdtxt,connect);
    _SqlCommandBuilder = new SqlCommandBuilder(DaList);
    DaList.Fill(DisplayDataSet, TableName); dvm = new DataViewManager(DisplayDataSet);
    BindingControl();
    } private void BindingControl()
    {
    m_dataGrid.DataSource=DisplayDataSet.Tables[TableName].DefaultView;
    vmlist=this.BindingContext[m_dataGrid.DataSource];
    ComFun.setDBGridTitle(this.m_dataGrid,DisplayDataSet.Tables[TableName]) ;
    myDataGridColStyle =this.m_dataGrid.TableStyles[0].GridColumnStyles ; }
    /// <summary>
    ///  顯示的Table  
    /// </summary>
    private static DataSet _DisplayTable;
    public static DataSet DisplayTable
    {
    set
    {
    _DisplayTable = value;
    }
    get
    {
    return _DisplayTable;
    }
    } /// <summary>
    /// Fill 的表名
    /// </summary> private  static string _tablename;
    public string TableName
    {
    set
    {
    _tablename = value;
    }
    get
    {
    return _tablename;
    }
    } /// <summary>
    ///   執行的Sql Command 
    /// </summary>
    private static string _cmdtxt;
    public  string cmdtxt
    {
    set
    {
    _cmdtxt = value;
    }
    get
    {
    return _cmdtxt;
    }
    } /// <summary>
    /// 設定窗體的DataSource  
    /// </summary>

    public DataSet DataSource
    {
    set
    {
    m_dataGrid.DataSource = value;
    }

    } /// <summary>
    ///  顯示的DataSet  
    /// </summary>
    private static DataSetFSYH _DisplayDataSet; public static DataSetFSYH DisplayDataSet
    {
    set
    {
    _DisplayDataSet = value;
    }
    get
    {
    return _DisplayDataSet;
    }
    } private void btnAdd_Click(object sender, System.EventArgs e)
    {


    }
    private void btnSave_Click(object sender, System.EventArgs e)
    {
       //ComFun.dbDown(vmlist);
       ComFun.saveDB(DaList, DisplayDataSet, DisplayDataSet.Tables[TableName].TableName);
    }
    private void btnChange_Click(object sender, System.EventArgs e)
    { //ComFun.dbDown(vmlist);
    ComFun.saveDB(DaList,DisplayDataSet, DisplayDataSet.Tables[TableName].TableName);

    }
    private void btnDelete_Click(object sender, System.EventArgs e)
    {
    DisplayDataSet.Tables[TableName].DefaultView.Delete(vmlist.Position);
    ComFun.saveDB(DaList, DisplayDataSet, DisplayDataSet.Tables[TableName].TableName);
    } private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    {
    if (e.KeyCode==Keys.Return)
    {
    string FindA, FindB;
    if (cBoxFieldA.SelectedIndex!=-1)
    {
    FindA =
    ComFun.GetSql(Fname[cBoxFieldA.SelectedIndex],
    Ftype[cBoxFieldA.SelectedIndex],
    cBoxCondA.SelectedIndex,
    tBoxCondTxtA.Text);
    }
    else
    {
    FindA = ComString.SqlEqual;
    }
                     if (this.cBoxFieldB.SelectedIndex!=-1)
    {
    FindB =
    ComFun.GetSql(Fname[cBoxFieldB.SelectedIndex],
    Ftype[cBoxFieldB.SelectedIndex],
    cBoxCondB.SelectedIndex,
    tBoxCondTxtB.Text);
    }
    else
    {
    FindB = ComString.SqlEqual;
    }
                    
    string sql = FindA + " and " + FindB; DisplayDataSet.Tables[TableName].DefaultView.RowFilter = sql;
                    

    }
    } protected void fillSearchField()
    {
    //-----------------------設定查詢---------------------------------------  
    for (int i=0;i<myDataGridColStyle.Count;i++)
    {
                    
    Cname[i] = myDataGridColStyle[i].HeaderText;
    Fname[i] = myDataGridColStyle[i].MappingName;
    Ftype[i] = DisplayDataSet.Tables[TableName].Columns[i].DataType.Name;

    }

    //增加字段中文名稱
    cBoxFieldA.Items.Clear();
    cBoxFieldB.Items.Clear();
    ComFun.AddComBoBox(myDataGridColStyle, cBoxFieldA);
    ComFun.AddComBoBox(myDataGridColStyle, cBoxFieldB);
    } }
      

  32.   

    子類:  private void frmListGY_Load(object sender, System.EventArgs e)
    {
    Text = StrFormName.FCarftForm;
    base.cmdtxt = " SELECT [gyId],[gyName],[gyType],[gyMemo] FROM tbBasicGY ";
    base.TableName = "tbBasicGY";
    base.DataLoading();
    setDBGridTitle();
    fillSearchField();
    } private void setDBGridTitle()
    { myDataGridColStyle["gyId"].Width = 40 ;
    myDataGridColStyle["gyId"].HeaderText = "編號" ; myDataGridColStyle["gyName"].Width = 100 ;
    myDataGridColStyle["gyName"].HeaderText = "名稱" ; myDataGridColStyle["gyType"].Width = 100 ;
    myDataGridColStyle["gyType"].HeaderText = "類型" ;
     
    myDataGridColStyle["gyMemo"].Width = 100 ;
    myDataGridColStyle["gyMemo"].HeaderText = "備註" ;

    }
      

  33.   

    qltouming(缘木渔人),谢谢你的回复,请再给指点一下,多谢!
        你上边的回复我都看了,我是不是可以这样理解,按我这种编程思路,我只能对所有TEXTBOX之类的控件
    都得写代码(textBox1.DataBindings.Add(new Binding("Text", ds, "customers.custName")); )去绑定了,
    不能用可视化方式通过属性去设置它的绑定了,是这样吗?
       呵呵,我觉得这样挺麻烦的,其实我只所以要填加那个dataset1,最主要的想法就是可以不手写代码,直接
    通过属性设置就能将字段和控件绑定了,即方便又直观,也不用写代码。但是我又不想通过dataset1去操作
    数据,我想统一都用我自己编写的数据库类中的方法去操作数据。然后将返回的结果赋值给dataset1以在界面
    上显示结果。
       是不是VS里只能像您说的那样处理,不能实现像我这样的想法?因为我以前是用POWER BUILDER的,所以对
    VS写数据库的模式不是很清楚,感谢指点!盼望你的答复。多谢!!
      

  34.   

    有那么多人关心,lz运气还真不错,关于你这个问题,在于你自己是不是了解你的dataset1到底是一个什么数据类型和它的存储格式,只要清楚了这一点,类型转换就很简单,但是我发现你自己并不清楚你得dataset1到底是什么东西,在讨论时也是使用“那个dataset1”这样的语法 
      

  35.   

    看的云里雾里,这个dataset1是个什么东西?DataSet组件?
      

  36.   

    qltouming(缘木渔人),在吗?期待给予指点!多谢
      

  37.   


    1.(textBox1.DataBindings.Add(new Binding("Text", ds, "customers.custName")); )
    事实上这就是将DataSet的表customers的custName字段绑定到了textBox1的属性Text上,很麻烦么?你只要写一次,以后不管你的Dataset有怎样的数据更新,它都会绑定到这个textBox1上的。
    2.不是说,“对所有TEXTBOX之类的控件”,而是对所有具有DataBindings属性的控件,都可以这样做。对控件的属性,可以看是否能.出来,也可以查MSDN
    3.我从前也是做PB的,握手~~:)
      

  38.   

    LZ,你这个问题我也碰到了,也是建数据源所自动产生的一个DataSet转换到System.Data.DataSet时报同样的错,下面是我问到的,你参考一下,我用了不会再报这个错了!不过我用的是表,应该是一样的,LZ看一下,或许有用!
    NumDataSet.hydatasDataTable tab = new NumDataSet.hydatasDataTable(); 
    tab.Merge(ds.Tables[0]);  
    int count=hydatasTableAdapter.Fill(tab); NumDataSet--建数据源所自动产生的一个DataSet
    ds----已存放数据的System.Data.DataSet
    hydatasTableAdapter---建数据源所自动产生的一个TableAdapter