我写了个数据库通用的类,类中包含查询,插入,删除数据库的各种操作;其中有这样一个函数,功能是给定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,定义了数据库操作类,其中包含各种数据库操作,这样比较统一.
可惜总是通不过,请各位大侠指点!!
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,定义了数据库操作类,其中包含各种数据库操作,这样比较统一.
可惜总是通不过,请各位大侠指点!!
解决方案 »
- C# winform 窗体透明TransparencyKey,要求仍然可响应事件如MouseMove:鼠标穿透,背景透明
- textBox,如何实现因在控件中输入内容,而导致控件上更改Text属性的值时引发的事件。
- Runtime的问题
- 当treeView1.LabelEdit = true后
- 英文操作系统下安装的英文vs.net2003,实际的的时候IDE不支持中文字符,如何解决
- 使用Serialport类连续扫描两次条形码,取得的信息是两个条形码连接的字符串
- 请问一个我棘手的问题
- 网站上传到服务器后编译错误
- 请教一个数据传送的问题
- pannel里面添加自定义控件问题
- 请教:用C#.net如何实现数据库中一张表的数据复制到另外一张表?
- loadxml()方法使用问题
{
DataSet ds = new DataSet();
try
{
da.Fill(ds);
}
catch (OracleException e)
{
}
return ds;
}
没有实例化
楼上说我oraconn没实例化;这里我只列出了通用类中的一部分,我在别出实例化过了,这个类本身没有任何问题;所以大家不要从这个类上找毛病;
另外dataset1.datasource=dataset;这个dataset1中根本就没有datasource属性这一项;
各位高手帮帮忙!谢谢!
请问你的dataset1 是什么??是控件还是DataSet?
{
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 的给你参考一下
dataset1是我通过数据工具填加的一个数据源
dataset1是我通过数据工具填加的一个数据源1.并没说你数据库操作类本身 有问题2.:"无法将类型system.data.dataset隐式转换成dataset1" 这种提示明显是说在类型转换过程中出现问题,就是你的dataset1和dataset之间不存在可以转换的类型关系3.dataset1是我通过数据工具填加的一个数据源 既然是这样,那你的dataset1到底是什么类型的?
这么固执的人,根本没点接受建议的心态,别人说点什么都听不进去,问问题有用么?大家帮你有用么?
dataset1.Tables[0].Rows.Clear();
foreach (DataRow row in dataset.Tables[0].Rows)
dataset1.Tables[0].Rows.Add(row);
通过各位的回复,我知道了dataset不能转成dataset1;那么大家遇到我这种情况是如何处理的,或者编程的思路是怎样的?是我这种思路有问题吗?望真正的高手给予指点!!!多谢
选择菜单"数据"-->"填加新数据源",然后在弹出的窗口中选择数据库,然后下一步,再选择数据库中的具体表.最后完成.
这样,这个dataset1中就包含了某个具体的table了.在这个过程中,都是通过可视化方式生成的,自己没有写任何代码.
其实我就是想做个freeform的格式数据界面,也就是自己在界面上加一些例如:TEXTBOX,COMBOX,等控件,然后将他们和数据源进行绑定.每次只显示一条记录,通过按钮"下一条"实现查看其它数据.实际的数据操作,我想都通过我自己写的数据库操作类中的函数进行.通过调用函数返回一个dataset,然后将此dataset和控件联系起来
不知道大家是怎么实现的?
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();
}
如果你可视化添加的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;
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的话,就得自己写给每个控件赋值的过程了,应该是在上一条下一条的按钮事件里去处理
这个帖回得次数太多了……
可以直接赋值给datagridview.datasource()啊
qltouming(缘木渔人),非常感谢你的回复,我是不是可以这样理解,我只能对所有TEXTBOX之类的控件
都得写代码(textBox1.DataBindings.Add(new Binding("Text", ds, "customers.custName")); )去绑定了,
不能用可视化方式通过属性去设置它的绑定了,是这样吗?
我觉得这样挺费事的,其实我只所以要填加那个dataset1,最主要的想法就是可以不手写代码,直接通过属性设置就能将字段和控件绑定了。
是不是VS里只能像您说的那样处理,不能实现像我这样的想法?因为我以前是用POWER BUILDER的,所以对VS
写数据库的模式不是很清楚,感谢您的指点!
Dataset1.Tables.Add(Dataset.Tables[表名]);
一个TABLE只能属于一个DATASET,除非深度复制后才可以。
另外LZ没有弄清楚正确的绑定思路,对基本的类型转化弄混了。。
建议用BINDING吧
{
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);
} }
{
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 = "備註" ;
}
你上边的回复我都看了,我是不是可以这样理解,按我这种编程思路,我只能对所有TEXTBOX之类的控件
都得写代码(textBox1.DataBindings.Add(new Binding("Text", ds, "customers.custName")); )去绑定了,
不能用可视化方式通过属性去设置它的绑定了,是这样吗?
呵呵,我觉得这样挺麻烦的,其实我只所以要填加那个dataset1,最主要的想法就是可以不手写代码,直接
通过属性设置就能将字段和控件绑定了,即方便又直观,也不用写代码。但是我又不想通过dataset1去操作
数据,我想统一都用我自己编写的数据库类中的方法去操作数据。然后将返回的结果赋值给dataset1以在界面
上显示结果。
是不是VS里只能像您说的那样处理,不能实现像我这样的想法?因为我以前是用POWER BUILDER的,所以对
VS写数据库的模式不是很清楚,感谢指点!盼望你的答复。多谢!!
1.(textBox1.DataBindings.Add(new Binding("Text", ds, "customers.custName")); )
事实上这就是将DataSet的表customers的custName字段绑定到了textBox1的属性Text上,很麻烦么?你只要写一次,以后不管你的Dataset有怎样的数据更新,它都会绑定到这个textBox1上的。
2.不是说,“对所有TEXTBOX之类的控件”,而是对所有具有DataBindings属性的控件,都可以这样做。对控件的属性,可以看是否能.出来,也可以查MSDN
3.我从前也是做PB的,握手~~:)
NumDataSet.hydatasDataTable tab = new NumDataSet.hydatasDataTable();
tab.Merge(ds.Tables[0]);
int count=hydatasTableAdapter.Fill(tab); NumDataSet--建数据源所自动产生的一个DataSet
ds----已存放数据的System.Data.DataSet
hydatasTableAdapter---建数据源所自动产生的一个TableAdapter