2012-04-05 31 views
0

我有用於驗證的cicle,但由於某種原因它不走trought的cicle麻煩與cicle,一個結果,但它並沒有去trought它

看的意見,而cicle似乎確實什麼

如存在任何方法來檢索一個結果plase告訴我該怎麼辦呢

這裏是我的代碼,任何幫助,將不勝感激

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; 
    } 
+1

我在這裏遇到了一點語言障礙。如果通過cicle,你的意思是while循環,驗證來自哪裏? while循環讀取查詢返回的所有記錄(一個接一個地),是不是應該發生什麼? – 2012-04-05 17:08:33

+0

如果你沒有進入while循環,這意味着查詢返回0結果,可能是這樣嗎? – 2012-04-05 17:11:23

+0

是應該發生在while循環,但它不工作,我只需要檢索1條記錄,但由於某種原因,while循環不會執行(usuarioDR.ExecuteReader()是使循環工作的觸發器) – ricardorios 2012-04-05 17:12:36

回答

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對象中有什麼嗎?如果沒有,那麼當您致電ExecuteReader()時,沒有任何東西被推入usarioDR

嘗試從另一端進行處理 - 在服務器管理工​​作室中用@cedula的測試值寫出您的"SELECT TOP 1 * FROM movimiento_docente WHERE (ID = @cedula) ORDER BY id_movimiento DESC"查詢。它會產生你期望的結果嗎?如果是這樣,那就意味着你的問題在你的代碼中,以及它如何訪問數據庫。最後,我認爲這將歸結爲標準的調試過程:設置斷點,遍歷代碼,並檢查對象中的數據以查看它是否符合您的期望。

一個地方開始尋找可能是在您的usarioDR對象。您首先將其初始化爲null;在運行usuarioDR = usuario.ExecuteReader();後,它仍然是null?如果是這樣,那可能會幫助您縮小搜索範圍。

+0

在SQL Server管理工作室,它給了我期望的結果,因爲你說循環沒有運行,所以我不知道這裏發生了什麼 – ricardorios 2012-04-05 19:18:57

+0

我編輯過我的答案是提供更多解決方案提示。你需要做的是開始一些積極的調試。你知道你想要你的代碼做什麼,這意味着你頭腦中有一個想法,就是你的函數的每一行應該發生什麼。逐行檢查您的代碼,並嘗試驗證代碼(a)的每一行按您認爲的方式工作,並(b)生成您期望的結果。你正在使用C#,所以我會假設你正在使用Visual Studio。在函數的某些行中設置一些斷點並使用它來驗證您的代碼/數據。 – lyrisey 2012-04-05 19:30:34

+0

我alreadey在我的代碼和sql服務器上測試,它似乎usuarioDR.Read()有這個錯誤「空\t」Laenumeración沒有produjoningúnresultado「\t字符串」(它的意思是「枚舉沒有結果」) – ricardorios 2012-04-05 19:57:30