选择语句:列名无效,在 C# 中使用 Dapper

Posted

技术标签:

【中文标题】选择语句:列名无效,在 C# 中使用 Dapper【英文标题】:Select statement: Invalid column name, in C# using Dapper 【发布时间】:2020-08-07 07:47:36 【问题描述】:

这是我的数据库的模型类

public class Person

    public int id  get; set; 

    public string FirstName  get; set; 
    public string LastName  get; set; 
    public string Email  get; set; 
    public string PhoneNumber  get; set; 
    public string Fullinfo 
     
        get
        
            return FirstName + " " + LastName + " " + Email;

        
    

这里是主类

public partial class DashBoard : Form

    List<Person> persons =new List<Person>();
    public DashBoard()
    
        InitializeComponent();
        Updated();
    

    public void Updated()
    
        PeopleFoundListbox.DataSource = persons;
        PeopleFoundListbox.DisplayMember = "Fullinfo";
    

    public void Searchpeoplebutton_Click(object sender, EventArgs e)
    
        persons = Getpeople(Lastnametextbox.Text);
        Updated();

    

    public List<Person> Getpeople(string searchname)
            
        using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.Cnn("peopleDb"))) 
        
            var output = connection.Query<Person>("select * from People where Lastname= " + searchname).ToList();
            return output;
                 
    

我想根据姓氏选择记录 我有一行以 david 作为姓氏,但是当我在文本框中输入 david 并进行搜索时,我会收到此错误

无效的列名大卫

【问题讨论】:

SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入 - 查看Little Bobby Tables 【参考方案1】:

你忘记了单引号。

要添加到 GMB 的答案以防止 SQL 注入,您可以使用匿名变量:

   var output = connection.Query<Person>(
    "select * from People where Lastname= @lastname", new lastname = lastnamevariable
).ToList();

【讨论】:

【参考方案2】:

基本上,您的查询缺少搜索名称周围的单引号。

这个:

var output = connection.Query<Person>(
    "select * from People where Lastname= " + searchname
).ToList();

应该是:

var output = connection.Query<Person>(
    "select * from People where Lastname= '" + searchname + "'"
).ToList();

在没有单引号的情况下,SQL Server 将文字字符串视为列名,因此您收到的错误。

【讨论】:

这为sql注入创造了可能性。使用参数:learndapper.com/parameters

以上是关于选择语句:列名无效,在 C# 中使用 Dapper的主要内容,如果未能解决你的问题,请参考以下文章

列名无效是啥意思?

sql2008提示“列名无效”,但是能正常查询

C# Dapper缓存问题?

为啥实体框架在直接选择语句中的执行速度比 Dapper 快 [关闭]

C# 中的“无效列名”

C#无效列名问题但与其他不同