我尝试读取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。我怎样才能做到这一点?此致
答案 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;拥有撇号和一些恶意黑客代码,并且您授予外部实体访问您的数据库的权限。如果你不期望这个领域是用户提供的,或者不是这样的话,那就不要这样做 - 这是一个坏习惯,它会导致可怕的安全漏洞。
相反,您应该始终使用以下之一:
好的,那么说了什么?
请记住,变量可以包含一组事物。通常,如果您希望在单个变量中包含表格?它通常看起来像:
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注入安全的,而且它更具可扩展性,并且实际上对数据库更友好(编译一次) ,执行许多)。
最后,如果要撤回多个字段,请创建数据(域)对象,并将结果作为该对象的列表。如果您需要一个例子,请随时询问。