C# SqlException未处理,语法不正确
在对sqlserver管理执行查询时,我遇到以下问题: System.Data.dll中发生类型为“System.Data.SqlClient.SqlException”的未处理异常 其他信息:“u”附近的语法不正确 代码如下:C# SqlException未处理,语法不正确,c#,sql-server,C#,Sql Server,在对sqlserver管理执行查询时,我遇到以下问题: System.Data.dll中发生类型为“System.Data.SqlClient.SqlException”的未处理异常 其他信息:“u”附近的语法不正确 代码如下: 函数:public static Alumno ObtenerUsuario(字符串usuarionumero) 它来自: public static Alumno ObtenerUsuario(string prfid) { i
函数:
public static Alumno ObtenerUsuario(字符串usuarionumero)
它来自:
public static Alumno ObtenerUsuario(string prfid)
{
int dato_numerico;
int informacion_de_estado_2 = 0;
while (prfid.Contains(""))
{
prfid = "123456789012";
}
while (prfid.Contains(""))
{
prfid = "123456789012";
}
while (prfid.Contains("~"))
{
prfid = "123456789012";
informacion_de_estado_2 = 1; // 1 = Acceso Denegado 0 = Acceso permitido para el registro
}
while (prfid.Contains("¢")) //¢
{
prfid = "123456789012";
informacion_de_estado_2 = 1; // 1 = Acceso Denegado 0 = Acceso permitido para el registro
}
using (SqlConnection conexion = BDComun.ObtnerCOnexion())
{
Alumno pAlumno = new Alumno();
SqlCommand comando = new SqlCommand(string.Format(
"Select Id, Nombre, Apellido, Usuario, Cargo, Celular, rfid, Fecha_Nac, Empresa_contratista from Alumnos where rfid = {0}", prfid), conexion);
////try
////{
SqlDataReader reader = comando.ExecuteReader();
//}
//catch (Exception exp)
//{
// // MessageBox.Show("Por favor inicia registros para habilitar el control.", "Iniciar registros", MessageBoxButtons.OK, MessageBoxIcon.Information);
//}
while (reader.Read())
{
pAlumno.Id = reader.GetString(0);
pAlumno.Nombre = reader.GetString(1);
pAlumno.Apellido = reader.GetString(2);
pAlumno.Usuario = reader.GetString(3);
pAlumno.Cargo = reader.GetString(4);
pAlumno.Celular = reader.GetString(5);
pAlumno.rfid = reader.GetString(6);
pAlumno.Fecha_Nac = reader.GetString(7);
pAlumno.Empresa_contratista = reader.GetString(8);
// pAlumno.Fecha_Nac = Convert.ToString(reader.GetDateTime(7));
}
conexion.Close();
return pAlumno;
}
}
如何解决此问题?将参数直接附加到命令文本中是一种不好的做法,会使自己容易受到SQL注入的影响。 您可以将变量
usuarionumero
添加为如下参数
SqlCommand comando = new SqlCommand("Select Id, Nombre, Apellido, Usuario, Cargo, Celular, rfid, Fecha_Nac, Estado, Check_acceso, Empresa_contratista from Alumnos where Id=@Id");
cmd.Parameters.AddWithValue("@id", usuarionumero );
这应该可以通过在生成的SQL中转义
usuarionumero
中的特殊字符来解决您的问题将参数直接附加到命令文本中是一种不好的做法,您会使自己容易受到SQL注入的影响。
您可以将变量usuarionumero
添加为如下参数
SqlCommand comando = new SqlCommand("Select Id, Nombre, Apellido, Usuario, Cargo, Celular, rfid, Fecha_Nac, Estado, Check_acceso, Empresa_contratista from Alumnos where Id=@Id");
cmd.Parameters.AddWithValue("@id", usuarionumero );
如果出于任何原因,您决定不使用Alex Buyny所述的参数,则可以通过在生成的SQL中转义
通常为Numero
中的特殊字符来解决问题,内联查询的实际语法错误似乎是您忘记在where子句中使用的值周围添加单引号,如下所示:
SqlCommand comando = new SqlCommand(String.Format("Select Id, Nombre, Apellido, Usuario, Cargo, Celular, rfid, Fecha_Nac, Estado, Check_acceso, Empresa_contratista from Alumnos where Id='{0}'", usuarionumero), conexion);
请注意,我已将Id={0}
更改为Id='{0}'
然而,正如Alex提到的,以这种方式进行查询可能会导致SQL注入攻击。例如,考虑如果有人调用了你的方法,并通过了类似的代码,比如<代码>用户名>代码>:< /P>
null'; drop table Alumnos where '1' = '1
正如您所看到的,这可能会导致灾难性的结果。如果出于任何原因,您决定不使用Alex Buyny所描述的参数,那么内联查询的实际语法错误似乎是您忘记在where子句中使用的值周围添加单引号,如下所示:
SqlCommand comando = new SqlCommand(String.Format("Select Id, Nombre, Apellido, Usuario, Cargo, Celular, rfid, Fecha_Nac, Estado, Check_acceso, Empresa_contratista from Alumnos where Id='{0}'", usuarionumero), conexion);
请注意,我已将Id={0}
更改为Id='{0}'
然而,正如Alex提到的,以这种方式进行查询可能会导致SQL注入攻击。例如,考虑如果有人调用了你的方法,并通过了类似的代码,比如<代码>用户名>代码>:< /P>
null'; drop table Alumnos where '1' = '1
如您所见,这可能会导致灾难性的结果。您得到stacktrace了吗?当您得到错误时变量
usuarinumero
的值是多少?您得到stacktrace了吗?当您得到错误时变量usuarinumero
的值是多少?