2017-11-22 15 views
-1

に私は、SQLテーブルを読み込み、変数ストアクエリ結果オブジェクト

コードにすべてをロードしよう:私はオブジェクトとして変数var tmpPerfilesにすべてのデータを格納したい

String query2 = ""; 
    query2 = String.Format("SELECT * FROM Seguridad.UsuarioPerfil WHERE UsuarioID = {0}", UsuarioID); 
       SQLService sqlservice2 = new SQLService(); 
       DataTable reader2 = sqlservice.Leer(query2); 

私のような何かを行うことができます:

var tmpPerfiles =""; 
foreach (DataRow row in reader.Rows) 
       { 
        tmpPerfiles = row["UsuarioId"].ToString(); 
        tmpPerfiles = row["PerfilId"].ToString(); 
       } 

しかし、私はtmpPerfilesを2回呼び出すcan't。それをどうすれば実現できますか?よろしくお願いします。

+4

私はあなたの質問に答えることはできませんが、実際には私はあなたに良いヒントを与えることができます。 Plzはこの種のSQLクエリ作成を使用しません。あなたはSQLインジェクションのリスクが高いです。 msdn https://msdn.microsoft.com/en-us/library/ff648339.aspx – DotNetDev

答えて

1

大丈夫、最初の:停止!このようなSQLクエリは書かないでください。 SQLインジェクション攻撃は、依然としてセキュリティ侵害と脆弱性(OWASPごと)の第1位の原因です。これは、このようなSQL文を書く人々によってのみ引き起こされます。それが取るすべてはアポストロフィと一部の悪質なハッキングコードを持っているために、その「SOMEVAR」のためである、とあなたが外部エンティティへのアクセスを許可しているので...

statement = "SELECT something from sometable where " + someVar ... 

、これまでのようなSQL文を書くことはありませんあなたのデータベースに。フィールドがユーザー提供などになることを期待していない場合は、それを実行しないでください - それは悪い習慣であり、恐ろしいセキュリティ違反につながります。パラメータ化された入力を備えた

  • ストアドプロシージャ:

    代わりに、あなたは常に次のいずれかを使用する必要があります。別名、dbo。usp_FindUser、 は@userNameを受け取り、procはWHERE name = @userNameを持っています

  • パラメータ化されたSQLコマンド。 akaは、 "select * from someTable from userName = @userName"というSqlCommandを作成し、次に というuserNameのSqlCommandにパラメータを追加し、何の値をあなたが探しているのかを指定します。

よろしいですか?

変数には物事のグループを含めることができます。一般的に、単一の変数内にテーブルを含める場合は、通常は次のようになります:

string x, int y, string z - fields within the Database 
Class dataRecord - a class, which contains string x, int y, string z. 
List<dataRecord> - a list of instances of a dataRecord class 

...意味がありますか?列ごとに1つの変数があり、それをクラスにグループ化します。クラスの1つのインスタンスは1つのデータ行を表します。 (または単に全体テーブル自体):

そして、そのクラスの一覧<>そのテーブルの複数の行を表し

通常、SRPを次の(それがEntityFrameworkを使用していない)のコードは次のようになります

List<myFancyClass> tableEntries = new List<myFancyClass>(); 
foreach (DataRow dr in myDataTable.Rows) 
{ 
    myFancyClass line = new myFancyClass(dr); // constructor that takes in a DataRow 
    tableEntries.Add(line); 
} 

...その時点で、テーブルはtableEntries変数に格納されます。

0

EntityFrameworkを使用している場合、これは本当に簡単です。オブジェクトのクラス(すべてのフィールドを含む)を設定したら、linqを使ってオブジェクトを取得してください。

var myData = UsuarioPerfil.Where(e => e.UsuarioID == UsuarioID).FirstorDefault(); 
1

は、あなたがしたいすべてがデータベースから値を取得し、何かに入れている場合ので、あなたがリスト

+1

を参照してくださいこれは私の答えで参照した "データ/ドメインオブジェクト"の素晴らしい例です – Hambone

0

内に保存された複数のオブジェクトを持つリスト

private class TmpDto { 
    string UsuarioId { get; set;} 
    string PerfilId { get; set;} 
} 

var Ilist<TmpDto> list = new List<TmpDto>(); 
foreach (DataRow row in reader.Rows) 
{ 
    var dto = new TmpDto(); 
    dto.UsuarioId = row["UsuarioId"].ToString(); 
    dto.UsuarioId = row["PerfilId"].ToString(); 
    list.Add(dto); 
}  

にそれを格納するためにDTOを使用します私はデータテーブルの導入が過度のものだと思っています。実装は簡単ですが、オーバーヘッドが増えます。私は代わりにDbDataReaderを使用することを選ぶだろう。

これは、1つのフィールドを抽出し、それをリストに追加する例です。

List<string> results = new List<string>(); 

String query2 = "SELECT PerfilId FROM Seguridad.UsuarioPerfil WHERE UsuarioID = @USARIO"; 
SqlCommand cmd = new SqlCommand(query2, connection); 
cmd.Parameters.Add(new SqlParameter("@USARIO", SqlDbType.VarChar)); 
cmd.Parameters[0].Value = UsuarioID; 

SqlDataReader reader = cmd.ExecuteReader(); 

while (reader.Read()) 
{ 
    results.Add(reader.GetString(0)); 
} 

reader.Close(); 

次の2つのフィールドを参照しますが、UsuarioIDはWHERE句で定義されていたので、それを引き戻す必要がいないようでした。

また、@DotNetDevは、リテラルを使用しないでください...パラメータの使用はSQLインジェクションセーフですが、スケーラビリティが高く、実際にデータベースに優しい(コンパイル、一回実行、多数実行)

最後に、複数のフィールドを元に戻したい場合は、データ(ドメイン)オブジェクトを作成し、結果をそのオブジェクトのリストにします。例が必要な場合は、お気軽にお問い合わせください。