c# MYSQL的SELECT方法动态
本文关键字:方法 动态 SELECT MYSQL | 更新日期: 2023-09-27 18:03:54
下面是一个选择mysql表的方法。然而,我不觉得它很有活力。来自PHP,我所做的就是向函数发送查询并在变量中接收其数据。现在看来情况已经不同了。
我的问题变化很大。有时它们只有一行和一列。下一次它可能收集1000行和所有列。以下面的方式使用列表不是非常动态的,我不希望为每个可能的场景构建一个选择方法。
我想运行我的查询,返回数据,让我做我想做的。
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;
}
}
谢谢!
看看ExpandoObject。或者对于旧的。net,使用Dictionary或HashMap。
你可以从Select()方法返回一个List。在方法内部,您可以遍历DataReader的字段,将它们映射到我提到的对象类型之一。
如何遍历数据阅读器的列-
如何循环遍历OracleDataReader的所有列
如何在运行时按名称为ExpandoObject添加属性
为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块中丢弃读取器。
我应该在"使用"声明吗?
从这个我的SQL教程,认为你想做的是返回一个数据集或数据表。
这只是一个例子,需要修改才能在你的方法中工作,应该会给你你需要的,尽管
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();
}
}
你考虑过使用像NPoco这样的微ORM吗?
我使用许多不同类型的数据库,包括MySQL,我喜欢将其与实体框架结合使用来构建代表我的表和视图的类。我不使用实体框架运行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");
}
}
在这些示例(未测试)中,您将有一个名为LocalMySqlServer的连接字符串保存在web中。在MySQL中,你会有一个名为users的表。您将拥有一个名为user的类,它与数据库中的users表相匹配——可以使用实体框架导入,也可以手动创建。
NPoco有更多的功能,值得一试。如果你不想在生产环境中使用NPoco,作为开源工具,你可以运行源代码,看看它是如何工作的。
最后,在您的示例中,您传递了想要运行的SQL语句。NPoco使用参数化查询来降低注入攻击的风险。
我将避免使用数据阅读器,而是使用数据表,你可以得到这样的列
foreach (DataColumn column in oTable1.Columns) {
object value1 = oRow[column.ToString()].ToString();
}