这开始只是一个评论,但时间太长了,所以。。。
这个方法应该做什么还不完全清楚。一方面,填充实例的属性。另一方面,您返回
int
,但将值转换为
Int16
(那是
short
)而不是to
Int32
。您填充该列表
之后
循环,这意味着您只获得select语句返回的最后一个值,它没有order by子句,这意味着行以任意顺序返回,并且您不使用
Id
不动产。
另外,请注意Steve关于将文件直接保存到
C:\
。
那是在我们还没接触到你用一个字段
SQLConnection
,而不是
using
语句,该语句将确保在处理完后将其关闭并进行处置,或者确保仅处理
try
块,这意味着如果在代码到达之前出现异常,则不会处理任何内容,或者数据库中的表列可能为空,因此
Convert.ToInt
如果读取器包含
DBNull.Value
而不是实际值。
也就是说,这里是当前代码的改进版本。我只是对它进行了修改,使其能够正确地处理所有内容,安全地从dataReader获取值,而不是抛出
NullReferenceException
,但正如我所说的,我不太清楚你用这种方法试图实现什么。
class RunValues
{
public int id { get; set; }
public int runTimeSpan { get; set; }
public int numberOfRunTime { get; set; }
public List<int> GetRunValues()
{
var values = new List<int>();
// I'm guessing it needs " where id = @id" here...
var mySQL = "select RunFreq, RunTimes from IFFRunValues";
using(var myCon = new SqlConnection(ConfigurationManager.ConnectionStrings["DatabaseConn"].ConnectionString))
{
using(var myCmd = new SqlCommand(mySQL, myCon))
{
try
{
myCon.Open();
SqlDataReader runValuesReader = myCmd.ExecuteReader();
if (runValuesReader.HasRows)
{
while (runValuesReader.Read())
{
runTimeSpan = runValuesReader.GetValueOrDefault<int>("RunFreq");
numberOfRunTime = runValuesReader.GetValueOrDefault<int>("RunTimes");
values.Add(runTimeSpan);
values.Add(numberOfRunTime);
}
}
}
catch (Exception ex)
{
var destPath = Path.Combine("C:\\", "error_log.txt");
File.AppendAllText(destPath, ex.Message);
values.Clear();
}
}
}
return values;
}
}
这个
GetValueOrDefault<T>
是一个扩展方法,我已经使用了很长时间,甚至记不起第一次在哪里遇到它-下面是包含它的类:
/// <summary>
/// Provides extension methods for IDataReader.
/// </summary>
public static class IDataReaderExtensions
{
/// <summary>
/// Gets the value of type T from the column specified by the index parameter, or default(T) if it's null.
/// </summary>
/// <typeparam name="T">The type of the value to get.</typeparam>
/// <param name="reader">An instance of a class implementing IDataReader.</param>
/// <param name="index">The index of the column from where to get the value.</param>
/// <returns>The value of type T from the specified column, default(T) if null.</returns>
public static T GetValueOrDefault<T>(this IDataReader reader, int index)
{
return (Convert.IsDBNull(reader[index])) ? default(T) : (T)reader.GetValue(index);
}
/// <summary>
/// Gets the value of type T from the column specified by the name parameter, or default(T) if it's null.
/// </summary>
/// <typeparam name="T">The type of the value to get.</typeparam>
/// <param name="reader">An instance of a class implementing IDataReader.</param>
/// <param name="name">The name of the column from where to get the value.</param>
/// <returns>The value of type T from the specified column, default(T) if null.</returns>
public static T GetValueOrDefault<T>(this IDataReader reader, string name)
{
return reader.GetValueOrDefault<T>(reader.GetOrdinal(name));
}
}