从类创建参数化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的泛型方法

然而,我的目标是从类本身的定义创建参数化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在做您正在做的事情。我强烈建议您在当前的行动过程中使用其中任何一种(如果没有商业理由不这样做的话)。