从类创建参数化SQL的泛型方法
本文关键字:SQL 泛型方法 参数 创建 | 更新日期: 2023-09-27 18:27:48
我正在使用一个包含200多个表的数据库。我已经能够根据Table结构自动生成类。我还可以通过foreach循环使用数据表自动生成插入语句,如下所示:
foreach (DataColumn col in table.Columns)
{
colnames.Add("[" + col.ColumnName + "]");
}
然而,我的目标是从类本身的定义创建参数化SQL语句,而我现在画的是空白。
例如:
类别声明:
public class clsCaseWorker
{
public string CaseWorkerId{ get; set; }
public string CaseWorkerFirstName{ get; set; }
public string CaseWorkerLastName{ get; set; }
public string CaseWorkerMiddleName{ get; set; }
...
应该生成这样的方法/参数化查询(注意类名将映射到表名)
public clsSavedInfo SaveCaseWorkerInfo(clsCaseWorker CaseWorker)
{
string saveCaseWorker;
saveCaseWorker = "insert into CaseWorker ";
saveCaseWorker += "([CaseWorkerFirstName], [CaseWorkerLastName], ";
saveCaseWorker += "[CaseWorkerMiddleName], ...";
saveCaseWorker += "Values(@cw_FirstName, @cw_LastName, @cw_MiddleName, @cw_CellPhone, @cw_HomePhone, @cw_Address, @cw_Tribe, @cw_TribeName, ";
saveCaseWorker += "@cw_District, @cw_Title19, @cw_Title19Address, @cw_StateProgram, @cw_StateProgramText) SELECT CaseWorkerID FROM CaseWorker WHERE CaseWorkerID = @@IDENTITY";
SqlCommand cmd = new SqlCommand(saveCaseWorker, con);
cmd.Parameters.AddWithValue("@cw_FirstName", CaseWorker.CaseWorkerFirstName);
cmd.Parameters.AddWithValue("@cw_LastName", CaseWorker.CaseWorkerLastName);
cmd.Parameters.AddWithValue("@cw_MiddleName", CaseWorker.CaseWorkerMiddleName);
...
任何能为我指明正确方向的建议都将不胜感激。
然而,我的目标是从类本身的定义创建参数化SQL语句,而我现在画的是空白。
看起来首先应该使用"反射"。一旦你有了类属性/值,我相信你可以处理剩下的
public class MyClass
{
public int PropertyName { get; set; }
}
使用反射:
public static List<string> GetPropertyNames<T>()
{
string result = null;
var tableType = typeof(T);
var result = tableType.GetProperties(BindingFlags.GetProperty
| BindingFlags.Instance
| BindingFlags.Public)
.Select(p => p.Name)
.ToList();
return result;
}
public static object GetValue(object classInstance, string propertyName)
{
var tableType = classInstance.GetType();
var prop = tableType.GetProperty(propertyName);
var result = prop.GetValue(classInstance);
return result;
}
例如:
public class MyClass
{
public int PropertyName { get; set; }
}
var result = GetPropertyNames<MyClass>();
Console.WriteLine(result.First());
结果:
PropertyName
(我还提到,我没有在我的方法中进行任何空参数检查)
此外,.Net框架中已经有相当多的ORM在做您正在做的事情。我强烈建议您在当前的行动过程中使用其中任何一种(如果没有商业理由不这样做的话)。