运行以下代码时,它会遗漏一行。当我做一个files.Count它说有4行,但第4行没有存储数据。当我从SQL Manager中运行存储过程时,它返回所有4行和所有数据。有什么帮助吗?
List<File> files = new List<File>();
SqlConnection active_connection = new SqlConnection(m_connection_string);
SqlCommand cmd = new SqlCommand();
SqlDataReader dr = null;
try
{
active_connection.Open();
cmd.Connection = active_connection;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "dalsp_Select_Organization_Files";
SqlParameter param;
param = cmd.Parameters.Add("@p_organization_guid", SqlDbType.UniqueIdentifier);
param.Value = new Guid(organization_guid);
param = cmd.Parameters.Add("@p_file_type", SqlDbType.NVarChar, 50);
param.Value = file_type;
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
if (dr.HasRows)
{
while (dr.Read())
{
File file = new File();
file.OrganizationGuid = dr["OrganizationGuid"].ToString();
file.FileGuid = dr["FileGuid"].ToString();
file.FileLocation = dr["FileLocation"].ToString();
file.FileName = dr["FileName"].ToString();
file.FileType = (FileTypeEnum)Enum.Parse(typeof(FileTypeEnum), dr["FileType"].ToString());
file.FileExtension = dr["FileExtension"].ToString();
file.FileDescription = dr["FileDescription"].ToString();
file.ThumbnailPath = dr["ThumbnailPath"].ToString();
files.Add(file);
}
}
dr.Close();
dr = null;
active_connection.Close();
cmd = null;
}
catch (Exception)
{
throw;
}
finally
{
if (active_connection.State != ConnectionState.Closed)
{
active_connection.Close();
active_connection.Dispose();
}
}
return files;
答案 0 :(得分:5)
如果您说您的文件集合有4个项目,但4项目没有任何值,那么您的意思是什么?它是否为null,对象是否没有数据,或者是否将索引抛出范围异常?
你在做文件[4]或类似的事情吗?
for(int x = 1; x < files.length; x++)
{
files[x]
}
那不行。记住在C#中基于0的索引。
作为旁注,您可以通过执行以下操作来取消您的try catch语句:
using (SqlConnection connection = new SqlConnection(conn_string))
{
connection.Open();
using (SqlCommand cmd = new SqlCommand("SELECT * FROM MyTable", connection))
{
using (SqlDataReader dr = cmd.ExecuteReader())
{
return result;
}
}
}
using语句将保证读者和连接的处理(以及结束)。
答案 1 :(得分:2)
你应该抛弃“if(dr.HasRows)”,它所做的就是复制while循环中的检查。
您不应该在连接上调用Close,也不应该将其设置为null。相反,您应该将连接包装在“使用”块中,如下所示:
using (SqlCommand cmd = new SqlCommand()) {
//use the connection
}
对于您的数据读取器和SQL命令也是如此。
下一位什么都不做,删除它。
catch (Exception) { throw; }
答案 2 :(得分:1)
您是否尝试在调试器中单步执行此操作,并在执行读取器之前检查命令参数?结果集中是否获得与在sql上直接运行sproc时相同的值?
我可能错了,因为有几种方法可以做到这一点,但是在将命令添加到命令的方式上看起来有些麻烦。
我通常使用的模式更像:
SqlParameter param = new SqlParameter();
// set param stuff - here or in ctor
cmd.Parameters.Add(param);
主要是关于什么对你有用....
我在sprocs遇到问题的大部分时间都是我打破参数的时候。
答案 3 :(得分:1)
代码对我来说是正确的。我想你肯定想通过一个调试器来看看从ExecuteReader返回多少行。我有一个评论是“if(dr.HasRows)”有点多余,因为“while(dr.Read())”会给你同样的效果。
我会遇到的另一个问题是,你知道你是否错过了第一张或最后一张唱片吗?
布赖恩