我已经进行了广泛的搜索,但大多数 Datareader 问题/答案对都涉及越过第一行、不返回任何内容、使用 datareader 获取单个值等。没有什么比我现在遇到的更重要了。
需要明确的是,这是我夜校的作业,尽管只是其中的一小部分。
该函数的大小为 int;该表有两个 colmun:col1 和 col2,其中 col1 将索引值保存为 double,col2 保存随机生成的 double。table 是工作簿中的excel工作表,不知道是否相关。
表已使用由 ADO 命令对象执行的插入语句填充,没有问题。
现在,datareader 对象并没有向我提供查询中由 size/@size 指定的行数(因为它在本例中扮演索引/UID 的双重角色),而是获取看似随机的行数。我说看似,因为数字似乎确实固定为“大小”的值(例如,size = 10 -> datareader 在 .executeReader() 之后包含 3 行;size = 2 -> datareader 包含 113 行;size = 5 -> 446 行)。
在调试时,我跟踪查询的@size 参数仍然是 10.0,我无法确定 reader.Read() 何时/为什么变为 False。
我还将查询字符串中的参数替换为文字(5.0);这导致条件表达式异常中的类型不匹配。但这都是双打,还是我错过了什么?!我猜这会以某种方式成为踢球者,但我现在不知所措。
正如您可能猜到的那样,我对编程很陌生,所以请多多包涵。
是什么导致我的代码以它的方式运行?
private Double[] getSelection(int size, string table)
{
List<Double> list = new List<Double>();
Double[] toSort;
OleDbConnection connect = new OleDbConnection(cntstring);
connect.Open();
OleDbCommand command = connect.CreateCommand();
command.CommandType = CommandType.Text;
command.Parameters.Add("@size", OleDbType.Double).Value = Convert.ToDouble(size);
command.CommandText = String.Format("SELECT * FROM [{0}$] WHERE col1 < @size;", table);
try
{
OleDbDataReader reader = command.ExecuteReader();
Double outputReader;
while (reader.Read())
{
outputReader = Convert.ToDouble(reader.GetValue(1)); /for some reason (which is not my main concern at the moment) the reader.getDouble() method returned an invalid cast exception
list.Add(outputReader);
}
toSort = new double[list.Count()];
foreach (double d in list)
{
toSort[list.IndexOf(d)] = d;
}
string output = String.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}", toSort[0], toSort[1], toSort[2], toSort[3], toSort[4], toSort[5], toSort[6], toSort[7], toSort[8], toSort[9]);
//to check for values; the String.Format is where i first encountered the index out of bounds exception
MessageBox.Show(output);
reader.Close();
reader.Dispose();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
finally
{
connect.Close();
connect.Dispose();
return toSort;
}
}