使用参数化查询 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;