【问题标题】:How to solve invalid column name? [closed]如何解决无效的列名? [关闭]
【发布时间】:2016-05-31 20:02:17
【问题描述】:

我有一个Database named: "alumno",其中包含以下列:

"rut" (varchar 30) PK
"nombre" (varchar 30)
"apellido" (varchar 30)
"fechaN" (varchar 15)

它们都具有非空函数。

每当我输入字母时,我都会收到一个 SQLException,说“fechaN”列的名称无效,但如果我输入数字,它运行得很好。这是我的代码:

public Boolean insertar(SqlConnection x, alumno a) {
 String query = "INSERT INTO alumno (rut, nombre, apellido, fechaN) VALUES ('" + a.Rut + "','" + a.Nombre + "','" + a.Apellido + "'," + a.Fecha + ")";
 comando = new SqlCommand(query, x);

 int saber = comando.ExecuteNonQuery();

 if (saber > 0) {
  return true;
 }

 return false;
}


con = new conexion();
SqlConnection x = con.conectar();

String rut = txtRut.Text.Trim();
String nombre = txtNombre.Text.Trim();
String apellido = txtApellido.Text.Trim();
String fecha = txtfecha.Text.Trim();

alumno a = new alumno(rut, nombre, apellido, fecha);

try {
 if (a.insertar(x, a)) {
  MessageBox.Show("Ok");
 } else {
  MessageBox.Show("Error...");
 }
} catch (SqlException ex) {
 MessageBox.Show("..." + ex.Message);
}

}

con.desconectar();
x = null;

【问题讨论】:

  • “alumno”表的架构是什么?
  • 您是否有一些带有嵌入单引号的值(例如名词)
  • 您肯定想要使用参数化查询。它会让你的生活更轻松,而且它更加更加安全..
  • 您在查询中缺少两个单引号:...,'" + a.Fecha + "').... 请使用参数化查询。
  • 这就是为什么你永远不应该使用连接字符串构建查询的原因。如果你使用Sql Server,也可以使用参数创建一个存储过程它更干净

标签: c# sql


【解决方案1】:

正如用户 Jeroen Heier 在 cmets 中指出的那样。我错过了一个 '

这是最后的查询

String query = "INSERT INTO alumno (rut, nombre, apellido, fechaN) VALUES ('" + a.Rut + "','" + a.Nombre + "','" + a.Apellido + "','" + a.Fecha + "')";
         comando = new SqlCommand(query, x);

使用参数化查询:

String query = "INSERT INTO alumno (rut, nombre, apellido, fechaN) VALUES (@rut,@nombre,@apellido,@fechaN)";
         comando = new SqlCommand(query, x);

         comando.Parameters.AddWithValue("@rut", this.rut);
         comando.Parameters.AddWithValue("@nombre", this.nombre);
         comando.Parameters.AddWithValue("@apellido", this.apellido);
         comando.Parameters.AddWithValue("@fechaN", this.fecha);

【讨论】:

  • 好吧,这将在今天拯救你,但只是为了好玩,尝试插入一个包含单引号的名词的 alumno(例如 O'Hara)
  • 是的,出现错误。老师教我的蹩脚方法。
  • 这还不是全部。 Sql 注入是一个更大的问题。让您的用户输入直接在您的查询中输入的内容对您的客户来说可能是非常昂贵的。 This famous comic 解释清楚。使用参数化查询。总是向你的老师展示这个问题
【解决方案2】:

您没有提到 rdbms,但看起来是区分大小写的,因此您的字段名称使用双引号,与您的创建表相同。或者将表格中的字段名改为小写为"fechan"

"fechaN" (varchar 15)

"INSERT INTO alumno (rut, nombre, apellido, fechaN)
                                            ^^^^^^

是的,改用参数,你很容易受到 Sql Injection https://xkcd.com/327/

【讨论】:

  • SqlConnection 是关于 rdbms 的强烈提示。
【解决方案3】:
String query = "INSERT INTO alumno (rut, nombre, apellido, fechaN) VALUES     ('" + a.Rut + "','" + a.Nombre + "','" + a.Apellido + "'," + a.Fecha + ")";

尝试不使用单引号:

String query = "INSERT INTO alumno (rut, nombre, apellido, fechaN) 
                VALUES (" + a.Rut + "," + a.Nombre + "," + a.Apellido + ","   
                        + a.Fecha + ")";

【讨论】:

  • nobre 因为所有其他字段都是 varchar 字段。没有引号你只能传递数字
  • @Steve 这些人从来没有写过 SQL 插入语句吗?我对这些答案感到震惊。我要丢分了!!
  • 只是不要去任何讨论法律的论坛。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2018-09-07
  • 2018-07-13
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多