簡體   English   中英

SqlException未處理,語法錯誤

[英]SqlException was unhandled, incorrect syntax

在sqlserver管理上執行查詢時遇到以下問題:

System.Data.dll中發生了類型為'System.Data.SqlClient.SqlException'的未處理的異常

附加信息:'u'附近的語法不正確。

代碼如下:


public static Alumno ObtenerUsuario(String usuarionumero)
        {
            //long Id_int;
            //Id_int = Convert.ToInt64(pId);
            using (SqlConnection conexion = BDComun.ObtnerCOnexion())
            {

                Alumno pAl = new Alumno();
                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);

                SqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    pAl.Nombre = reader.GetString(1);
                    pAl.Apellido = reader.GetString(2);
                    pAl.Usuario = reader.GetString(3);
                    pAl.Cargo = reader.GetString(4);
                    pAl.Celular = reader.GetString(5);
                    //pAl.rfid = reader.GetString(6);
                    pAl.Fecha_Nac = reader.GetString(7);
                    pAl.Estado = reader.GetString(8);
                    pAl.Check_acceso = reader.GetString(9);
                    pAl.Empresa_contratista = reader.GetString(10);
                }
                conexion.Close();
                return pAl;

            }
        }

函數: public static Alumno ObtenerUsuario(String 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內的特殊字符來解決您的問題

如果由於某種原因,您決定不想使用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注入攻擊。 例如,考慮如果有人調用了您的方法並為usuarionumero傳遞了類似的內容,會發生什么情況:

null'; drop table Alumnos where '1' = '1

如您所見,這可能會導致災難性的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM