使用参数化查询 C# 返工
Rework using parameterized queries C#
有很多关于参数化查询的教程,但其中大部分涉及使用 SqlCommand
,我的代码唯一接受的是 SqlDataAdapter
用于我的 SQL 命令,我随时尝试将其实例化为 SqlCommand
我收到错误。
TL;DR
我要么需要有关如何使用参数化查询进行返工的指导,要么我需要知道为什么我的 SqlDataAdapter
行不能用作 SqlCommand
行。
private void btnLogin_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Jake\Documents\Data.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;");
SqlDataAdapter sda = new SqlDataAdapter("Select Count(*) From Login Where Username = '" + txtUsername.Text + "' and Password = '" + txtPassword.Text + "'", con);
DataTable dt = new DataTable();
sda.Fill(dt);
if (dt.Rows[0][0].ToString() == "1")
{
this.Hide();
MessageBox.Show("LOGIN!");
}
else
{
MessageBox.Show("FAILED!");
}
}
您可以使用:
using (SqlDataAdapter sqlDA = new SqlDataAdapter("Select * from user where username = @username and password = @pass", sqlConnect))
{
sqlDA.SelectCommand.CommandType = CommandType.Text;
sqlDA.SelectCommand.Parameters.Add("@username", SqlDbType.Varchar).Value = username;
sqlDA.SelectCommand.Parameters.Add("@pass", SqlDbType.Varchar).Value = password;
sqlDA.Fill(dataTableVariable);
return dataTableVariable;
}
您的密码记得使用哈希算法
此代码未经测试。如果你想要最好的性能,你可以探索执行标量。
您可以在 SqlDataAdapter
中使用 Parameters.AddWithValue
sda.SelectCommand.Parameters.AddWithValue("@ParamName",value);
检查这个:c# Using Parameters.AddWithValue in SqlDataAdapter
尝试使用参数化查询,它将避免错误和 sql 注入
获得 reader 后,您可以使用 HasRow()
检查是否返回了记录
string conString = "xxxxxxxxxxxxxxxxxxxxxxxx";
using (SqlConnection con = new SqlConnection(conString))
{
con.Open();
using (var cmd = new SqlCommand(
"SELECT * FROM Login Where Username=@Username AND Password=@Password",
con))
{
cmd.Parameters.AddWithValue("@Username", txtUsername.Text);
cmd.Parameters.AddWithValue("@Password", txtPassword.Text);
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRow())
{
if(reader.Read())
{
var username = reader["Username"].ToString();
}
}
else
{
//User does not exists
}
}
}
}
您将需要导入一些库:
using System;
using System.Data;
using System.Data.SqlClient;
有很多关于参数化查询的教程,但其中大部分涉及使用 SqlCommand
,我的代码唯一接受的是 SqlDataAdapter
用于我的 SQL 命令,我随时尝试将其实例化为 SqlCommand
我收到错误。
TL;DR
我要么需要有关如何使用参数化查询进行返工的指导,要么我需要知道为什么我的 SqlDataAdapter
行不能用作 SqlCommand
行。
private void btnLogin_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Jake\Documents\Data.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;");
SqlDataAdapter sda = new SqlDataAdapter("Select Count(*) From Login Where Username = '" + txtUsername.Text + "' and Password = '" + txtPassword.Text + "'", con);
DataTable dt = new DataTable();
sda.Fill(dt);
if (dt.Rows[0][0].ToString() == "1")
{
this.Hide();
MessageBox.Show("LOGIN!");
}
else
{
MessageBox.Show("FAILED!");
}
}
您可以使用:
using (SqlDataAdapter sqlDA = new SqlDataAdapter("Select * from user where username = @username and password = @pass", sqlConnect))
{
sqlDA.SelectCommand.CommandType = CommandType.Text;
sqlDA.SelectCommand.Parameters.Add("@username", SqlDbType.Varchar).Value = username;
sqlDA.SelectCommand.Parameters.Add("@pass", SqlDbType.Varchar).Value = password;
sqlDA.Fill(dataTableVariable);
return dataTableVariable;
}
您的密码记得使用哈希算法
此代码未经测试。如果你想要最好的性能,你可以探索执行标量。
您可以在 SqlDataAdapter
中使用Parameters.AddWithValue
sda.SelectCommand.Parameters.AddWithValue("@ParamName",value);
检查这个:c# Using Parameters.AddWithValue in SqlDataAdapter
尝试使用参数化查询,它将避免错误和 sql 注入
获得 reader 后,您可以使用 HasRow()
检查是否返回了记录
string conString = "xxxxxxxxxxxxxxxxxxxxxxxx";
using (SqlConnection con = new SqlConnection(conString))
{
con.Open();
using (var cmd = new SqlCommand(
"SELECT * FROM Login Where Username=@Username AND Password=@Password",
con))
{
cmd.Parameters.AddWithValue("@Username", txtUsername.Text);
cmd.Parameters.AddWithValue("@Password", txtPassword.Text);
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRow())
{
if(reader.Read())
{
var username = reader["Username"].ToString();
}
}
else
{
//User does not exists
}
}
}
}
您将需要导入一些库:
using System;
using System.Data;
using System.Data.SqlClient;