以下是从mysql表中进行选择的方法。但是我觉得它不是很有活力。来自PHP,我所做的就是向函数发送查询并在变量中接收其数据。这似乎不再是这种情况了。
我的查询差异很大。有时他们只得到一行一列。下次它可能会收集1000行和所有列。使用列表的方式不是很动态,我不希望为每种可能的场景构建一个select方法。
我希望运行我的查询,返回数据并让我用它做我想做的事。
public List<string>[] Select(string query)
{
//Create a list to store the result
List<string>[] list = new List<string>[3];
list[0] = new List<string>();
//Open connection
if (this.OpenConnection() == true)
{
//Create Command
MySqlCommand cmd = new MySqlCommand(query, connection);
//Create a data reader and Execute the command
MySqlDataReader dataReader = cmd.ExecuteReader();
//Read the data and store them in the list
while (dataReader.Read())
{
list[0].Add(dataReader["id"] + "");
list[1].Add(dataReader["name"] + "");
list[2].Add(dataReader["age"] + "");
}
//close Data Reader
dataReader.Close();
//close Connection
this.CloseConnection();
//return list to be displayed
return list;
}
else
{
return list;
}
}
谢谢!
答案 0 :(得分:1)
看一下ExpandoObject。或者对于较旧的.NET,请使用Dictionary或HashMap。
您可以从Select()方法返回List。在方法内部,您可以遍历DataReader的字段,将它们映射到我提到的对象类型之一。
如何遍历数据阅读器的列 -
how can i loop through all of the columns of the OracleDataReader
如何在运行时按名称向ExpandoObject添加属性
Adding unknown (at design time) properties to an ExpandoObject
public List<dynamic> Select(string sql) {
var list = new List<dynamic>();
// ... your code to connect to database, execute sql as datareader ...
// I recommend you Google the using statement, and use that to dispose
// your connection and reader
while (dataReader.Read())
{
var obj = new ExpandoObject();
var d = obj as IDictionary<String, object>;
for( int index = 0; index < reader.FieldCount; index ++ )
d[ reader.GetName( index ) ] = reader.GetString( index );
list.Add(obj);
}
return list;
}
虽然不是这个问题的范围,但您应该使用using语句,而不是像人们经常那样明确地关闭连接或在finally块中处理读者。
答案 1 :(得分:0)
从this my sql tutorial提取此信息,认为您要做的是返回数据集或数据表。
这只是一个例子,需要改变才能在你的方法中工作,应该给你你需要的东西
string cs = @"server=localhost;userid=user12;
password=34klq*;database=mydb";
MySqlConnection conn = null;
try
{
conn = new MySqlConnection(cs);
conn.Open();
string stm = "SELECT * FROM Authors";
MySqlDataAdapter da = new MySqlDataAdapter(stm, conn);
DataSet ds = new DataSet();
da.Fill(ds, "Authors");
DataTable dt = ds.Tables["Authors"];
dt.WriteXml("authors.xml");
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn col in dt.Columns)
{
Console.WriteLine(row[col]);
}
Console.WriteLine("".PadLeft(20, '='));
}
} catch (MySqlException ex)
{
Console.WriteLine("Error: {0}", ex.ToString());
} finally
{
if (conn != null)
{
conn.Close();
}
}
答案 2 :(得分:0)
您是否考虑使用像NPoco这样的微型ORM?
我使用许多不同类型的数据库,包括MySQL,我喜欢将它与Entity Framework结合使用来构建代表我的表和视图的类。我不在运行时使用实体框架与MySQL - 历史上它真的很慢。 然后我有一个数据访问层,它包含我用来访问数据的所有方法。
使用NPoco的内联SQL的典型方法可能如下所示:
public user GetUser(int userId)
{
using (var db = new Database("LocalMySqlServer"))
{
var sql = NPoco.Sql.Builder.Append("SELECT * FROM users where ID=@0", userId);
var myList = db.FirstOrDefault<user>(sql);
return myList;
}
}
public List<user> GetUsers()
{
using (var db = new Database("LocalMySqlServer"))
{
return db.Fetch<user>("SELECT * FROM users");
}
}
在这些示例(未测试)中,您将在web.config或app.config中保存一个名为LocalMySqlServer的连接字符串,在MySQL中您将拥有一个名为users的表。您将拥有一个名为user的类,该类与数据库中的users表匹配 - 使用Entity Framework导入或手动创建。
NPoco能够做得更多,值得一试。如果你不想在生产中使用NPoco,那么你可以通过源代码查看它是如何工作的。
最后,在您的示例中,您传递了要运行的SQL语句。 NPoco使用参数化查询来降低注入攻击的风险。
答案 3 :(得分:-1)
我会避免使用数据阅读器,而是使用DataTable,你可以得到像这样的列
foreach (DataColumn column in oTable1.Columns) {
object value1 = oRow[column.ToString()].ToString();
}