【问题标题】:ASMX Web Service, Stored Procedures and MVC ModelsASMX Web 服务、存储过程和 MVC 模型
【发布时间】:2012-08-07 08:55:13
【问题描述】:

我正在使用 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 帖子中发生的模型绑定),如果没有,有什么替代方案。我知道使用 LINQ 可能会解决这个问题,但我不能使用它。

提前致谢。

最好的问候。

【问题讨论】:

    标签: asp.net-mvc-3 web-services stored-procedures model asmx


    【解决方案1】:

    找到了解决办法。

    我构建了一个通用方法,可以将任何 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 应该是指定类的构造函数。然后,在所有 Model 类中,我构建了一个构造函数,该构造函数接收 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));
    
        }
    

    here得到这个想法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多