0

我正在使用 MVC 3 开发一个 Web 应用程序。此应用程序通过 ASMX Web 服务连接到 SQL Server 数据库。每个 Web 方法调用一个存储过程并返回一个 DataTable。

这是我用来调用存储过程的代码:

public static DataTable ExecSP(string StoredProcedureName, List<string> ParameterNames, List<Object> ParameterValues)
    {
        SqlConnection Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLServer"].ConnectionString);
        SqlDataReader Reader = null;
        DataTable SPResult = null;

        try
        {
            Connection.Open();
            SqlCommand Command = new SqlCommand("dbo." + StoredProcedureName, Connection);
            Command.CommandType = CommandType.StoredProcedure;

            if (ParameterNames != null)
            {
                for (int i = 0; i < ParameterNames.Count; i++)
                {
                    SqlParameter Parameter = new SqlParameter(ParameterNames[i], ParameterValues[i]);
                    if (Parameter.SqlDbType.Equals(SqlDbType.NVarChar))
                    {
                        Parameter.SqlDbType = SqlDbType.VarChar;
                    }

                    if (Parameter.SqlValue == null)
                    {
                        Parameter.SqlValue = DBNull.Value;
                    }

                    Command.Parameters.Add(Parameter);
                }
            }
            Reader = Command.ExecuteReader();
            SPResult = new DataTable();
            SPResult.Load(Reader);

        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            Connection.Close();

            if (Reader != null)
            {
                Reader.Close();
            }
        }
        return SPResult;
    }

我想知道是否有一种直接的方法可以将此 DataTable 转换为模型,然后可以将其传递给视图(例如,在 AJAX 帖子中发生的模型绑定),如果没有t,有什么选择。我知道使用 LINQ 可能会解决这个问题,但我不能使用它。

提前致谢。

此致。

4

1 回答 1

0

找到了解决方案。

我构建了一个通用方法,可以将任何 DataTable 转换为我指定的任何类的 List:

public static List<T> Translate<T>(DataTable SPResult, Func<object[],T> del)
    {
        List<T> GenericList = new List<T>();

        foreach (DataRow Row in SPResult.Rows)
        {
            GenericList.Add(del(Row.ItemArray));
        }

        return GenericList;
    }

代表在哪里del。调用该方法时,del应该是指定类的构造函数。然后,在所有模型类中,我构建了一个构造函数,它接收一个object[] RowFromTable

public class MyClass
{
    public int ID { get; set; }
    public string Description { get; set; }

    public FormaProcesso(object[] RowFromTable)
    {
        this.ID = (int)RowFromTable[0];
        this.Description = RowFromTable[1].ToString();
    }
}

最后,总而言之,这就是我调用 Web 方法时发生的情况:

public List<MyClass> GetAll()
    {

        DataTable SPResult = MyWebService.GetAll().Table;

        return Translate<MyClass>(SPResult, l => new MyClass(l));

    }

从这里得到想法

于 2012-08-08T09:20:23.577 回答