C#返回if语句的本地SQL行

时间:2013-04-19 11:32:33

标签: c# sql-server-ce sqlcommand

我正在努力让我的登录系统正常运行。目前我认为除了if语句条件(如果返回了行,那么if语句为true,否则登录失败)我已经有了一切可以工作的地方。我不确定如何读取返回的行数,我确实尝试使用ExecuteReader方法,但无法使其工作。 感谢任何帮助,谢谢。

代码:

private void btn_login_Click(object sender, EventArgs e)
{
    SqlCeConnection connection = new SqlCeConnection(@"Data Source=C:\\temp\\Project\\WindowsFormsApplication2\\Database.sdf");

    connection.Open();

    SqlCeCommand command = new SqlCeCommand("SELECT * FROM Technician WHERE Name = '" + txt_username.Text + "' AND Password = '" + txt_password.Text + "' ");
    SqlCeDataAdapter dataAdapter = new SqlCeDataAdapter(command);

    if ()
    {
        MessageBox.Show("Login Successful");
        System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(MainMenuForm));
        t.Start();
        this.Close();
    }
    else
    {
        MessageBox.Show("Login Unsuccessful");
        return;
    }

    connection.Close();
}

4 个答案:

答案 0 :(得分:3)

我已将您的代码更改为使用更简单的ExecuteScalar,它返回查询获取的第一行的第一列

当然,最重要的是你不要编写连接字符串的sql命令,因为这可能会以惊人的方式失败。 (如果您的文本框包含单引号,以及用户如何写malicious text like this

,该怎么办?
using(SqlCeConnection connection = new SqlCeConnection(.....)) 
{
     connection.Open();
     string sqlText = "SELECT Count(*) FROM Technician WHERE Name = @name AND Password=@pwd"
     SqlCeCommand command = new SqlCeCommand(sqlText, connection);
     command.Parameters.AddWithValue("@name", txt_username.Text);
     command.Parameters.AddWithValue("@pwd", txt_password.Text);
     int result = (int)command.ExecuteScalar();
     if (result > 0)
     {
          MessageBox.Show("Login Successful");
          System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(MainMenuForm));
          t.Start();
          this.Close();
     }
     else
     {
           MessageBox.Show("Login Unsuccessful");
           return;
     }
 }

另请注意using语句,如果未找到登录但您忘记关闭连接,则在之前的代码中退出该过程。在应用程序的生命周期中,这可能会成为一个大问题。 Using语句阻止了这个

现在我应该开始讨论以明文形式存储和传输密码的弱点,但这是另一回事

答案 1 :(得分:2)

方法ExecuteNonQuery将返回受影响的行数。

int rowsAffected = command.ExecuteNonQuery();
bool userExists = rowsAffected > 0;
if (userExists) // The user exists
{

}

注意:但是您的应用程序容易受到SQL注入攻击。即我可以在;DROP TABLE Technician文本框中输入txt_password

您应该使用参数化查询或其他更安全的身份验证方法(例如,ASP.NET成员资格)。

要使用参数化查询,您可以将CommandText更改为:

 SqlCeCommand command = new SqlCeCommand("SELECT * FROM Technician WHERE Name=@username AND password=@password";

然后在via:

中添加参数
    command.Parameters.AddWithValue("@username", txt_username.Text);  
    command.Parameters.AddWithValue("@password", txt_password.Text);

http://johnhforrest.com/2010/10/parameterized-sql-queries-in-c/

答案 2 :(得分:0)

private void btn_login_Click(object sender,EventArgs e) {

SqlConnection connection = new SqlConnection(@"Data Source=C:\\temp\\Project\\WindowsFormsApplication2\\Database.sdf");

connection.Open();

SqlCommand command = new SqlCommand("SELECT * FROM Technician WHERE Name = '" + txt_username.Text + "' AND Password = '" + txt_password.Text + "' ");
int row=command.ExecuteNonQuery();

if (row>0)
{
    MessageBox.Show("Login Successful");
    System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(MainMenuForm));
    t.Start();
    this.Close();
}
else
{
    MessageBox.Show("Login Unsuccessful");
    return;
}

connection.Close();

}

答案 3 :(得分:0)

    a=1;
    b=1;


 if a=b
    {
    a=c;
    } 
 else
    {
    a=b;
    }

else if
{
MessageBox.Show("Login Unsuccessful");
return i;