mysqldatareader什么意思_Mysql的MySqlDataReader对于MysqlConnection是独占式

写Secondlife智能体的知识系统小插件的时候遇到的这个问题。

在把某个NPC的全部知识复制给另一个NPC的时候,对数据库操作,为了提升一点效率希望与数据库建立一次连接,全部添加进表以后再断开连接。

于是这样写的:

MySqlCommand mycmd = newMySqlCommand();

MySqlConnection mycon= new MySqlConnection(MysqlDao.constr);//创建连接

mycmd.Connection = mycon;

MySqlDataReader myreader;

mycon.Open();foreach(Knowledge tk inKnowledgeList)

{

insertSql= "INSERT INTO ...);";

mycmd.CommandText=insertSql;

res=mycmd.ExecuteNonQuery();

mycmd.CommandText= "select ... from ...";

myreader=mycmd.ExecuteReader();

myreader.Read();int kid = int.Parse(myreader.GetString("..."));//...

}

mycon.Close();

用到DataReader的原因:因为mysql的自增序号会将插入修改等操作全部计数在内,所以每次插入以后需要立即反查刚才这个序号,在拿到程序里使用。

结果发现报错:There is already an open DataReader associated with this Connection which must be closed first.

但是如果不用DataReader,只插入删除修改的话是没事的,上CSDN看到大牛回答DataReader这货是独占Connection的。。可以在把它的属性加一个MultipleActiveResultSets=True,看到这里的小白我兴高采烈的跑去改:

MysqlDao.constr = "server=localhost;User Id=root;password=****;Database=...;MutipleActiveResultSets=True";

然后欢快的跑起来,跪了。

于是才知道,SqlServer里才有这个属性,Mysql里没有。。。

所以很遗憾,看来DataReader每次用完了必须关掉。。。

最后代码就不展示了,仅仅把open()和close()都放进循环就好了。。为了功能,抛弃了效率T^T。

啊!刚才问了crccw和Araleii,表示可以只把DataReader给dispose就可以:

MySqlCommand mycmd = newMySqlCommand();

MySqlConnection mycon= new MySqlConnection(MysqlDao.constr);//创建连接

mycmd.Connection =mycon;

MySqlDataReader myreader;

mycon.Open();foreach(Knowledge tk inKnowledgeList)

{

insertSql= "INSERT INTO ...);";

mycmd.CommandText=insertSql;

res=mycmd.ExecuteNonQuery();

mycmd.CommandText= "select ... from ...";

myreader=mycmd.ExecuteReader();

myreader.Read();int kid = int.Parse(myreader.GetString("..."));

myreader.dispose();//只要加这句就可以了}

mycon.Close();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值