首页 > 解决方案 > System.Data.SqlClient.SqlException:“列名 'e' 无效。” | 数据库错误

问题描述

我为我的项目使用数据库数据,当我在 Textbox1 中键入一个字母时,应用程序崩溃并出现错误:

System.Data.SqlClient.SqlException:“列名 'e' 无效。”

数据库名称是带有“Id”和“altitudes”的表,Id 是 varchar,altitudes 是 nchar。

这就是我希望它的工作方式:在 name.Text 中键入名称,在数据库中搜索名称并将指定的高度粘贴到 Altitude.Text 中。高度是数字,名称是数据库中的字母。

我的代码中的错误在哪里?(数据源故意留白)

        {
            String source = @"Data Source=";
            SqlConnection con = new SqlConnection(source);
            con.Open();

            String sqlSelectQuery = "SELECT * FROM [Table] WHERE ID ="+char.Parse(name.Text);
            SqlCommand cmd = new SqlCommand(sqlSelectQuery, con);
            SqlDataReader dr = cmd.ExecuteReader();
            if (dr.Read())
            {
                altitude.Text = (dr["altitudes"].ToString());
            }
            con.Close();
        }

标签: c#databasewindows-forms-designer

解决方案


您永远不应该连接输入来创建 SQL。它非常脆弱,容易受到 SQL 注入和 i18n/l10n 问题(值的格式)的影响。很多坏事。

解决方案应该始终是:参数。

例如:

const string sqlSelectQuery = "SELECT * FROM [Table] WHERE ID = @id";
using SqlCommand cmd = new SqlCommand(sqlSelectQuery, con);
cmd.Parameters.AddWithValue("@id", name.Text);
// Etc

或者更容易使用像 Dapper 这样的工具:

var alt = con.QuerySingleOrDefault<string>(
    "SELECT altitudes FROM [Table] WHERE ID = @id",
    new { id = name.Text });

推荐阅读