vs2015 .net 4.52
windows server2008 数据库sqlserver2008
目的:对数据库中一条记录进行修改
public int SaveTOTable(bool isAdd)
{
Db dbClass = new Db();
操作员档案表 = dbClass.SelectSql("select * from 操作员档案表 where 1=0");
DataRow dr = 操作员档案表.NewRow();
#region 填充数据
Type t = this.GetType();
PropertyInfo[] pis = t.GetProperties();
foreach (PropertyInfo pi in pis)
{
if (pi.GetValue(this) == null)
{
dr[pi.Name] = DBNull.Value;
}
else
{
dr[pi.Name] = pi.GetValue(this);
}
}
#endregion
操作员档案表.Rows.Add(dr);
if (!isAdd)// 程序执行时带的参数是 isAdd=false
{
操作员档案表.AcceptChanges(); 操作员档案表.Rows[0].SetModified();
//操作员档案表.Rows[0]["姓名"] = "测试2";
}
int i= dbClass.UpdataTable(操作员档案表, "操作员档案表");
return i;//执行中i=1,但是数据库中记录没有变
}
------------------------------------------------------------------
public int UpdataTable(DataTable dt, string tableName)
{
OleDbConnection connect = new OleDbConnection(connectString);
OleDbDataAdapter da = new OleDbDataAdapter("select * from " + tableName + " where '1'='0'", connect);
OleDbCommandBuilder ob = new OleDbCommandBuilder(da);
da.InsertCommand = ob.GetInsertCommand();
da.DeleteCommand = ob.GetDeleteCommand();
da.UpdateCommand = ob.GetUpdateCommand(); connect.Open();
int i = 0;
OleDbTransaction ot = connect.BeginTransaction();
try
{
//da.SelectCommand.Transaction = ot;
da.InsertCommand.Transaction = ot;
da.DeleteCommand.Transaction = ot;
da.UpdateCommand.Transaction = ot;
i = da.Update(dt);
ot.Commit();
connect.Close();
}
catch (Exception ex)
{
ot.Rollback();
connect.Close();
} return i;
}
------------------------------------------------
Db dbClass = new Db();
操作员档案表 = dbClass.SelectSql("select * from 操作员档案表 where 1=0");
这句如果带条件进去查,然后在查出来的记录基础上修改,不执行 if (!isAdd)条件中的语句 ,然后调用UpdataTable然后执行就正常了
------------------------------------------------
我就想知道我错在哪里了???
windows server2008 数据库sqlserver2008
目的:对数据库中一条记录进行修改
public int SaveTOTable(bool isAdd)
{
Db dbClass = new Db();
操作员档案表 = dbClass.SelectSql("select * from 操作员档案表 where 1=0");
DataRow dr = 操作员档案表.NewRow();
#region 填充数据
Type t = this.GetType();
PropertyInfo[] pis = t.GetProperties();
foreach (PropertyInfo pi in pis)
{
if (pi.GetValue(this) == null)
{
dr[pi.Name] = DBNull.Value;
}
else
{
dr[pi.Name] = pi.GetValue(this);
}
}
#endregion
操作员档案表.Rows.Add(dr);
if (!isAdd)// 程序执行时带的参数是 isAdd=false
{
操作员档案表.AcceptChanges(); 操作员档案表.Rows[0].SetModified();
//操作员档案表.Rows[0]["姓名"] = "测试2";
}
int i= dbClass.UpdataTable(操作员档案表, "操作员档案表");
return i;//执行中i=1,但是数据库中记录没有变
}
------------------------------------------------------------------
public int UpdataTable(DataTable dt, string tableName)
{
OleDbConnection connect = new OleDbConnection(connectString);
OleDbDataAdapter da = new OleDbDataAdapter("select * from " + tableName + " where '1'='0'", connect);
OleDbCommandBuilder ob = new OleDbCommandBuilder(da);
da.InsertCommand = ob.GetInsertCommand();
da.DeleteCommand = ob.GetDeleteCommand();
da.UpdateCommand = ob.GetUpdateCommand(); connect.Open();
int i = 0;
OleDbTransaction ot = connect.BeginTransaction();
try
{
//da.SelectCommand.Transaction = ot;
da.InsertCommand.Transaction = ot;
da.DeleteCommand.Transaction = ot;
da.UpdateCommand.Transaction = ot;
i = da.Update(dt);
ot.Commit();
connect.Close();
}
catch (Exception ex)
{
ot.Rollback();
connect.Close();
} return i;
}
------------------------------------------------
Db dbClass = new Db();
操作员档案表 = dbClass.SelectSql("select * from 操作员档案表 where 1=0");
这句如果带条件进去查,然后在查出来的记录基础上修改,不执行 if (!isAdd)条件中的语句 ,然后调用UpdataTable然后执行就正常了
------------------------------------------------
我就想知道我错在哪里了???
去掉这两句话
Db dbClass = new Db();
操作员档案表 = dbClass.SelectSql("select * from 操作员档案表 where 操作员Id='" + 操作员Id + "'");
DataRow dr;
if (操作员档案表.Rows.Count > 0)
{
dr = 操作员档案表.Rows[0];
}
else
{
dr = 操作员档案表.NewRow();
操作员档案表.Rows.Add(dr);
}
// DataRow dr = 操作员档案表.NewRow();
#region 填充数据
Type t = this.GetType();
PropertyInfo[] pis = t.GetProperties();
foreach (PropertyInfo pi in pis)
{
if (pi.GetValue(this) == null)
{
dr[pi.Name] = DBNull.Value;
}
else
{
dr[pi.Name] = pi.GetValue(this);
}
}
#endregion int i = dbClass.UpdataTable(操作员档案表, "操作员档案表");
return i;
本来数据库中有个主键id是001,我现在再增加一个记录主键id还是001,肯定是报主键冲突的
这个主键好像和主键设置没有关系吧
操作员档案表.AcceptChanges();
把行状态设置为unchanged状态
然后再通过
操作员档案表.Rows[0].SetModified();
把行状态设置为Modified状态,这样在updata的时候,程序就知道是updata,而不是insert
问题是应该就在这两行这,还是我基础道理没理解深入,所以想请大神解释解释