[英]datatable.rows.count always returns 0
我正在创建一个简单的Web服务来验证用户身份。
我在正确填充数据表(用于存储选择语句的结果)时遇到问题,即使选择语句未返回任何内容,“ dt.rows.count”(dt是数据表的名称)也始终返回0。 我尝试在填充数据表之前清除数据表,并且在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");
}
}
}
在单引号之前和之前添加空格使查询搜索不存在的用户名和密码(例如“ Steve”),并且不返回任何记录
快速修复可能是
var sda = new SqlDataAdapter(@"SELECT * FROM Login_Matrix
WHERE Username = '" + a + "'
AND Password = '" + b + "'", con);
但这很危险。
此代码容易受到Sql Injection攻击 。
您应该使用参数
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;
就安全性而言,尽快考虑的另一件事是,将纯文本密码存储在数据库中确实存在很大的安全风险。 您应该搜索如何添加密码并存储哈希值
此代码还有其他部分需要改进。
因此,您可以将代码重写为:
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");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.