我正在使用一个包含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);
...
任何能够指出正确方向的建议都将受到高度赞赏。
答案 0 :(得分:0)
但是我的目标是从类本身的定义创建参数化SQL语句,我正在绘制一个空白。
看起来似乎是使用Reflection。一旦你有了类属性/值,我相信你可以处理其余的。
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框架中已有相当多的ORMs可以执行您正在执行的操作。我强烈建议您使用其中任何一个而不是当前的行动方案(如果没有商业原因)。