从类创建参数化SQL的通用方法

时间:2014-10-24 17:46:08

标签: c# sql sql-server linq oop

我正在使用一个包含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);
    ...

任何能够指出正确方向的建议都将受到高度赞赏。

1 个答案:

答案 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可以执行您正在执行的操作。我强烈建议您使用其中任何一个而不是当前的行动方案(如果没有商业原因)。