繁体   English   中英

System.Data.SqlClient.SqlException:无效的列名(行命令出错。ExecuteNonQuery();)

[英]System.Data.SqlClient.SqlException: Invalid column name (Error at line command.ExecuteNonQuery();)

所以我一直收到那个错误。 我不确定问题是否出在 SQL 服务器上。 此代码用于将数据插入数据库。

发送帮助。

我在执行代码时收到此消息

private void registracija_btn_Click(object sender, EventArgs e)                        
{
        string RegistracijaUporabnisko = RegistracijaUporabnisko_txt.Text;
        string RegistracijaGeslo = RegistracijaGeslo_txt.Text;
        string RegistracijaMail = RegistracijaMail_txt.Text;

            try
            {
                string queryReg = "INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) " +
                     "VALUES(" + RegistracijaUporabnisko + ", " + RegistracijaGeslo + ", " + RegistracijaMail + ")";

                using (SqlCommand command = new SqlCommand(queryReg, con))
                {
                    con.Open();
                    command.ExecuteNonQuery();
                    con.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Napaka: " + ex);
            }

    }

参数(如下)修复了这个问题和一系列其他问题,包括 SQL 注入、i18n/l10n 等。您可能只是输入了一个列名,在这种情况下我们无法帮助您因为我们不知道真名。

string queryReg = "INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) " +
     "VALUES(@uporabnisko_ime, @geslo, @email)";

using (SqlCommand command = new SqlCommand(queryReg, con))
{
    con.Open();
    command.Parameters.AddWithValue("@uporabnisko_ime", RegistracijaUporabnisko_txt.Text);
    command.Parameters.AddWithValue("@geslo", RegistracijaGeslo_txt.Text);
    command.Parameters.AddWithValue("@email", RegistracijaMail_txt.Text);
    con.Close();
}

我也从不厌倦推荐像 Dapper 这样的工具来做这样的事情:

con.Execute("INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) " +
     "VALUES(@uporabnisko_ime, @geslo, @email)", new {
    uporabnisko_ime = RegistracijaUporabnisko_txt.Text,
    geslo = RegistracijaGeslo_txt.Text,
    email = RegistracijaMail_txt.Text });

它完成所有工作,包括(如果需要)连接打开/关闭、命令构造、参数打包等。

让我们看看你的代码:

      string queryReg = "INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) " +
             "VALUES(" + RegistracijaUporabnisko + ", " + RegistracijaGeslo + ", " + RegistracijaMail + ")";

        using (SqlCommand command = new SqlCommand(queryReg, con))
        {
            con.Open();
            command.ExecuteNonQuery();
            con.Close();
        }

好的,如果RegistracijaUporabnisko的值为 Rok, RegistracijaGeslo的值为 Rok, RegistracijaMail的值为 Rok@home .. 你的字符串现在是什么样子的?

 string queryReg = "INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) VALUES(Rok,Rok,Rok@home)";

它将寻找的 Rok 是一个字段,而不是一个值。 因此它说无效的列。

那么,如果你以一种普遍采用的方式来做呢?

  string queryReg = "INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) VALUES(@RegistracijaUporabnisko ,@RegistracijaGeslo ,@email)";

    using (SqlCommand command = new SqlCommand(queryReg, con))
    {
        command.Parameters.AddWithValue("@RegistracijaUporabnisko ", RegistracijaUporabnisko );
        command.Parameters.AddWithValue("@RegistracijaGeslo ", RegistracijaGeslo );
        command.Parameters.AddWithValue("@email", email);
        con.Open();
        command.ExecuteNonQuery();
        con.Close();
    }

现在会发生什么? 好吧,在幕后输入的文本是用引号括起来的,日期以适当的格式发送,数字所有这些都为您处理。 它可以保护您免受注射,因此如果我输入了"; drop table uporabnik2的名称,您就不会发现自己丢失了表格等。

尝试

string queryReg = "INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) " +
                     "VALUES('" + RegistracijaUporabnisko + "', '" + RegistracijaGeslo + "', '" + RegistracijaMail + "')";

一般来说,你只需要将字符串类型数据的值括起来,但是为了安全起见,总是将值括在插入语句中的单引号中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM