使用参数化查询进行返工C#

时间:2015-09-24 02:47:35

标签: c# sql sql-server parameterized-query

有很多关于参数化查询的教程,但大多数都涉及使用SqlCommand,我的代码接受的唯一事情就是SqlDataAdapter我的SQL命令,只要我尝试将其实例化为{ {1}}我收到错误。

TL; DR
我或者需要有关如何使用参数化查询重新编写此内容的指导,或者我需要知道为什么SqlCommand行不能用作SqlDataAdapter行。

SqlCommand

3 个答案:

答案 0 :(得分:2)

您可以使用:

   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;
    }

对于您的密码,请记住使用哈希算法

此代码未经过测试。如果你想获得最佳性能,你可以探索执行标量。

答案 1 :(得分:1)

您可以在SqlDataAdapter中使用Parameters.AddWithValue

    sda.SelectCommand.Parameters.AddWithValue("@ParamName",value);

请检查:c# Using Parameters.AddWithValue in SqlDataAdapter

答案 2 :(得分:1)

尝试使用参数化查询,它将避免错误和SQL注入 获得阅读器后,您可以使用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;