如何把DataGrid中修改的数据存入数据库中,如果表中存在该记录,则更新,如果表中不存在该记录,则插入记录。
数据库中表的结构如下:
字段名 字段类型
===========================
UName Varchar(50)
MName Varchar(50)
Opt1 Bit(1)
Opt2 Bit(1)
Opt3 Bit(1)
在DataGrid中显示
MName Opt1 Opt2 Opt3
==================================
M1 0 1 1
M2 1 0 0
M3 0 0 0
M4 0 0 0现在在数据表中已经有了UName="A" 的两条记录
A M1 0 1 1
A M2 1 0 0
如果在DataGrid中修改了值,如果保存到数据库?
数据库中表的结构如下:
字段名 字段类型
===========================
UName Varchar(50)
MName Varchar(50)
Opt1 Bit(1)
Opt2 Bit(1)
Opt3 Bit(1)
在DataGrid中显示
MName Opt1 Opt2 Opt3
==================================
M1 0 1 1
M2 1 0 0
M3 0 0 0
M4 0 0 0现在在数据表中已经有了UName="A" 的两条记录
A M1 0 1 1
A M2 1 0 0
如果在DataGrid中修改了值,如果保存到数据库?
2、datatable 或 dataset 有无跟数据库建立对应关系?
SqlCommandBuilder CmdBuider = new SqlCommandBuilder(dataAdapter);
_dataAdapter.DeleteCommand = CmdBuider .GetDeleteCommand();
_dataAdapter.InsertCommand = CmdBuider .GetInsertCommand();
_dataAdapter.UpdateCommand = CmdBuider .GetUpdateCommand();
Sql="Select MName,Opt1,Opt2,Opt3 From Table1 Where UName = 'A'"
用该语句查询出所有UName="A的记录,并绑定到DataGrid.
SqlCommandBuilder CmdBuider = new SqlCommandBuilder(dataAdapter);
dataAdapter.DeleteCommand = CmdBuider .GetDeleteCommand();
dataAdapter.InsertCommand = CmdBuider .GetInsertCommand();
dataAdapter.UpdateCommand = CmdBuider .GetUpdateCommand();
能写的具体点吗?最好能根据我问题中的表写。谢谢!
SqlConnection sqlConn;
DataSet ds;
string strConnectInfo="连接字符串";sqlConn= new SqlConnection(strConnectInfo );
public void UpdateDataSource(DataSet ChangedRows)
{
try
{
// 在有挂起的更改时,只需要更新数据源即可。
if ((ChangedRows != null))
{
// 打开连接。
sqlConn.Open();
// 尝试更新数据源。
da.Update(ChangedRows,"TableName");
}
}
catch (System.Exception updateException)
{
// 在此处添加错误处理代码。
throw updateException;
}
finally
{
// 无论是否引发了异常都关闭连接。
sqlConn.Close();
}
}
// 创建一个新数据集来保存对主数据集所做的更改。
DataSet objDataSetChanges = new DataSet ();
// 停止当前的任何编辑。
this.BindingContext[ds,"TableName"].EndCurrentEdit();
// 获取对主数据集所做的更改。
objDataSetChanges = ds.GetChanges();
// 检查是否做了任何更改。
if ((objDataSetChanges != null))
{
try
{
// 需要做一些更改,所以尝试通过调用 update 方法
// 和传递数据集以及任何参数来更新数据源。
this.UpdateDataSource(objDataSetChanges);
ds.Merge(objDataSetChanges);
ds.AcceptChanges();
}
catch (System.Exception eUpdate)
{
// 在此处添加错误处理代码。
MessageBox.Show (eUpdate.Message );
ds.RejectChanges ();
//throw eUpdate;
}
// 添加代码以检查返回的数据集中是否有任何可能已被
// 推入到行对象错误中的错误。
}
ds.Merge(objDataSetChanges);
为什么要这样做?
private void datagrid_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
int ID = (int) datagrid.DataKeys[(int) e.Item.ItemIndex];
string Mname = ((TextBox)e.Item.Cells[1].Controls[0]).Text;
string opt1 = ((TextBox)e.Item.Cells[2].Controls[0]).Text;
string opt2 = ((TextBox)e.Item.Cells[3].Controls[0]).Text;
string opt3 = ((TextBox)e.Item.Cells[4].Controls[0]).Text;
string sql =
"UPDATE 表名 SET Mname =\"" + Mname +
"\", opt1 =\"" + opt1 + "\",opt2 =\"" + opt2 + "\",opt3 =\"" + opt3 + "\" " + " WHERE 表.key=" + ID;
ExecuteNonQuery(sql);
datagrid.EditItemIndex = -1;
ReadRecords(); }
if (修改后的值==数据库中的主键值)
{
执行一个更新操作
}
else
{
执行一个插入操作
}
{ AfficheManagerDTO afficheManagerDTO = new AfficheManagerDTO();
AfficheManagerBPO afficheManagerBPO = new AfficheManagerBPO();// selFont.DataSource = new Table();
// selFont.DataBind();
if(FreeTextBox1.Text.ToString().Trim()=="")
{
OppoPrompt.Alert("公告内容不允许为空!请重新输入!",this.Page);
return;
}
else
{
afficheManagerDTO.INFO_CONTENT=FreeTextBox1.Text.ToString();
}
afficheManagerDTO.INFO_ID = new MaxID().GetNewID("TB_INFO","INFO_ID");
// newsexDTO.INFOC_NAME =drTYPE.SelectedItem.Text.ToString(); if(txtNEWSTITLE.Text.ToString().Trim().Length<=50)
{
afficheManagerDTO.INFO_HEADING=CheckUserData.GetFilterStr(txtNEWSTITLE.Text.ToString().Trim());
}
else
{
OppoPrompt.Alert("标题不能超过了50个字母或汉字,请重新输入",this.Page);
return;
} if(txtNEWSFITTITLE.Text.ToString().Trim().Length<=50)
{
afficheManagerDTO.INFO_SUBHEADING=CheckUserData.GetFilterStr(txtNEWSFITTITLE.Text.ToString().Trim());
}
else
{
OppoPrompt.Alert("标题不能超过了50个字母或汉字,请重新输入",this.Page);
return;
}
// affichemanagerexDTO.INFO_HEADING="<Font color=\"#000000\">txtNEWSTITLE.Text.ToString().Trim()</Font>";
if(drpClor.SelectedItem.Text.ToString()=="黑色")
{
afficheManagerDTO.INFO_HEADING_COLOR="#000000";
}
if(drpClor.SelectedItem.Text.ToString()=="红色")
{
afficheManagerDTO.INFO_HEADING_COLOR="#FF0000";
}
if((drpClor.SelectedItem.Text.ToString()=="暗红色"))
{
afficheManagerDTO.INFO_HEADING_COLOR="#9E0A37";
}
if((drpClor.SelectedItem.Text.ToString()=="绿色"))
{
afficheManagerDTO.INFO_HEADING_COLOR="#00FF00";
}
if((drpClor.SelectedItem.Text.ToString()=="蓝色"))
{
// Color color = Color.FromArgb(0x00, 0xFF, 0x00);
afficheManagerDTO.INFO_HEADING_COLOR="#0000FF";
}
if((drpClor.SelectedItem.Text.ToString()=="黄色"))
{
afficheManagerDTO.INFO_HEADING_COLOR="#FFFF00";
}
afficheManagerDTO.INFO_HEADING_FONT=drpFont.SelectedItem.Text.ToString();
afficheManagerDTO.INFO_SIZE=Convert.ToInt32(drpSize.SelectedItem.Text.ToString()); afficheManagerDTO.INFO_KEYWORD=txtKEY.Text.ToString().Trim();
afficheManagerDTO.INFO_AUTHOR=txtNEWSNAME.Text.ToString().Trim();
afficheManagerDTO.INFO_SOURCE=txtNEWSSOURCE.Text.ToString().Trim(); if(txtINFOVALIDDATE.Text.ToString().Trim()=="")
{
afficheManagerDTO.INFO_VALID_DATE=DateTime.Now;
}
else
{ if(Convert.ToDateTime(txtINFOVALIDDATE.Text.ToString().Trim())<DateTime.Now)
{
OppoPrompt.Alert("发布日期不能小于当前时间,请重新输入!",this.Page);
return;
}
else
{
afficheManagerDTO.INFO_VALID_DATE=Convert.ToDateTime(txtINFOVALIDDATE.Text.ToString().Trim());
}// OppoPrompt.Alert("第"+d.ToString()+"条存在有效合同,不允许删除!",this.Page);
}
if(txtINFOINVALIDDATE.Text.ToString().Trim()=="")
{
afficheManagerDTO.INFO_INVALID_DATE=null;
}
else
{
if(Convert.ToDateTime(txtINFOINVALIDDATE.Text.ToString().Trim())<Convert.ToDateTime(txtINFOVALIDDATE.Text.ToString().Trim()))
{
OppoPrompt.Alert("失效日期不能小于发布日期,请重新输入!",this.Page);
return;
}
else
{
afficheManagerDTO.INFO_INVALID_DATE=Convert.ToDateTime(txtINFOINVALIDDATE.Text.ToString().Trim());
}
}
if (txtINFOHITNUM.Text.ToString().Trim()=="")
{
afficheManagerDTO.INFO_HIT_NUM=0;
}
else
{
afficheManagerDTO.INFO_HIT_NUM=Int32.Parse(txtINFOHITNUM.Text.ToString().Trim());
}
afficheManagerDTO.ADD_PER_ID=base.PER_ID;
afficheManagerDTO.ADD_DATE=DateTime.Now;
afficheManagerDTO.INFOC_ID=Int32.Parse(drTYPE.SelectedValue.ToString());
afficheManagerDTO.INFO_ISSTOP_REASON="";
afficheManagerDTO.INFO_ISSTOP="N"; MaxOrder MaxOrder = new MaxOrder();
int SortOrder=MaxOrder.GetNewOrder("TB_INFO");
afficheManagerDTO.SORT_ORDER=SortOrder; // string aa = "";
// aa +="<font face="+""+" size="+""+
if (CkBPIC.Checked==true)
{
afficheManagerDTO.INFO_SHOW_HOME="Y";
}
else
{
afficheManagerDTO.INFO_SHOW_HOME="N";
} if(chkINFO_ISSTOP.Checked==true)
{
afficheManagerDTO.INFO_ISSTOP = "Y";
txtINFO_ISSTOP_REASON.Visible=true;
afficheManagerDTO.INFO_ISSTOP_REASON=txtINFO_ISSTOP_REASON.Text.ToString();
}
else
{
txtINFO_ISSTOP_REASON.Visible=false;
afficheManagerDTO.INFO_ISSTOP = "N";
afficheManagerDTO.INFO_ISSTOP_REASON="";
} if(checkZD.Checked==true)
{
afficheManagerDTO.INFO_ISTOP="Y";
}
else
{
afficheManagerDTO.INFO_ISTOP="N";
}
afficheManagerBPO.AddAfficeManager(afficheManagerDTO);
base.WriteOperateLog(FunCodeType.ADD,"增加公告");
OppoPrompt.Alert("添加公告成功!",this.Page,"AfficheManager.aspx");
}
如果数据库中有1000条记录,是不是要把更新的记录与这1000条记录依次判断?如果是更多记录呢?
To:Developernet(探索者NET)
如果要发代码,请留联系方式。
或者
SqlDataAdapter1.Update((DataSet)DataGrid1.DataSource));当然,你自己得写InsertCommand,UpdateCommand,DeleteCommand了
sqlInsertCommand.Parameters.Add(new SqlParameter("@uname",SqlDbType.VarChar,50,"UName"))
sqlInsertCommand.Parameters.Add(new SqlParameter("@mname",SqlDbType.VarChar,50,"UName"))
sqlInsertCommand.Parameters.Add(new SqlParameter("@opt1",SqlDbType.Bit,50,"UName"))
sqlInsertCommand.Parameters.Add(new SqlParameter("@opt2",SqlDbType.Bit,50,"UName"))
sqlInsertCommand.Parameters.Add(new SqlParameter("@opt3",SqlDbType.Bit,50,"UName"))sqlUpdateCommand.CommandText = @"UPDATE Table1 SET Opt1 = @opt1,Opt2 = @opt2,Opt3=@opt3 WHERE (UName = @uname) AND (ModuleName = @mname);SELECT Opt1,Opt2,Opt3 FROM Table1 WHERE (UName = @uname AND MName = @mname)"请问我这样写对吗?
Dim ds1 As New Data.DataSet
Dim ds2 As New Data.DataSet
Dim ds3 As New Data.DataSet
Dim ts As Data.SqlClient.SqlTransaction Me.SqlConnection1.ConnectionString = ConnString//连接字符串,自己写一下。 ds1 = Nothing
ds2 = Nothing
ds3 = Nothing ds1 = Me.MyToolbar1.DS.GetChanges(DataRowState.Added)
ds2 = Me.MyToolbar1.DS.GetChanges(DataRowState.Deleted)
ds3 = Me.MyToolbar1.DS.GetChanges(DataRowState.Modified)
Try
Me.SqlConnection1.Open()
ts = Me.SqlConnection1.BeginTransaction(IsolationLevel.Serializable)
Me.SqlInsertCommand1.Transaction = ts
Me.SqlDeleteCommand1.Transaction = ts
Me.SqlUpdateCommand1.Transaction = ts
Me.SqlSelectCommand1.Transaction = ts
If Not (ds1 Is Nothing) Then
'ds1.Tables("AA_User").Rows(0)("UserID") = Me.MyToolbar1.DS.Tables("AA_User").Rows.Count
'ds1.Tables("AA_User").Rows(0)("UserLB") = 1
ds1.Tables("AA_User").Rows(0)("sUserName") = Me.FlatTextBox1.Text.ToString()
ds1.Tables("AA_User").Rows(0)("sPassWord") = Me.FlatTextBox2.Text.ToString()
Me.SqlDataAdapter1.Update(ds1)
End If If Not (ds2 Is Nothing) Then
'ds2.Tables("AA_User").Rows(0)("sUserName") = Me.FlatTextBox1.Text.ToString()
'ds2.Tables("AA_User").Rows(0)("sPassWord") = Me.FlatTextBox2.Text.ToString()
Me.SqlDataAdapter1.Update(ds2)
End If If Not (ds3 Is Nothing) Then
ds3.Tables("AA_User").Rows(0)("sUserName") = Me.FlatTextBox1.Text.ToString()
ds3.Tables("AA_User").Rows(0)("sPassWord") = Me.FlatTextBox2.Text.ToString()
Me.SqlDataAdapter1.Update(ds3)
End If
ts.Commit()
Catch ex As Exception
ts.Rollback()
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
ts.Dispose()
Me.SqlConnection1.Close()
mydb = Nothing
End Try
End Sub
用GetChanges方法得到要删除、更新、添加的行,
在判断是哪一个操作,
最后调用update方法,更新到数据库,注意:SqlDataAdapter的四个sql语句和存储过程要写好。
先自己用里面的数据库连接拖一下好了,省去很多代码的
更新用datagrid就好了
可以修改和显示数据库的东西
不过添加数据要另外写东西的
注意datagrid里面的几个事件(其中比较特殊的是ItemCommand)
就这样,自己试试吧:)