从sql数据库表中列出(T)
本文关键字:sql 数据库 | 更新日期: 2023-09-27 18:27:31
我想从sql数据库表创建List(T)
假设我有一张桌子
ID Name
1 xyz
2 efd
3 abc
4 pqr
我想要一些C#中的代码,谁将读取这个数据库表数据并写入在我的c类或/notepad或其他什么中按照行。。。
List<ItemViewModel> Items= new List<ItemViewModel>();
Items.Add(new ItemViewModel() { id= 1, name= "xyz"}
Items.Add(new ItemViewModel() { id= 2, name= "efd"}
Items.Add(new ItemViewModel() { id= 3, name= "abc"}
Items.Add(new ItemViewModel() { id= 4, name= "pqr"}
提前感谢
将"dapper"添加到您的项目中(在NuGet上可用),然后:
var list = connection.Query<YourType>("select * from TableName").ToList();
或者对于无参数查询:
var region = "South";
var list = connection.Query<YourType>(
"select * from TableName where Region=@region", new { region });
这里是你能得到的最好的代码之一,下面的方法可以处理任何数据类和系统定义的类型:
public List<T> ExecuteQuery<T>(string s, SqlConnection condb, params SqlParameter[] Params)
{
List<T> res = new List<T>();
string er = "";
SqlDataReader r = null;
try {
if (condb == null)
throw new Exception("Connection is NULL");
if (string.IsNullOrEmpty(s))
throw new Exception("The query string is empty");
using (SqlCommand cm = new SqlCommand(s, condb)) {
if (Params.Length > 0) {
cm.Parameters.AddRange(Params);
}
if (cm.Connection.State != ConnectionState.Open)
cm.Connection.Open();
r = cm.ExecuteReader;
object prps = typeof(T).GetProperties;
object prpNames = prps.Select((System.Object f) => f.Name).ToList;
if (r.HasRows) {
while (r.Read) {
if (typeof(T).FullName.Contains("System.")) {
res.Add(r(0));
// Classes
} else {
object c = Activator.CreateInstance(typeof(T));
for (j = 0; j <= r.FieldCount - 1; j++) {
object jj = j;
//er = dt.Rows(jj)("ColumnName").ToLower
object fname = r.GetName(j).ToString;
er = fname;
object fType = r.GetProviderSpecificFieldType(j).ToString.ToLower;
object p = prps.Where((System.Object f) => f.Name.Trim.ToLower == fname.ToLower).ToList;
if (p.Count > 0) {
//Date or DateTime
if (fType.Contains("date")) {
if (!p(0).PropertyType.FullName.ToLower.Contains("system.nullable") && (r(fname) == null || r(fname).Equals(System.DBNull.Value))) {
p(0).SetValue(c, Now, null);
} else {
if (!(p(0).PropertyType.FullName.ToLower.Contains("system.nullable") && (r(fname) == null || r(fname).Equals(System.DBNull.Value)))) {
p(0).SetValue(c, r(fname), null);
}
}
//String
} else if (fType.Contains("string")) {
if (r(fname) == null || r(fname).Equals(System.DBNull.Value)) {
p(0).SetValue(c, "", null);
} else {
p(0).SetValue(c, r(fname), null);
}
} else {
if (!(p(0).PropertyType.FullName.ToLower.Contains("system.nullable") && (r(fname) == null || r(fname).Equals(System.DBNull.Value)))) {
p(0).SetValue(c, r(fname), null);
}
}
}
}
res.Add(c);
}
}
}
r.Close();
}
//If cm IsNot Nothing Then
// 'cm.Connection.Close()
// cm.Dispose()
//End If
} catch (Exception ex) {
if (r != null && r.IsClosed == false)
r.Close();
throw ex;
}
return res;
}
用法:
var data = ExecuteQuery<ItemViewModel>("SELECT [ID], [Name] FROM [ItemViewTable]",
new SqlConnection("SomeConnectionString"));
如果您只想用数据库表中当前的任何数据填充一个列表,那么只需执行一个简单的查询即可。您不必涉及代码生成。
使用linq-to-sql读取表的内容,并为每个条目创建一个ItemViewModel
:
using(var context = new MyLinqDbContext())
{
var items = (from i in context.MyTable
select new ItemViewModel { id = ID, name = Name })
.ToList();
}
如果您想要生成C#代码,该代码是根据数据库值创建并编译到您的解决方案中的,那么您需要使用Microsoft的文本模板引擎(T4)。为了掌握这项技术,你可以在这篇博客文章中详细阅读。
如果你了解T4的基本知识,你可以阅读这篇博客,这里有一个如何为存储在数据库中的静态查找表动态创建枚举类的例子。从这段代码开始,您可以编写自己的代码生成模板,创建所需的类。