我的代码如下
private void menuItem2_Click(object sender, System.EventArgs e)
{
DataColumnCollection dcc=ds.Tables[0].Columns;
DataColumn dc=dcc[0];
DataColumn[] mydc={dc};
ds.Tables[0].PrimaryKey=mydc;
string c=dc.ToString();
int s=Convert.ToInt32(dataGrid1[dataGrid1.CurrentRowIndex,0]);
MessageBox.Show(s.ToString());
DataRow myrow= ds.Tables[0].Rows.Find(s);
ds.Tables[0].Rows.Remove(myrow);
dataGrid1.Refresh();
string constr=da.getconnstr();
SqlConnection conn= new SqlConnection(constr);
SqlDataAdapter Da=new SqlDataAdapter (sql,conn);
SqlCommandBuilder cb=new SqlCommandBuilder(Da);
conn.Open();
Da.Update(ds,c);
ds.AcceptChanges(); }
大家伙帮我怎么改 我是要将dataset中的数据通过DataAdapter更新到数据库中
未处理的“System.InvalidOperationException”类型的异常出现在 system.data.dll 中。其他信息: Update 无法找到 TableMapping['identity'] 或 DataTable“identity”。
private void menuItem2_Click(object sender, System.EventArgs e)
{
DataColumnCollection dcc=ds.Tables[0].Columns;
DataColumn dc=dcc[0];
DataColumn[] mydc={dc};
ds.Tables[0].PrimaryKey=mydc;
string c=dc.ToString();
int s=Convert.ToInt32(dataGrid1[dataGrid1.CurrentRowIndex,0]);
MessageBox.Show(s.ToString());
DataRow myrow= ds.Tables[0].Rows.Find(s);
ds.Tables[0].Rows.Remove(myrow);
dataGrid1.Refresh();
string constr=da.getconnstr();
SqlConnection conn= new SqlConnection(constr);
SqlDataAdapter Da=new SqlDataAdapter (sql,conn);
SqlCommandBuilder cb=new SqlCommandBuilder(Da);
conn.Open();
Da.Update(ds,c);
ds.AcceptChanges(); }
大家伙帮我怎么改 我是要将dataset中的数据通过DataAdapter更新到数据库中
未处理的“System.InvalidOperationException”类型的异常出现在 system.data.dll 中。其他信息: Update 无法找到 TableMapping['identity'] 或 DataTable“identity”。
楼上说的怎么绑 datset不是自动获得吗
绑到dataGrid上没有用啊
Da.Update(ds,ds.Tables[0].TableName);
{
DataColumnCollection dcc=ds.Tables[0].Columns;//取得table的列
DataColumn dc=dcc[0];//第一列
DataColumn[] mydc={dc};//转换为可用格式
ds.Tables[0].PrimaryKey=mydc;//主键
string c=dc.ToString();
int s=Convert.ToInt32(dataGrid1[dataGrid1.CurrentRowIndex,0]);//dataGrid的列序号也就是主键的值
//MessageBox.Show(s.ToString());
DataRow myrow= ds.Tables[0].Rows.Find(s);//找到对应的行
ds.Tables[0].Rows.Remove(myrow);//在dataset中删除该行
dataGrid1.Refresh();//更新dataGrid
}
private void menuItem2_Click(object sender, System.EventArgs e)
{
DeletfromDataRow();
string constr=da.getconnstr();//da为全局变量 是另外一个类的实例
SqlConnection conn= new SqlConnection(constr);
conn.Open();
SqlDataAdapter Da=new SqlDataAdapter (sql,conn);
SqlCommandBuilder cb=new SqlCommandBuilder(Da);
Da.SelectCommand = cb.GetInsertCommand();
Da.UpdateCommand = cb.GetUpdateCommand();
Da.DeleteCommand = cb.GetDeleteCommand();
DataSet dsChanges = ds.GetChanges();
if (dsChanges != null)
{
Da.Update(dsChanges );
ds.AcceptChanges();
}
}
可以把dataGrid中也就是dataSet中的更新反映在数据库中
//update Player set plaName='1254'这个你自己找找,好象有可以对饮DataSet所有列的更新,忘记了,我这个是写死了的
SqlDataAdapter sq;
DataSet ds;
SqlConnection sqlcon;
private void buttonTest_Click(object sender, EventArgs e)
{
ds = new DataSet("Freedom");
sqlcon = new SqlConnection("server=127.0.0.1;database=Freedom;uid=sa;pwd=");
sqlcon.Open();
SqlCommand sql = new SqlCommand("select * from Player", sqlcon);
sq = new SqlDataAdapter();
sq.SelectCommand=sql;
sq.Fill(ds, "Player");
dataGrid1.DataSource = ds.Tables["Player"];
} private void button1_Click(object sender, EventArgs e)
{
SqlCommandBuilder sqlcom = new SqlCommandBuilder(sq);
sq.UpdateCommand = new SqlCommand("update Player set plaName='1254'", sqlcon);
sq.Update(ds, ds.Tables[0].TableName);
}
{
SqlDataAdapter sda=new SqlDataAdapter(sql,"server=.;database=***;integrated security=SSPI");
SqlCommandBuilder scb=new SqlCommandBuilder (sda);
sda.update(ds,tablename);
sda.selectcommand.connection.close();
}
写个这样的数据操作方法,专门来修改DATASET中的数据,参数sql需要和原来进行查询数据时的select 语句,一般要包含所有的列
另外,在C#中为该表创建主键是没用的,如果使用SqlCommandBuilder 进行重构,则SqlDataAdapter 进行数据操作的那个表必须在数据库中带上主键
1、表要有主键;
2、selectcommand的语句中需要包含表的主键字段;
3、调用dataAdapter.update()方法前,保证datatable的datarow状态不是unchanged。
SqlConnection conn= new SqlConnection(constr);
conn.Open();
SqlDataAdapter Da=new SqlDataAdapter ();
Da.SelectCommand=new SqlCommand(sql,conn);
SqlCommandBuilder cb=new SqlCommandBuilder(Da);
// Da.SelectCommand = cb.GetInsertCommand();
// Da.UpdateCommand = cb.GetUpdateCommand();
// Da.DeleteCommand = cb.GetDeleteCommand();
DataSet dsChanges = ds.GetChanges();
if (dsChanges != null)
{
Da.Update(dsChanges,tablename);
ds.AcceptChanges();
}
还是不行 这次是系统错误意思是
system.data中的错误,我的主键是SQL自动生成的序号
这样做啊.比如你在LOAD事件里加载数据.
//定义一个全局的
DataSet ds=new DataSet();
private void Load(object sender,EventArgs e)
{
ds=new DataSet();
SqlDataAdapter sda=new SqlDataAdapter("SELECT * FROM MYtable","server=.;database=***;integrated security=SSPI");
sda.Fill(ds,tablename);
sda.selectcommand.connection.close();
}
然后你在操作数据.无论在那里操作数据通过DataGrid直接操作或者通过Button进行增/删/改都不能调用ds.AccpChangs()只对ds中的表进行操作
完了点击菜单在private void menuItem2_Click中调用下面方法
private void menuItem2_Click(object sender, System.EventArgs e)
{
string sql="SELECT * FROM MYTABLE";
ExcuteData(ds,sql,"MYtable");
}
public void ExcuteData(DataSet ds,string sql,string tablename)
{
SqlDataAdapter sda=new SqlDataAdapter(sql,"server=.;database=***;integrated security=SSPI");
SqlCommandBuilder scb=new SqlCommandBuilder (sda);
sda.update(ds,tablename);
sda.selectcommand.connection.close();
}
MYtable这个表一定 要在数据库中建立了主键
方法如下#region //更新数据库
public DataSet UpdateByDataSet(DataSet ds,string strTblName,string strConnection)
{
SqlConnection conn = new SqlConnection(strConnection);
SqlCommand myCommand = new SqlCommand("select * from "+strTblName+"",conn); SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand ); SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);
myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand();
myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand();
myAdapter.DeleteCommand = myCommandBuilder .GetDeleteCommand();
try
{
conn.Open(); myAdapter.Update(ds,strTblName); conn.Close();
}//数据集的行状态在更新后会都变为: UnChange,在这次更新后客户端要用返回的ds }
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
return ds;
} #endregion
我写在数据库操作类中了 大家要用还得改下
分数我看看能不能大家分了