2011-10-24 57 views
0
private void d_Load(object sender, EventArgs e) 
    { 

     string connstring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\it155.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"; 
     SqlConnection conn = new SqlConnection(connstring); 
     try 
     { 
      conn.Open(); 

      string snumber = txtSnumber.Text; 
      SqlCommand get = new SqlCommand(@"Select from IStudent where SNumber ='" + txtSnumber.Text + "'", conn); 

     } 
     catch (Exception) 
     { 

     } 
    } 

给出上面写的代码的开始,我打算做的是能够在sql数据库中使用id号数据类型varchar(11)登录,该数据库要在txtSnumber中输入,但是在旁边我无法弄清楚如何检查输入的ID号码是否正确,如果正确,对应于该ID号码的信息应该显示在它们对应的文本框中。请帮帮我,谢谢有陷阱,如何登录?

+0

我强烈建议你删除try/catch块。它会让你忽略所有的例外,这不是你想要做的。 –

回答

1

您可以通过使用DataReader()

SqlCommand get = new SqlCommand(@"Select from IStudent where SNumber ='" + txtSnumber.Text + "'", conn); 
    SqlDataReader myReader = get.ExecuteReader(); 
    if (myReader.HasRows) 
    { 
    MessageBox.Show("ID is valid"); 
    while (myReader.Read()) 
     //Do something here   
    } 
    else 
    MessageBox.Show("Given ID is Invalid."); 

编辑检查:

虽然喊你把下面的参数里面的ExecuteReader()方法,这样,当你永远关闭数据读取器的连接也会自动关闭。

SqlDataReader myReader = get.ExecuteReader(CommandBehavior.CloseConnection); 
+0

有一个错误,说它没有打开。我试图把“conn.Open();”在SqlCommand行之上,但是当你得到那个错误时,弹出 –

+0

仍然存在错误?同时从datareader或其他读取值? –

5

您的sql语句很容易出现SQL注入。像这样连接SQL是非常糟糕的做法。相反,做这样的事情:现在

string snumber = txtSnumber.Text; 
SqlCommand get = new SqlCommand(@"Select from IStudent where SNumber [email protected]", conn); 

get.Parameters.AddWithValue("@User",snumber); 

,以检查记录是否被发现或没有,你这样做:

using(IDataReader reader = get.ExecuteReader()) 
{ 
     if (reader.HasRows) 
     { 
      //information correct. Do something 
     } 
} 
+0

只是为了我的理解和好奇,您的解决方案如何使用@user和参数语句避免SQL注入?我的意思是你间接地赋予textBox值的权利? – Zenwalker

+0

@zenwalker参数自动转义;字符串连接作为原始文本传递给DBMS。使用参数化查询有更多好处,比如执行计划可以被缓存,而原始sql语句不能。 – Icarus

+0

int this line“get.Parameters.AddWithValue(”@ User“,snumber);”,@User应该是什么?它是ID号码应该写入的文本框的名称? –