C# SqlException未处理,语法不正确

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

在对sqlserver管理执行查询时,我遇到以下问题:

System.Data.dll中发生类型为“System.Data.SqlClient.SqlException”的未处理异常

其他信息:“u”附近的语法不正确

代码如下:



函数:
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
的值是多少?