日期:2014-05-17  浏览次数:20839 次

C# 中线程,StringBuilder,以及OdbcDataReader中的问题
向高手请教一下如下形式的代码

StringBuilder str= new StringBuilder();

MyConnection = new OdbcConnection(连接字符串);
MyConnection.Open();
cmd = new OdbcCommand(查询语句, MyConnection);
odr = cmd.ExecuteReader();
while(odr.read())
{
  str.Length=0;
  str.Append(Convert.ToString(odrsendControl.GetValue(0)));
  Console.WriteLine(str);
}
MyConnection.Close();
cmd.Dispose();

这样在后台打印出来的数据有可能是重复的(我确定数据库中没有重复的数据)
如果我不用StringBuilder而用string就不会出这个问题
还有如果我在循环中加一个15ms左右的延时重复情况有所缓解,直接写个50ms也不会出现重复
有高手能给我解释一下为什么吗?谢谢了

------解决方案--------------------
你这个 odrsendControl.GetValue(0) 是什么东东?
为什么不是odr.GetValue(0)??????????????????????????????????????
------解决方案--------------------
StringBuilder str= new StringBuilder();

MyConnection = new OdbcConnection(连接字符串);
MyConnection.Open();
cmd = new OdbcCommand(查询语句, MyConnection);
odr = cmd.ExecuteReader();
while(odr.read())
{
str.Append(Convert.ToString(odr.GetValue(0)));
}
Console.WriteLine(str.ToString());

MyConnection.Close();
cmd.Dispose();


------解决方案--------------------
是谁告诉你StringBuilder不会创建新的对象的?当你往这个StringBuilder内部写入String的时候,就是复制字符串的一个过程,将原来的字符串赋值到StringBuilder的内置数组里面。既然已经存在一个字符串了,你再复制一遍,显然是画蛇添足,降低效率。
是谁告诉你String在重复赋值的时候会创建新的对象的?这样认为的人就是根本不懂.NET,或者是被人误导了。没错,String是不可改写的,每次要改变它的内容的时候,需要创建新的对象,但是赋值并未改变它的内容,只有字符串拼接或者字符串删减才涉及到改变,仅仅是赋值,还是传递的引用地址,指向了同一个字符串的地址。你把字符串理解为只读的引用对象才是,赋值操作就是传递引用地址,修改操作才是创建新对象。