0

検証用の cicle がありますが、何らかの理由で cicle を通過しません。

コメントを見てください。

1 つの結果を取得する方法があれば、その方法を教えてください。

ここに私のコードがあります。

private bool validar_ultimo_movimiento(Int64 cedula)
    {
        bool validar = false;


        DateTime tipo = Convert.ToDateTime("00:00:00");
        SqlConnection Wdcon_usuario = new SqlConnection(WDcon);
        SqlCommand usuario = new SqlCommand();
        SqlDataReader usuarioDR = null;

        //Instancio la conexion SQL
        usuario.Connection = Wdcon_usuario;

        //Registro el Query SQL
        usuario.CommandText = "SELECT TOP 1 * FROM movimiento_docente WHERE (ID = @cedula) ORDER BY id_movimiento DESC";
        usuario.Parameters.AddWithValue("@cedula", cedula);

        //Abro la conexion
        Wdcon_usuario.Open();

        //Ejecuto la consulta
        usuarioDR = usuario.ExecuteReader();

        //Empiezo el ciclo
        while (usuarioDR.Read())
        {
            MessageBox.Show("Paso por aca 2"); // <- It does not execute
            if (usuarioDR["fechahora"].ToString() != "")
            {
                MessageBox.Show("Paso por aca 3");
                tipo = (DateTime)usuarioDR["fechahora"];
                MessageBox.Show(tipo.ToString());
            }
            else
            {
                validar = true;
                MessageBox.Show("Paso por aca 1");
            }
        }

        //Cierro la conexion
        Wdcon_usuario.Close();
        //Termino la sentencia SQL

        DateTime valoringresado = Convert.ToDateTime(dtHoraManual.Value);
        MessageBox.Show("Valor Ingresado = " + valoringresado.ToString() + " Valor BD = " + tipo.ToString());
        if (valoringresado > tipo)
        {
            validar = true;
        }
        else
        {
            validar = false;
        }
        return validar;
    }
4

1 に答える 1

1

SQLDataReader オブジェクトにアクセスするためのコードは正しいようです。

私があなたを正しく理解していれば、このwhileループは実行されていません:

   //Empiezo el ciclo
    while (usuarioDR.Read())
    {
        MessageBox.Show("Paso por aca 2"); // <- It does not execute
        if (usuarioDR["fechahora"].ToString() != "")
        {
            MessageBox.Show("Paso por aca 3");
            tipo = (DateTime)usuarioDR["fechahora"];
            MessageBox.Show(tipo.ToString());
        }
        else
        {
            validar = true;
            MessageBox.Show("Paso por aca 1");
        }
    }

このループが実行されていない場合は、usuarioDR.Read()関数が の値を返しているためですfalse。何が問題なのかを理解するために、次のことを試してみてください。

コードのデバッグを開始します。最初のステップとして、 にブレークポイントを設定し、関数内のその時点でオブジェクトにwhile (usuarioDR.Read())含まれる情報を確認することをお勧めします。オブジェクトusuarioDRの中に何かありますか?存在しない場合は、を呼び出したときにusuarioDR何もプッシュされていないことを意味します。usarioDRExecuteReader()

"SELECT TOP 1 * FROM movimiento_docente WHERE (ID = @cedula) ORDER BY id_movimiento DESC"もう一方の端からこれにアプローチしてみてください -のテスト値を使用して、Server Management Studio でクエリを書き出します@cedula。期待どおりの結果が得られますか? もしそうなら、それはあなたの問題があなたのコードとデータベースへのアクセス方法にあることを意味します。

最終的には、標準のデバッグ プロセスに行き着くと思います。ブレークポイントを設定し、コードをステップ実行し、オブジェクト内のデータをチェックして、期待どおりかどうかを確認します。

探し始める場所の 1 つは、usarioDRオブジェクトである可能性があります。として初期化することから始めますnullnullラインを走らせた後もまだusuarioDR = usuario.ExecuteReader();ですか?もしそうなら、それはあなたの検索を絞り込むのに役立つかもしれません.

于 2012-04-05T19:05:41.603 に答える