分配SQL阅读器会留下代码

时间:2015-03-21 20:05:45

标签: c# sql sql-server sqldatareader

我的c#代码存在问题。我正在尝试检查用户名是否已经存在,所以我有一个select语句,但是当我断开它时,它会在我分配阅读器之后立即离开代码。这是我的代码:

SqlConnection conn = new SqlConnection(Properties.Settings.Default.CategoriesConnectionString);
SqlCommand chkUser = new SqlCommand("SELECT [Username] FROM [Accounts] WHERE [Username] = @username", conn);
chkUser.Parameters.AddWithValue("@username", txtUsername.Text);
conn.Open();
SqlDataReader sqlReader = chkUser.ExecuteReader(); //leaves code right here


if (sqlReader.HasRows)
{
    MessageBox.Show("That username already exists.  Please choose another.");
    txtUsername.Focus();
    return;
}
conn.Close();

我认为这是因为表中没有任何东西,但我不知道为什么它不检查它是否有行并且只是离开。 任何帮助表示赞赏。感谢

2 个答案:

答案 0 :(得分:0)

有关此问题的更多信息将非常有用。看起来你出于某种原因正在获得例外(如@Guffa所说)并且没有任何进一步的细节,很难猜测原因是什么。尝试将您发布的代码更改为以下内容:

using(SqlConnection conn = new SqlConnection(Properties.Settings.Default.CategoriesConnectionString))
using(SqlCommand chkUser = new SqlCommand("SELECT [Username] FROM [Accounts] WHERE [Username] = @username", conn))
{
  chkUser.Parameters.AddWithValue("@username", txtUsername.Text);

  try
  {
    conn.Open();

    using(SqlDataReader sqlReader = chkUser.ExecuteReader()) 
    {
      if (sqlReader.HasRows)
      {
        MessageBox.Show("That username already exists.  Please choose another.");
        txtUsername.Focus();
        return;
      }
    }
  }
  catch(Exception e)
  {
    // manage exception  
  }
}

看看是否有变化。如果它没有尝试调试,看看它抛出了什么样的异常。

答案 1 :(得分:0)

这是我在登录场景中使用的示例,其中我将用户名存储在mysql数据库表中。 即使我使用MySQL也不会有太大的不同。(虽然不确定)。

public static string CheckUsername()
{
  bool usernameCheck = false;
  InitiateDatabase();//contains the root.Connection string

  MySqlCommand readCommand = rootConnection.CreateCommand();

  readCommand.CommandText = String.Format("SELECT username FROM `SCHEMA`.`USERTABLE`");

  rootConnection.Open();
  MySqlDataReader Reader = readCommand.ExecuteReader();

  while (Reader.Read())
  {
    for (int i = 0; i < Reader.FieldCount; i++)
    {
      if (Reader.GetValue(i).ToString() == USERNAME_STRING)
      {
        usernameCheck = true;
      }
    }
  }
  rootConnection.Close();

  if (usernameCheck)
  {
    return "Succes";
  }
  else
  {
    return "Wrong Username!";
  }
}

这当然是无异常处理,您可能会在测试期间发现它有用,并且其他人可以使用它。