datatable.rows.count始终返回0

时间:2017-04-15 08:45:54

标签: c# sql-server

我正在创建一个简单的Web服务来验证用户。

我在填充数据表(用于存储select语句的结果)时遇到问题,'dt.rows.count'(dt是数据表的名称)总是返回0,即使select语句没有返回任何内容。我已经尝试在填充之前清除数据表,并且在if条件之后,但是无效,我得到相同的结果。

非常感谢任何关于如何继续的建议。

[WebMethod]
    public string Authen(string a, string b)
    {
       var con = new SqlConnection("Data Source=SERVER-SQL;Initial Catalog=DECA-DB;Persist Security Info=True;User ID=sa;Password=*****");
       var sda = new SqlDataAdapter("SELECT * FROM Login_Matrix WHERE Username = ' " + a + " ' AND Password = ' " + b + " '", con);
        var dt = new DataTable();

        con.Open();
        dt.Clear();
        sda.Fill(dt);            
        con.Close();
        int x = dt.Rows.Count;
        //return (x);

        if ( x >0)
        {
            dt.Clear();
            return ("In");
        }

        else
        {
            dt.Clear();
            return ("out");
        }

        }
    }

1 个答案:

答案 0 :(得分:2)

在单引号之前和之前添加空格会使您的查询搜索不必要的用户名和密码(例如“Steve”)并且它不返回任何记录

快速修复可能

var sda = new SqlDataAdapter(@"SELECT * FROM Login_Matrix 
                               WHERE Username = '" + a + "' 
                                 AND Password = '" + b + "'", con);

但这非常危险 此代码容易受到Sql Injection attacks的攻击 你应该使用参数

var sda = new SqlDataAdapter(@"SELECT * FROM Login_Matrix 
                              WHERE Username =  @uname 
                                AND Password = @pwd", con);
sda.SelectCommand.Parameters.Add("@uname", SqlDbType.NVarChar).Value = a;
sda.SelectCommand.Parameters.Add("@pwd", SqlDbType.NVarChar).Value = b;

关于安全性的另一方面,另一件需要考虑的事情是,在您的数据库中存储纯文本密码是一个非常大的安全风险。您应该搜索how to salt and store an hash of the password

此代码的其他部分需要改进。

  • 首先,您需要在一次性物体周围使用声明 比如连接或命令。
  • 其次,没有必要拥有完整的SqlDataAdapter和 DataTable只是检查用户是否存在。

因此,您可以将代码重写为:

string cmdText = @"IF EXISTS(SELECT 1 FROM Login_Matrix 
                   WHERE Username = @uname AND Password = @pwd)
                   SELECT 1 ELSE SELECT 0";

using(SqlConnection con = new SqlConnection("....."))
using(SqlCommand cmd = new SqlCommand(cmdText, con))
{
    con.Open();
    int result = (int)cmd.ExecuteScalar();
    return ( result == 1 ? "In" : "out");
}