用C#做一个根据ID查NAME,然后更改NAME的窗体程序,修改不了NAME..为什么呢?一按修改按钮最终传到数据库的还是查到的NAME用C#做一个根据ID查NAME,然后更改NAME的窗体程序,
数据选配器成功生成增删改查语句,二个文本框已数据绑定为数据集中相应字段,先是oleDbDataAdapter,然后是生成dadaset dsau,查询是没有问题;可是修改NAME不成功,调试以后发现到这里oleDbDataAdapter1.Update(dsau);的数据集包含修改了NAME的值,可是到 oleDbDataAdapter1.Fill(dsau);这里dsau就重置变成根据ID查到的NAME,而不是修改后的NAME,窗体上也反映了这一情况,为什么呢?
表 authors
au_id au_lanme
1 aa查询:
private void btnSearch_Click(object sender, System.EventArgs e)
{
oleDbDataAdapter1.SelectCommand.Parameters["au_id"].Value = this.txtau_id.Text;
dsau.Clear();
oleDbDataAdapter1.Fill(dsau); }
private void btnUpdate_Click(object sender, System.EventArgs e)
{
//dsau.Clear(); //这个放在这个函数哪一行都会出错或dsau重置变成根据ID查到的NAME....
this.oleDbDataAdapter1.Update(dsau,"authors");
this.oleDbDataAdapter1.Fill(dsau);
}
另:我调试手写代码也出现相同问题: private void btnSearch_Click(object sender, System.EventArgs e)
{
oleDbDataAdapter1.SelectCommand.Parameters["au_id"].Value = this.txtau_id.Text;
dsau.Clear();
oleDbDataAdapter1.Fill(dsau); } private void btnUpdate_Click(object sender, System.EventArgs e)
{
System.Data.DataTable dt = dsau.Tables["authors"];
for(int i=0;i<dt.Rows.Count;i++)
{
if(dsau.Tables["authors"].Rows[i]["au_id"].ToString()==this.txtau_id.Text) {
dsau.Tables["authors"].Rows[i]["au_lname"] = this.txtau_lname.Text;
}
} this.oleDbDataAdapter1.Update(dsau);
this.oleDbDataAdapter1.Fill(dsau);
}
数据选配器成功生成增删改查语句,二个文本框已数据绑定为数据集中相应字段,先是oleDbDataAdapter,然后是生成dadaset dsau,查询是没有问题;可是修改NAME不成功,调试以后发现到这里oleDbDataAdapter1.Update(dsau);的数据集包含修改了NAME的值,可是到 oleDbDataAdapter1.Fill(dsau);这里dsau就重置变成根据ID查到的NAME,而不是修改后的NAME,窗体上也反映了这一情况,为什么呢?
表 authors
au_id au_lanme
1 aa查询:
private void btnSearch_Click(object sender, System.EventArgs e)
{
oleDbDataAdapter1.SelectCommand.Parameters["au_id"].Value = this.txtau_id.Text;
dsau.Clear();
oleDbDataAdapter1.Fill(dsau); }
private void btnUpdate_Click(object sender, System.EventArgs e)
{
//dsau.Clear(); //这个放在这个函数哪一行都会出错或dsau重置变成根据ID查到的NAME....
this.oleDbDataAdapter1.Update(dsau,"authors");
this.oleDbDataAdapter1.Fill(dsau);
}
另:我调试手写代码也出现相同问题: private void btnSearch_Click(object sender, System.EventArgs e)
{
oleDbDataAdapter1.SelectCommand.Parameters["au_id"].Value = this.txtau_id.Text;
dsau.Clear();
oleDbDataAdapter1.Fill(dsau); } private void btnUpdate_Click(object sender, System.EventArgs e)
{
System.Data.DataTable dt = dsau.Tables["authors"];
for(int i=0;i<dt.Rows.Count;i++)
{
if(dsau.Tables["authors"].Rows[i]["au_id"].ToString()==this.txtau_id.Text) {
dsau.Tables["authors"].Rows[i]["au_lname"] = this.txtau_lname.Text;
}
} this.oleDbDataAdapter1.Update(dsau);
this.oleDbDataAdapter1.Fill(dsau);
}
this.oleDbDataAdapter1.Fill(dsau);
修改了没有重新赋值的问题吧。
//dsau=this.oleDbDataAdapter1.Update(dsau); D:\My Documents\Visual Studio Projects\WindowsApplication1\Form1.cs(269): 无法将类型“int”隐式转换为“WindowsApplication1.dsau”
其实是dsau重新赋值不了,
先是oleDbDataAdapter,然后是生成dadaset dsau,查询是没有问题;可是修改NAME不成功,调试以后发现 到这里oleDbDataAdapter1.Update(dsau);的数据集包含修改了NAME的值,
可是到 oleDbDataAdapter1.Fill(dsau);这里dsau就重置变成根据ID查到的NAME,而不是修改后的NAME,窗体上也反映了这一情况,为什么呢?
String ll=this.txtau_lname.Text;
{ DataRow r = dsau.Tables["authors"].NewRow();
r["au_id"]=ii;
r["au_lname"]=ll;
dsau.Tables["authors"].Rows.Add(r);
this.oleDbDataAdapter1.Update(dsau);
this.oleDbDataAdapter1.Fill(dsau);
}
***********
Insert成功,但一按修改按钮时,在窗体中两个文本框还是重置为查询到的值
我只是用update方法更新数据修配,然后是可以把修改后的新行传到后台的数据库;没有显式用Insert语句
另:贴子修改不了,为什么搞个修改贴子的按钮却不给权限呢?
datagrid才可以绑定datasource,这个textbox没有这个属性,只有databinding 属性text中子属性中绑定dsau - authors.au_lname
{
this.usersTableAdapter.Fill(this.testDataSet.Users);
testDataSet.Tables[0].Rows[usersBindingSource.Position].BeginEdit();
} private void button1_Click(object sender, EventArgs e)
{ testDataSet.Tables[0].Rows[usersBindingSource.Position].EndEdit();
usersTableAdapter.Update(testDataSet);
testDataSet.AcceptChanges();
usersTableAdapter.Fill(this.testDataSet.Users);
}
1.usersBindingSource 这个在代码里具体应该写什么呢? 用户绑定的数据源,可是没有这个属性,是写数据集dsau,还是写数据表表名authors;
2.而且编译管句报错:
D:\My Documents\Visual Studio Projects\WindowsApplication1\Form1.cs(236): 只有 assignment、call、increment、decrement 和 new 对象表达式可用作语句
{
this.oleDbDataAdapter1.Fill(dsau.authors);
dsau.Tables["authors"].DefaultView.Sort="au_id";
int index=dsau.Tables["authors"].DefaultView.Find("au_id"); dsau.Tables[0].Rows[index].BeginEdit(); } 在this.oleDbDataAdapter1.Fill(dsau.authors);这句报错
未处理的“System.Data.OleDb.OleDbException”类型的异常出现在 system.data.dll 中。
Message "在关键字 'DEFAULT' 附近有语法错误。" string
{
oleDbDataAdapter1.SelectCommand.Parameters["au_id"].Value = this.txtau_id.Text; dsau.Clear();
oleDbDataAdapter1.Fill(dsau);
this.txtau_lname.Text=dsau.Tables["authors"].Rows[0]["au_lname"].ToString();
}这个可以解决,不过查询时加上//this.txtau_lname.Text=dsau.Tables["authors"].Rows[0]["au_lname"].ToString();
有点怪怪的,哪能位仁兄还有更好的"????
OleDbCommandBuilder scb = new OleDbCommandBuilder(oleDbDataAdapter1)
加上这句,你就可以用自动更新了,不需要那么麻烦
oleDbDataAdapter1.SelectCommand.Parameters["au_id"].Value = this.txtau_id.Text; dsau.Clear();
oleDbDataAdapter1.Fill(dsau);
不行
那末在文本框开始接收用户输入前,要有这个语句:
testDataSet.Tables[0].Rows[行号].BeginEdit();在保存时,Update之前要有:testDataSet.Tables[0].Rows[行号].EndEdit();其它部分都是常用的代码,上面两行需要特殊注意一下。
private void btnSearch_Click(object sender, System.EventArgs e)
{
string searchStrign="select au_lname from authors where au_id=" +this.txtau_id.Text;
OleDbDataAdapter oleAdapter = new OleDbDataAdapter(searchStrign, "连接语句");
DataTable dt = new DataTable();
oleAdapter.Fill(dt); if (dt.Rows.Count > 0)
this.txtau_lname.Text = dt.Rows[0]["au_lname"].ToString();
} private void btnUpdate_Click(object sender, System.EventArgs e)
{
string updateString = "update authors set au_lname='" + this.txtau_lname.Text + "' where au_id=" + this.txtau_id.Text;
OleDbConnection oleCn = new OleDbConnection("连接语句");
OleDbCommand oleCmd = new OleDbCommand(updateString, oleCn);
oleCn.Open();
oleCmd.ExecuteNonQuery();
oleCn.Close();
}