C# C:Dbreader值未在循环中更新
我正在读取sql数据库,但我的dbreader值没有更新。有没有什么方法可以在循环时清除这些值并获取新值C# C:Dbreader值未在循环中更新,c#,C#,我正在读取sql数据库,但我的dbreader值没有更新。有没有什么方法可以在循环时清除这些值并获取新值 for (int i = 0; i < schdlrefno.Count; i++) { reschdl = schdlrefno[i]; reSQL = " SELECT schdl, techid, appdatetime, section FROM dbo.name WHERE schdl_refno ='"
for (int i = 0; i < schdlrefno.Count; i++)
{
reschdl = schdlrefno[i];
reSQL = " SELECT schdl, techid, appdatetime, section FROM dbo.name WHERE schdl_refno ='" + reschdl + "' ";
OdbcCommand DbCommand = conn.CreateCommand();
DbCommand.CommandText = reSQL;
DbCommand.CommandTimeout = 180;
OdbcDataReader DbReader = DbCommand.ExecuteReader();
if (DbReader.Read())
{
APPDT = "";
SCHEDULEREFNO = DbReader.GetString(DbReader.GetOrdinal("schdl"));
TECHID = DbReader.GetString(DbReader.GetOrdinal("techid"));
APPDT = DbReader.GetString(DbReader.GetOrdinal("appdatetime"));
SECTIONNAME = DbReader.GetString(DbReader.GetOrdinal("section"));
}
OdbcConnection reconn;
console.Writeline(APPDT);
}
这里仍然存在问题,但它修复了我上面两条评论中的五个问题中的四个,并展示了一种更好的代码结构方式: string reSQL=从dbo.name中选择schdl、techid、appdatetime和section,其中schdl_refno=@reschdl; //不要尝试在整个应用程序中重复使用相同的连接对象! 在此处使用var conn=新的OdbcConnectionconnection字符串 使用var cmd=new OdbcCommandreSQL,conn { //确保此处的类型和长度与列匹配。此信息不在问题中,因此我不得不猜测。 var p=cmd.Parameters。Add@reschdl,OdbcType.VarChar,80; 康涅狄格州公开赛 schdlrefno中的foreachvar reschdl { p、 值=reschdl; var reader=cmd.ExecuteReader; 如果是读卡器,请阅读 { //我们仍然会在每次迭代中覆盖这些内容! APPDT=; SCHEDULEREFNO=reader.GetStringreader.GetOrdinalschdl; TECHID=reader.GetStringreader.GetOrdinaltechid; APPDT=reader.GetStringreader.getOrdinalUpdateTime; SECTIONNAME=reader.GetStringreader.GetOrdinalsection; } Console.WritelineAPPDT; } }
哎呀。这看起来很容易受到sql注入问题的影响。为什么需要在这里循环?FROM和WHERE关键字现在是可选的吗?另外,还有四个大问题。首先,SQL是无效的。没有FROM或WHERE,这是合法的,但是您需要为=比较和列名提供一些上下文。其次,这会在每次迭代时附加到reSQL,因此在循环结束时,您将使用一个命令运行许多语句。第三,DbCommand与可能在此处作用域中的类型名称冲突。大多数人只使用command或cmd。最后,循环在每次迭代中分配给相同的变量,这意味着它们将被最后一条语句覆盖。即使循环有效,您的变量也只保留最后一条记录。谢谢Joel,我很感激。特别是为了使用正确的代码。我可以试一试吗