winfrom遇见一个奇怪问题,请高人指点。

wcq1987wang 2013-07-24 05:41:49
 private void initalDataSource()
{
try
{
//两个表,tezb和submonth,通过smonth字段关联。
loop: string selectCount = "SELECT count(*) FROM tezb t left join submonth s on t.smonth=s.smonth ......";
string sql = selectCount.Replace("count(*)", "t.rowid,t.stype,t.sjindu,t.smonth,sid,fkid,sleiji,sbyl,sbenjia,sbdjc,sbjc");
int count = Convert.ToInt32(SqliteHelper.ExecuteScalar(sqlconn.conn, selectCount + " and t.stype!=''"));
DataSet ds = new DataSet();
if (count > 0)
ds = SqliteHelper.getDataset(sqlconn.conn, CommandType.Text, sql + " and t.stype!=''", null);
else
ds = SqliteHelper.getDataset(sqlconn.conn, CommandType.Text, sql, null);
if (ds.Tables.Count > 0)
dt = ds.Tables[0];
if (dt.Rows.Count == 0)
{
//有些数据在因为tezb表中没有数据,上面读取不到,在这里补充数据。
string insertTezb = "insert into tezb(sgroup,smonth) select ...." ;
SqliteHelper.ExecuteNonQuety(sqlconn.conn, insertTezb);
exeCount++;
if (exeCount > 3)
{
return ;
}
goto loop;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "读取资料错误");
}
}

这是一个从数据库读取资料的方法,下面的代码是在框体显示的时候调动方法。代码如下:
private void child_Shown(object sender, EventArgs e)
{
if (dt == null)
{
initalDataSource();//此处调用上面的方法
if (dt == null)
this.Close();
}
//下面是绑定到DataGridView,和给ComboBox初始化值。
databind(dt); //标记1

cb_to.SelectedIndexChanged -= cb_from_SelectedIndexChanged;
cb_from.SelectedIndexChanged -= cb_from_SelectedIndexChanged;
cb_from.Text = dt.Rows[0]["smonth"].ToString();//标记2
cb_to.Text = dt.Rows[dt.Rows.Count-1]["smonth"].ToString();
cb_to.SelectedIndexChanged += cb_from_SelectedIndexChanged;
cb_from.SelectedIndexChanged += cb_from_SelectedIndexChanged;
}


问题在于;调用initalDataSource()在需要执行goto语句,执行到为查询字符串赋值时,就会跳出,执行“标记1”的代码,此时dt中还没有数据,导致“标记2”出总是无法产生错误,0位置没有任何行。
请问这是为什么???
...全文
252 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wcq1987wang 2013-07-25
  • 打赏
  • 举报
回复
看来我没有说清楚啊,我再描述下吧。不讨论goto的问题了,换成递归调用是同样的问题,所以不是goto的问题。问题是,当我执行递归的时候,执行到为字符串赋值查询语句的时候,正常情况下应该继续向下执行直到结束或退出,但是现在出现的情况是,下面的语句都开始异步执行了。主线程开始执行这一部分的代码了:
//下面是绑定到DataGridView,和给ComboBox初始化值。
            databind(dt); //标记1
 
            cb_to.SelectedIndexChanged -= cb_from_SelectedIndexChanged;
            cb_from.SelectedIndexChanged -= cb_from_SelectedIndexChanged;
            cb_from.Text = dt.Rows[0]["smonth"].ToString();//标记2
            cb_to.Text = dt.Rows[dt.Rows.Count-1]["smonth"].ToString();
            cb_to.SelectedIndexChanged += cb_from_SelectedIndexChanged;
            cb_from.SelectedIndexChanged += cb_from_SelectedIndexChanged;
这时,dt里面是没有值的。 如果在标记1前面插入如下代码: while (dt.Rows.Count == 0) { } 可正确得到结果。
缭绕飘渺 2013-07-25
  • 打赏
  • 举报
回复
思路问题 再仔细想想吧 不要被自己局限了
aaabc 2013-07-25
  • 打赏
  • 举报
回复
我觉得你可以把你要解决的问题描述下 然后大家一起想想办法。现在很少有人用goto了 就算是要递归也没必要用goto
wcq1987wang 2013-07-25
  • 打赏
  • 举报
回复
不是,是因为表里没有数据,在后面添加一行数据然后重新查询,把goto,换成initalDataSource(),问题依旧,执行不到最后一步就跳出这个方法了。
Regan-lin 2013-07-25
  • 打赏
  • 举报
回复
没有数据就是你查询完数据没有绑定到dataset里吧,用SqlDataAdapter来试下填充dataset看下,别用goto别到时候跳到自己都不知道了
wcq1987wang 2013-07-25
  • 打赏
  • 举报
回复
我顶,没有高手来吗?
wcq1987wang 2013-07-25
  • 打赏
  • 举报
回复
就算不用goto,内部再调用自己本身,还是这个情况。
wcq1987wang 2013-07-25
  • 打赏
  • 举报
回复
既然问了,肯定是无法找到问题了,就是在单步跟踪下才发现这个问题的啊。
laisui 2013-07-24
  • 打赏
  • 举报
回复
其实这种问题单步跟踪一下,总能发现问题在哪的 为什么不尝试自己分析下问题呢?
全栈极简 2013-07-24
  • 打赏
  • 举报
回复
这个代码实在不想看,我只想说一句,goto尽量避免使用。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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