mysql更新数据集后查询其它表查询不出来

persuit666 2018-01-07 12:40:02
如题,查询数据正常好使,我有个更新数据集的地方,调用完,关闭连接,接着再执行一个查询(不一定是刚才更新的表),接着就查询不到数据,然后我把dll重新覆盖或者重启下iis又能查询数据了。
我感觉写的代码没问题啊,打开连接,用完关闭连接,oracle就一直正常,就是mysql,只要调dataadpter的update接着完蛋,真是日了狗了!
是不是mysql更新数据后不能关闭数据库连接啊,这样其它查询没问题,但是这不符合逻辑啊!!
贴出更新的代码
  public bool UpdateDataSet(DataSet dsOri, List<string> listSql, UpdateMode mode = UpdateMode.Normal)
{
this.ErrInfo = "";
bool result = true;
DataSet dsDes = new DataSet();
try
{
DbConnection cnn = this.CurDBCnn;
OpenCnn();
DbCommand cmd = this.GetDBCmd(cnn);
DbTransaction trans = this.GetDBTrans(cnn);
cmd.Transaction = trans;
cmd.CommandText = string.Join(";", listSql);
DbDataAdapter adpt = this.GetDataAdpt(cmd);
adpt.SelectCommand = cmd;
DbCommandBuilder builder = this.GetDBCmdBuilder(adpt);//注意这个地方必须有,虽然没用到,要不会报错
adpt.MissingSchemaAction = MissingSchemaAction.AddWithKey;//带主键填充
adpt.Fill(dsDes);//填充数据

int i = 0;
try
{
foreach (DataTable dtOri in dsOri.Tables)
{
DataTable dtDes = dsDes.Tables[i];
if (dtDes.PrimaryKey.Length == 0)//无主键
{
this.ErrInfo = "SQL中必须带有主键列";
return false;
}

List<string> keyList = new List<string>();
foreach (DataColumn column in dtDes.PrimaryKey)
keyList.Add(column.ColumnName);

switch (mode)
{
case UpdateMode.Normal:
foreach (DataRow drOri in dtOri.Rows)
{
//获取主键
string strKeyCtrs = GetKeyCstrs(drOri, keyList);
if (drOri.RowState == DataRowState.Added)//插入
{
DataRow[] arrRowAdd = dtDes.Select(strKeyCtrs);
if (arrRowAdd.Length == 0)//找不到记录
{
DataRow drNew = dtDes.NewRow();
foreach (DataColumn column in dtDes.Columns)
{
string colName = column.ColumnName;
if (dtOri.Columns.Contains(colName))
drNew[colName] = drOri[colName];
}
dtDes.Rows.Add(drNew);
}
}
if (drOri.RowState == DataRowState.Modified)//更新
{
DataRow[] arrRowUpdate = dtDes.Select(strKeyCtrs);
if (arrRowUpdate.Length > 0)//能找到记录
{
DataRow _drDes = arrRowUpdate[0];

foreach (DataColumn column in dtDes.Columns)
{
string colName = column.ColumnName;
if (dtOri.Columns.Contains(colName))
_drDes[colName] = drOri[colName];
}
}
}
if (drOri.RowState == DataRowState.Deleted)//删除
{
DataRow[] arrRowDelete = dtDes.Select(strKeyCtrs);
if (arrRowDelete.Length > 0)//能找到记录
{
arrRowDelete[0].Delete();
}
}
}
break;

case UpdateMode.Incre://增量
foreach (DataRow drOri in dtOri.Rows)
{
//获取主键
string strKeyCtrs = GetKeyCstrs(drOri, keyList);
DataRow[] arrRow = dtDes.Select(strKeyCtrs);
if (arrRow.Length == 0)//找不到记录---增加
{
DataRow drNew = dtDes.NewRow();
foreach (DataColumn column in dtDes.Columns)
{
string colName = column.ColumnName;
if (dtOri.Columns.Contains(colName))
drNew[colName] = drOri[colName];
}
dtDes.Rows.Add(drNew);
}
else//更新
{
DataRow _drDes = arrRow[0];
foreach (DataColumn column in dtDes.Columns)
{
string colName = column.ColumnName;
if (dtOri.Columns.Contains(colName))
_drDes[colName] = drOri[colName];
}
}
}
break;
case UpdateMode.FIncre://全增量
foreach (DataRow drOri in dtOri.Rows)
{
DataRow drNew = dtDes.NewRow();
foreach (DataColumn column in dtDes.Columns)
{
string colName = column.ColumnName;
if (dtOri.Columns.Contains(colName))
drNew[colName] = drOri[colName];
}
dtDes.Rows.Add(drNew);
}
break;
}

i++;

}

adpt.Update(dsDes);//这个地方更新数据集后,关闭数据库连接 接着其它查询 就完蛋了
if (!this._UseTransaction)
trans.Commit();
}
catch (Exception ex)
{
if (!this._UseTransaction)
trans.Rollback();

result = false;
this.ErrInfo = ex.Message;
}
adpt.Dispose();
trans.Dispose();
builder.Dispose();
cmd.Dispose();

CloseCnn();
}
catch (Exception ex)
{
result = false;
this.ErrInfo = ex.Message;
}
return result;
}


