2

次のコードを実行すると、1行が省略されます。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;
4

4 に答える 4

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 ステートメントは、リーダーと接続の破棄 (したがって終了) を保証します。

于 2008-11-20T06:24:32.400 に答える
2

「if (dr.HasRows)」を捨てる必要があります。これは、while ループでチェックを複製するだけです。

接続で Close を呼び出したり、null に設定したりしないでください。代わりに、次のように「using」ブロックで接続をラップする必要があります。

using (SqlCommand cmd = new SqlCommand()) {
   //use the connection
}

データ リーダーと SQL コマンドについても同じことが言えます。

この次のビットは何もしないので、削除します。

  catch (Exception) { throw; }            
于 2008-11-20T08:35:08.643 に答える
1

デバッガーでこれをステップスルーして、リーダーを実行する前にコマンドパラメーターをチェックしてみましたか? SQL で直接 sproc を実行した場合と同じ値が結果セットに得られますか?

これを行うにはいくつかの方法があるため、間違っている可能性がありますが、コマンドにパラメーターを追加する方法が少しおかしいようです。

私は通常、次のようなパターンを使用します。

SqlParameter param = new SqlParameter();  
// set param stuff - here or in ctor   
cmd.Parameters.Add(param);  

主にあなたにとって何がうまくいくかについてです....

私が sprocs で問題を起こしたのは、ほとんどの場合、パラメーターをポーチしたときです。

于 2008-11-20T06:08:49.140 に答える
1

コードは私には正しいようです。デバッガーをステップ実行して、ExecuteReader から返される行数を確認することをお勧めします。私が持っているコメントの 1 つは、「if (dr.HasRows)」は「while (dr.Read())」でも同じ効果が得られるため、冗長であるということです。

もう 1 つの質問は、最初または最後のレコードが欠落しているかどうかを知っていますか?

ブライアン

于 2008-11-20T06:26:18.620 に答える