datatable.rows.count总是返回0
问题描述:
我正在创建一个简单的Web服务来验证用户。datatable.rows.count总是返回0
正确填充数据表(用于存储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");
}
}
}
答
后的单引号前添加一个空格,使您的查询搜索inexistant用户名和passords(如“史蒂夫”),它返回任何记录
速战速决可能是
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");
}
+0
It works.Thanks mate:D –
好像你关闭'sqlconnection' – Sami
关闭其他部分后您的SQL连接。 – Mahi