C# 为什么第二次函数迭代只添加[MemNo],没有其他数据?
因此,按照我的编码方式,用户在通过我的Winforms应用程序进行查询时可以选择3个数据源:SOURCE1和SOURCE2。对于SOURCE1或SOURCE2,我的代码可以正常工作,查询400系统中的数据并通过datareader循环以将数据放置在ListView控件中 当用户选择两者作为数据源时,我的查询字符串将变为“从X中选择…从Y中选择” 我猜400个系统查询与SQL Server系统不同,它不允许您通过使用分号(;)分隔查询来尝试在一次点击中执行多个选择。因此,为了解决这个问题,当查询字符串包含分号(;)时,我将调用GetISeriesData()函数两次。我的代码处理第一个查询,然后重复并使用第二个查询 我得到的是一些非常奇怪的行为,没有错误: SOURCE1查询功能完美,检索所有可用数据并按预期填充ListView控件。但是,使用SOURCE2的代码的第二次迭代只填充ListView的[MemNo]字段 我已经验证了其他数据是否已成功返回,通过单步执行,代码方面的值应该被插入到控件中。有人能发现我可能忽略的东西吗?就我个人而言,我无法理解为什么会发生这种情况 代码:C# 为什么第二次函数迭代只添加[MemNo],没有其他数据?,c#,.net,winforms,listview,listviewitem,C#,.net,Winforms,Listview,Listviewitem,因此,按照我的编码方式,用户在通过我的Winforms应用程序进行查询时可以选择3个数据源:SOURCE1和SOURCE2。对于SOURCE1或SOURCE2,我的代码可以正常工作,查询400系统中的数据并通过datareader循环以将数据放置在ListView控件中 当用户选择两者作为数据源时,我的查询字符串将变为“从X中选择…从Y中选择” 我猜400个系统查询与SQL Server系统不同,它不允许您通过使用分号(;)分隔查询来尝试在一次点击中执行多个选择。因此,为了解决这个问题,当查询字
private void btnSearch_Click(object sender, EventArgs e)
{
lvData.Clear();
string qryCmd = "";
createColumns();
switch (cmbLetterType.SelectedIndex)
{
case 0:
qryCmd = chkSystem("oldAddr");
break;
case 1:
qryCmd = chkSystem("newAddr");
break;
case 2:
qryCmd = chkSystem("nameChg");
break;
}
// If the option for BOTH is selected, qryCmd is a long string containing the individual queries for SOURCE1 and SOURCE2.
// Here I check if a semicolon (;) exists, denoting that there are 2 cmd queries in the string.
// If so, I split the query calling GetiSeriesData() with the first query string, then assigning qryCmd the second
// strings value and continuing processing as normal.
if (qryCmd.Contains(";"))
{
char[] delimitChar = { ';' };
string[] splitQueries = qryCmd.Split(delimitChar);
qryCmd = splitQueries[0];
GetiSeriesData(qryCmd);
qryCmd = splitQueries[1];
}
GetiSeriesData(qryCmd);
// Display message if no records found.
if (lvData.Items.Count == 0)
{
MessageBox.Show("No records found.");
}
lblRecCnt.Text = lvData.Items.Count.ToString();
this.lvData.CheckBoxes = true;
}
编辑:
解决了
x
在第二次迭代时被重置为0,导致所有子项数据与其项不匹配,并且没有任何内容写入字段。将x
设置为一个更高的范围值,现在一切都处理得很好,所有数据都存在。多个查询意味着您可能在选择中有不同的字段,您应该考虑到这一点。顺便说一句,我想介绍一下OdbcDataReader.NextResult()
的用法,它允许您在分号分隔的查询(批处理查询)中循环遍历所有结果。通过这种方式,您可以使do while
循环,而NextResult()
返回true,在这种情况下,您有另一个while循环,而Read()
返回true。很有趣,感谢您对术语规范的了解。关于我的非书面数据问题有什么想法吗?我不确定,但正如我所说的,您有多个查询,因此每个查询的SELECT中可能有不同的字段,如果所有查询看起来都像SELECT A、B、C…
,那么我不认为第一个查询运行OK(填充所有A、B、C
)第二个只填充1个字段(只填充A
)。查询运行得很好,但填充ListView控件不好。我发现在第二次迭代中我重置了x=0
,导致没有子项数据被添加。现在一切都好了,谢谢。
public void GetiSeriesData(string query)
{
OdbcDataReader dr;
try
{
//Set value of system based on table being looked at in ConnectionString
string sysValue = "";
if (query.Contains("lib1"))
{
sysValue = "P";
}
if (query.Contains("lib2"))
{
sysValue = "N";
}
MergeDocLibrary mdl = new MergeDocLibrary();
dr = mdl.GetData(query);
Int16 x = 0;
string gndr = "";
// Fill ListView Control lvData
while (dr.Read())
{
lvData.Items.Add(dr["MEMNO"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["NAME"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["ADDR1"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["ADDR2"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["CITY"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["STATE"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["ZIP"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["OLD_ADDR1"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["OLD_ADDR2"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["OLD_CITY"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["OLD_STATE"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["OLD_ZIP"].ToString().Trim());
lvData.Items[x].SubItems.Add(sysValue.ToString().Trim());
lvData.Items[x].SubItems.Add(DateTime.Today.ToString("d"));
lvData.Items[x].SubItems.Add(dr["SEX"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["LNAME"].ToString().Trim());
if (dr["SEX"].ToString().Trim() == "M")
{
gndr = "Mr.";
}
else // (dr["SEX"].ToString().Trim() == "F)
{
gndr = "Ms.";
}
lvData.Items[x].SubItems.Add(gndr + dr["LNAME"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["CITY"].ToString().Trim() + ", " + dr["STATE"].ToString().Trim() + " " + dr["ZIP"].ToString().Trim());
x += 1;
}
mdl.closeConn();
}
catch (Exception ex)
{
MessageBox.Show("Source:\t" + ex.Source + "\nMessage: \t" + ex.Message + "\nData:\t" + ex.Data);
}
finally
{
}
}