C# SQL DataReader在循环中缺少一行

C# SQL DataReader在循环中缺少一行,c#,sql,datareader,C#,Sql,Datareader,当运行下面的代码时,它会省略一行。当我做一个files.Count时,它说有4行,但没有为第4行存储数据。当我从SQL Manager中运行存储过程时,它将返回所有4行和所有数据。有什么帮助吗 List<File> files = new List<File>(); SqlConnection active_connection = new SqlConnection(m_connection_string);

当运行下面的代码时,它会省略一行。当我做一个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;
List files=newlist();
SqlConnection active\u connection=新的SqlConnection(m\u connection\u字符串);
SqlCommand cmd=新的SqlCommand();
SqlDataReader dr=null;
尝试
{
活动_连接。打开();
cmd.Connection=活动连接;
cmd.CommandType=CommandType.storedProcess;
cmd.CommandText=“dalsp\u选择组织\u文件”;
SqlParameter参数;
param=cmd.Parameters.Add(“@p\u organization\u guid”,SqlDbType.UniqueIdentifier);
参数值=新Guid(组织\ Guid);
param=cmd.Parameters.Add(“@p_file_type”,SqlDbType.NVarChar,50);
参数值=文件类型;
dr=cmd.ExecuteReader(CommandBehavior.CloseConnection);
如果(哈斯罗博士)
{                    
while(dr.Read())
{
File 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();
文件。添加(文件);
}       
}
Close博士();
dr=null;
活动_连接。关闭();
cmd=null;
}
捕获(例外)
{
投掷;
}
最后
{
if(活动连接状态!=连接状态关闭)
{
活动_连接。关闭();
活动的_连接。Dispose();
}
}
归还文件;

您是否尝试在调试器中单步执行此操作,并在执行读取器之前检查命令参数?结果集中的值是否与直接在sql上运行存储过程时的值相同

我可能是错的,因为有几种方法可以做到这一点,但是您将参数添加到命令的方式看起来有点怪异

我通常使用的模式更像:

SqlParameter param = new SqlParameter();  
// set param stuff - here or in ctor   
cmd.Parameters.Add(param);  
主要是关于什么对你有用


大多数情况下,我在存储过程中遇到的问题都是在我调低参数时出现的。

如果您说您的文件集合有4项,但4项不包含任何值,这是什么意思?它是否为null,对象是否没有数据,或者是否抛出索引超出范围异常

你在做一个文件[4]或类似的事情吗

for(int x = 1; x < files.length; x++)
{
     files[x]
}

using语句将保证读卡器和连接的处理(从而关闭)。

我认为代码是正确的。我认为您肯定希望逐步通过调试器查看ExecuteReader返回了多少行。我的一个评论是,“if(dr.HasRows)”有点多余,因为“while(dr.Read())”会给你同样的效果

我想问的另一个问题是,你知道你是错过了第一张还是最后一张唱片吗

Brian

您应该放弃“if(dr.HasRows)”,它所做的只是在while循环中重复检查

您不应该在连接上调用Close,也不应该将其设置为null。相反,您应该将连接包装在“使用”块中,如下所示:

using (SqlCommand cmd = new SqlCommand()) {
   //use the connection
}
对于数据读取器和SQL命令,也可以这样说

下一位根本不起作用,请删除它

  catch (Exception) { throw; }            

谢谢Marc,自从CodeGen我再也不用手写了。。我想我是因为盯着密码睡得太晚了。这就是问题所在——我正在尝试获取文件[4],当然,这些文件并不存在。多么愚蠢的错误啊。谢谢你的帮助。我已经更改了代码,现在它工作得很好。missing:cmd.Connection=Connection;如果希望在异常上设置断点,则catch(Exception){throw;}非常有用。这应该不会有什么坏处,我认为编译器会在发布版本中将其删除
  catch (Exception) { throw; }