我再查询个数据
  string sql = "SELECT T.*,f_getTypeName(T.TYPE) TYPENAME FROM XM_BASIC T WHERE ID='" + xmid + "' AND ifnull(DELFLAG,'0')<>'1'";
DataTable dtBasic = dal.GetDataTable(sql);//getdatatable也是用完连接再关闭的

这时候 datatable行数是空的,也不报异常

求救啊!
...全文
730 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
persuit666 2019-03-06
  • 打赏
  • 举报
回复
1、连接禁用连接池 2、换了个老点的mysql驱动
xd3210 2018-05-15
  • 打赏
  • 举报
回复
命苦呀!遇到了同样的问题,期待大神们把这个问题攻克了,造福于我等码农。帮助顶!
zjcxc 2018-01-09
  • 打赏
  • 举报
回复
大胆怀疑,小心求证 从你的描述看,程序终止才正常,显然关闭连接后和数据库之间还有联系,这种情况常见于使用了连接池,但也有可能是所用的驱动本身的问题
ZHOU西口 2018-01-08
  • 打赏
  • 举报
回复
引用 4 楼 zhoufeng0401 的回复:
[quote=引用 3 楼 zjcxc 的回复:] 查下 show processlist ,r看看你的程序关闭的时候,连接有没有断开,如果没有,尝试 手工 kill, 如果手工 kill 后正常,那说明连接没有正常关闭导致
非正常关闭 一般是什么情况,我是用的cnn对象的close方法 if (cnn.State != ConnectionState.Closed) { cnn.Close(); cnn.Dispose(); } [/quote] 通过show processlist,可以查看所有连接的状态,比如关注一下当前数据库用户的所有操作,session处在什么状态
persuit666 2018-01-08
  • 打赏
  • 举报
回复
引用 3 楼 zjcxc 的回复:
查下 show processlist ,r看看你的程序关闭的时候,连接有没有断开,如果没有,尝试 手工 kill, 如果手工 kill 后正常,那说明连接没有正常关闭导致
非正常关闭 一般是什么情况,我是用的cnn对象的close方法 if (cnn.State != ConnectionState.Closed) { cnn.Close(); cnn.Dispose(); }
zjcxc 2018-01-08
  • 打赏
  • 举报
回复
查下 show processlist ,r看看你的程序关闭的时候,连接有没有断开,如果没有,尝试 手工 kill, 如果手工 kill 后正常,那说明连接没有正常关闭导致
persuit666 2018-01-07
  • 打赏
  • 举报
回复
引用 1 楼 splendid_java 的回复:
这个是否跟你用的工具有关系? 数据库内存泄露?
我用的是mysql workbench 6.3 64位。只要使用数据集更新,就会出现这个问题,关闭了这个连接,然后想再打开这个连接查询,直接查询是空的,我看了下cnn连接对象貌似有个什么什么id这个属性,只要连接关闭过,它如果不变,基本就是查询不了,你只有让这个id变了,才能查到数据,也就是新建立连接,New新连接的时候,如果还是这个id,那一样是差不到数据。。。
ZHOU西口 2018-01-07
  • 打赏
  • 举报
回复
这个是否跟你用的工具有关系? 数据库内存泄露?

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