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は、指定されたクラスのコンストラクターである必要があります。次に、すべての 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));

    }

ここから着想を得た

于 2012-08-08T09:20:23.577 に答える