2016-09-09 6 views
-1

データベース内のデータを検索してデータテーブルに入れたいが、データが返されなかったのでSQLコマンドが正しくないように思える。助けてください。前もって感謝します。以下は私のコードです。SQLでデータを検索

 protected DataTable SearchResident(String name, String ConnStr) 
    { 
     DataTable dt = new DataTable(); 

     try 
     { 
      SqlCommand cmd; 

      using (SqlConnection con = new SqlConnection(ConnStr)) 
      { 
       con.Open(); 

       String SQL = "SELECT ID, LastName, FirstName, MiddleName, Gender, BirthDate, CivilStatus, " + 
        "Citizenship, MobileNo, Landline, PermanentAddress, Address FROM Residents " + 
        "WHERE FirstName LIKE '%name%' OR LastName LIKE '%name%'"; 

       using (cmd = new SqlCommand(SQL, con)) 
       { 
        using (SqlDataReader sdr = cmd.ExecuteReader()) 
        { 
         dt.Load(sdr); 
        } 
       } 
      } 
      return dt; 
     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 
    } 
+0

、私は通常、SQL Serverに付属SQL Server Management Studioを(SSMS)を使用し、私のC#のコードにクエリを追加する前に、私のクエリをテストします。 SSMSは本当に使いやすく、クエリのエラーを見つけ出すのに適しています。 – jdweng

+1

またはこれが文字列SQL = string.Format(「SELECT ID、名字、名字、ミドルネーム、性別、生年月日、CivilStatus」+ 「市民権、MobileNo、固定電話、固定電話アドレス、居住者からの住所」+ 「WHERE FirstName LIKE」 %{0}% 'または姓%LIKE'%{0}% '"、名前); – jdweng

+0

あなたはSqlCommandを設定するのを忘れました – Kushan

答えて

-1

あなたはこのように使用することができます:

protected DataTable SearchResident(String name, String ConnStr) 
{   
    try 
    { 
     String SQL = "SELECT ID, LastName, FirstName, MiddleName, Gender, BirthDate, CivilStatus, " + 
        "Citizenship, MobileNo, Landline, PermanentAddress, Address FROM Residents " + 
        "WHERE FirstName LIKE '%@name%' OR LastName LIKE '%@name%'"; 

     using (SqlConnection sqlConn = new SqlConnection(ConnStr)) 
     using (SqlCommand cmd = new SqlCommand(SQL, sqlConn)) 
     { 
      cmd.Parameters.AddWithValue("@name", name); 

      sqlConn.Open(); 
      DataTable dt = new DataTable(); 
      dt.Load(cmd.ExecuteReader()); 

      return dt; 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

もう一つの提案は、あなたがSQLインジェクションを招いています。パラメータ化されたストアドプロシージャを使用してください。

+0

パラメータを使用するように変更する –

0

次のSQLコマンドを必要とし、パラメータとして名前を追加する: -

using (SqlConnection con = new SqlConnection(ConnStr)) 
      { 
       con.Open(); 

       String SQL = "SELECT ID, LastName, FirstName, MiddleName, Gender, BirthDate, CivilStatus, " + 
        "Citizenship, MobileNo, Landline, PermanentAddress, Address FROM Residents " + 
        "WHERE FirstName LIKE '%@name%' OR LastName LIKE '%@name%'"; 
       var cmd = new SqlCommand(SQL, connection); 
       cmd.Parameters.Add("@name", SqlDbType.Text); 
       cmd.Parameters["@name"].Value = name; 
       using (SqlDataReader sdr = cmd.ExecuteReader()) 
       { 
        dt.Load(sdr); 
       } 
      } 
+0

まだ何も返されませんでした。 –

1

あなたはstring SQLに要求を書いていますが、あなたのコードでは使用しないでください。例SQLクエリ:

class SQLQuery 
{ 
    public static DataSet SQLGetData(string ConnectionString, string commandString) 
    {    
     DataSet DS = new DataSet(); 
     DataTable DT = new DataTable("Table1"); 
     DS.Tables.Add(DT); 

     using (SqlConnection connection = new SqlConnection(ConnectionString)) 
     {    
      try 
      { 
       connection.Open(); 
       SqlCommand command = new SqlCommand(commandString, connection); 
       //command.CommandTimeout = 3000; 
       SqlDataReader read = command.ExecuteReader(); 

       DS.Load(read, LoadOption.PreserveChanges, DS.Tables[0]); 
      } 
      catch (SqlException e) 
      { 
       System.Windows.Forms.MessageBox.Show(e.Message); 
      } 
      finally 
      { 
       connection.Close(); 
      }    
     } 
     return DS; 
    } 
} 

とデータ取得:

private DataTable SearchData (string name) 
{ 
    DataTabel dt = new DataTable(); 

    string connStr; // connection string 
    string command = "SELECT ID, LastName, FirstName, MiddleName, Gender, BirthDate,"+ 
        "CivilStatus, Citizenship, MobileNo, Landline, PermanentAddress,"+ 
        "Address FROM Residents WHERE FirstName LIKE '" + name + 
        "' OR LastName LIKE '" + name + "'"; 

    dt = SQLQuery.SQLGetData(connStr, command).Tables[0]; 
    return dt; 
} 
+0

これについては、SQLインジェクションが発生する可能性があります –

+0

はい、SQLインジェクションが発生しやすく、 '%'記号を忘れてしまいました。 –