将查询结果存储到对象中

时间:2017-11-22 18:20:20

标签: c# sql asp.net

我尝试读取sql表并将所有内容加载到变量

代码:

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

我想将所有数据存储到变量var tmpPerfiles中作为对象。

我可以做类似的事情:

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

但我不能两次打电话给tmpPerfiles。我怎样才能做到这一点?此致

4 个答案:

答案 0 :(得分:1)

e.g。 使用dto将其存储到列表中

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);
}    

所以你有几个对象存储在列表中

答案 1 :(得分:1)

好的,首先:停止!不要像这样编写SQL查询。 SQL注入攻击仍然是安全漏洞和漏洞的首要原因(根据OWASP),它完全是由编写这样的SQL语句的人造成的。

永远不要编写如下的SQL语句:

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

...因为所需要的只是那个&#39; somevar&#39;拥有撇号和一些恶意黑客代码,并且您授予外部实体访问您的数据库的权限。如果你不期望这个领域是用户提供的,或者不是这样的话,那就不要这样做 - 这是一个坏习惯,它会导致可怕的安全漏洞。

相反,您应该始终使用以下之一:

  • 带参数化输入的存储过程。 Aka,dbo.usp_FindUser, 它接受@userName,proc有WHERE name = @userName
  • 参数化Sql命令。 Aka,使用&#34;选择*创建一个SqlCommand 来自someTable的东西,其中userName = @ userName&#34;,然后 将参数添加到userName的SqlCommand,以及值为what 用户,你正在寻找。

好的,那么说了什么?

请记住,变量可以包含一组事物。通常,如果您希望在单个变量中包含表格?它通常看起来像:

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

......有意义吗?您每列有一个变量,您可以将其分组到一个类中。该类的一个实例表示一个数据行。然后是List&lt;&gt;该类的代表表示该表的多行(或仅表示整个表本身。)

通常,跟随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变量中。

答案 2 :(得分:0)

如果您使用的是EntityFramework,这非常简单。在为对象(包含所有字段)设置类之后,只需使用linq获取对象。

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

答案 3 :(得分:0)

如果你想要做的就是从数据库获取值并将它们放入某些东西,那么我认为引入数据表是过度的。虽然实现很容易,但会增加开销。我选择使用DbDataReader

这是一个提取单个字段,然后将其添加到列表中的示例。

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();

您引用了两个字段,但由于UsuarioID是在where子句中定义的,因此似乎没有必要将其拉回来。

另外,正如@DotNetDev所提到的,不要使用文字...参数的使用不仅是SQL注入安全的,而且它更具可扩展性,并且实际上对数据库更友好(编译一次) ,执行许多)。

最后,如果要撤回多个字段,请创建数据(域)对象,并将结果作为该对象的列表。如果您需要一个例子,请随时询问。