0

さらに別のMVCの質問。

多くのデータベース要求などを行う Web アプリケーション ツールに取り組んでいます。そして、この 1 ページは、MVC で多くの苦労をもたらします。

以前に C# でページを作成しましたが、それがどのように見えるかです データ検索

最大 4 つのグリッドを並べて表示して、値を比較できます。

今MVCで私はこの方法で問題を解決することを考えていました:

フローチャート

ただし、通常は接続の問題に基づいてランダムなエラーメッセージが常に表示されます...さまざまなことを試したので、コードが混乱していますが、最も重要な部分は次のとおりです。(選択肢が2つしかない例)

見る

MainDDL1、SubDDL1、Search1、MainDDL2、SubDDL2、Search2 を渡します (これは機能します)。

コントローラ

public PartialViewResult getGrid1(string MainDDL1, string SubDDL1, string Search1)
    {
        DataSearchModel voModel = new DataSearchModel();
        voModel.dtResultSet1 = DLA.DataSearchContext.getResultSet1(MainDDL1, SubDDL1, Search1);
        return PartialView(MainDDL1, voModel);
    }

public PartialViewResult getGrid2(string MainDDL2, string SubDDL2, string Search2)
{
    DataSearchModel voModel = new DataSearchModel();
    voModel.dtResultSet2 = DLA.DataSearchContext.getResultSet2(MainDDL2, SubDDL2, Search2);
    return PartialView(MainDDL2, voModel);
}

public ViewResult DataSearch(string text)
{
    DataSearchModel oModel = new DataSearchModel();
    oModel.alMainDDL = DLA.DataSearchContext.getMainDDL();

    return View(oModel);
}

同じメソッドを呼び出すだけでなく、dtResultSet1 と dtResultSet2 を使用しなければならないのが本当に嫌いです。getResultSet、dtResultSet などを呼び出すことができないのはなぜですか?! 新しいモデルを作成するので、モデルには独自のメソッドが必要ですか? または、モデルはオブジェクトに匹敵しません。

モデル

dtResultSet1、dtResultSet2、検索文字列などの宣言。

環境

        public static DataTable getResultSet1(string sChoice, string sFeat, string sSearch)
        {
            return setResultSet1(sChoice, sFeat, sSearch);
        }

private static DataTable setResultSet1(string sChoice, string sFeat, string sSearch)
        {

            DataTable dtTemp = new DataTable();
            string sQuery = setSqlQuery(sChoice, sFeat, sSearch);

            OleDbConnection dbConnection = null;
            // Instantiate the Connection Object
            dbConnection = new OleDbConnection(ConfigurationManager.ConnectionStrings["OracleDataBase"].ConnectionString);

            //dbConnection.Open();
            dbConnection.Open();

            OleDbCommand dbCommand = null;
            // Instantiate the Command Object
            dbCommand = new OleDbCommand(sQuery, dbConnection);
            dbCommand.CommandType = CommandType.Text;

            OleDbDataReader dr = null;
            // Execute the Stored Procedure
            dr = dbCommand.ExecuteReader();

            dtTemp = setResultSetRows(dtTemp, sChoice, dr);

            dr.Dispose();
            dbConnection.Close();

            return dtTemp;
        }

private static string setSqlQuery(string sChoice, string sFeat, string sSearch)
        {
            switch (sChoice)
            {
                case "T_PRCL":
                case "T_PRCL_FEA":
                case "T_GIS_PRCL":
                    return "SELECT * FROM " + sChoice + " WHERE " + sFeat + "='" + sSearch + "' and sys_del_flag = 0";
                case "SGD_SFC_FEAT":
                case "MSURFACE":
                case "SGD_MIN_FEAT":
                case "MMINERAL":
                    return "SELECT * FROM " + sChoice + " WHERE " + sFeat + "='" + sSearch + "' AND EXPIRY_DATE is NULL";
                case "V_SURFACE":
                case "V_MINERAL":
                    return "SELECT * FROM " + sChoice + " WHERE " + sFeat + "='" + sSearch + "'";
                default:
                    return "SELECT sysdate as UNKNOWN_ERROR from dual";
            }
        }

2. のメソッドはまったく同じです。ここでも、getResultSet と呼ばれる 1 つの静的メソッドにすべてを配置することをお勧めします。さらに、接続をグローバル変数 (OleDBConnection = null など) として使用し、接続などは独自のメソッドでした。これにより、接続が重複するたびに、さらにランダムなエラーが発生しました。通常、一方の Reader が他方の Reader の前に実行された場合。それらは異なるモデル(オブジェクト)であるため、独自の独立変数、オブジェクトを使用すべきではないので、どれがわかりませんか?

誰かがこれに光をもたらすことを願っています。

4

1 に答える 1

0

Pabloker からConnection Management ASP.netを確認するための Tipp を受け取った後、問題を解決することができました。

ここにコードの最も重要な部分があります。

環境

public class MyConnectionManager : IDisposable
        {
            [ThreadStatic] // static per thread
            private static OleDbConnection con;

            public static OleDbConnection Connection
            {
                get
                {
                    if (con == null)
                    {
                        con = new OleDbConnection(ConfigurationManager.ConnectionStrings["OracleDataBase"].ConnectionString);
                        con.Open();
                    }
                    return con;
                }
            }

            public void Dispose()
            {
                if (con != null)
                {
                    con.Close();
                }
            }
        }

private static DataTable setResultSet(string sChoice, string sFeat, string sSearch)
        {
            DataTable dtTemp = new DataTable();
            string sQuery = setSqlQuery(sChoice, sFeat, sSearch);

            // Instantiate the Command Object
            OleDbCommand dbCommand = new OleDbCommand(sQuery, MyConnectionManager.Connection);
            dbCommand.CommandType = CommandType.Text;

            // Execute the Stored Procedure
            OleDbDataReader dr = dbCommand.ExecuteReader();

            dtTemp = setResultSetRows(dtTemp, sChoice, dr);

            return dtTemp;

    }

        public static DataTable getResultSet(string sChoice, string sFeat, string sSearch)
        {
            return setResultSet(sChoice, sFeat, sSearch);
        }

モデル

public DataTable dtResultSet { get; set; }

コントローラ

public PartialViewResult getGrid1(string MainDDL1, string SubDDL1, string Search1)
{
    DataSearchModel voModel = new DataSearchModel();
    voModel.dtResultSet = DLA.DataSearchContext.getResultSet(MainDDL1, SubDDL1, Search1);
    return PartialView(MainDDL1, voModel);
}

public PartialViewResult getGrid2(string MainDDL2, string SubDDL2, string Search2)
{
    DataSearchModel voModel = new DataSearchModel();
    voModel.dtResultSet = DLA.DataSearchContext.getResultSet(MainDDL2, SubDDL2, Search2);
    return PartialView(MainDDL2, voModel);
}

見る

<script type="text/javascript">


    $(document).ready(function () {

        $.ajaxSetup({
            error: function (xhr, status, error) {
                alert("An AJAX error occured: " + status + "\nError: " + error);
            }
        });


        $('#btnSubmit').click(function () {
            var time = new Date().getTime(); // @* unique random number to workaround IE cache issue - IE will cache the ajax if you don't use this *@
            var oMainDDL1 = $('#MainDDL1').data("tComboBox");
            var oSubDDL1 = $('#SubDDL1').data("tComboBox");
            var sSearch1 = $("#Search1").val();

            var oMainDDL2 = $('#MainDDL2').data("tComboBox");
            var oSubDDL2 = $('#SubDDL2').data("tComboBox");
            var sSearch2 = $("#Search2").val();


            var actionURL = '@Url.Action("getGrid1", "DataSearch", new { MainDDL1 = "PLACEHOLDER" })'.replace('PLACEHOLDER', oMainDDL1.value()) + "&SubDDL1=" + oSubDDL1.value() + "&Search1=" + sSearch1 + "&time=" + time;
            if (actionURL != null) {
                alert('actionURL');
                $.get(actionURL, function (data) {
                    $('#result1').fadeOut('slow', 'linear', function () { $('#result1').empty(); $('#result1').append(data); });
                    $('#result1').fadeIn('slow', 'linear', function () {
                        if ($.browser.msie) {
                            this.style.removeAttribute('filter'); // @* Needed to fix IE7 cleartype bug with jQuery fade, but will crap out on FF/Chrome *@
                        }
                    });
                });
            }

            actionURL = '@Url.Action("getGrid2", "DataSearch", new { MainDDL2 = "PLACEHOLDER" })'.replace('PLACEHOLDER', oMainDDL2.value()) + "&SubDDL2=" + oSubDDL2.value() + "&Search2=" + sSearch2 + "&time=" + time;
            if (actionURL != null) {
                alert('actionURL');
                $.get(actionURL, function (data) {
                    $('#result2').fadeOut('slow', 'linear', function () { $('#result2').empty(); $('#result2').append(data); });
                    $('#result2').fadeIn('slow', 'linear', function () {
                        if ($.browser.msie) {
                            this.style.removeAttribute('filter'); // @* Needed to fix IE7 cleartype bug with jQuery fade, but will crap out on FF/Chrome *@
                        }
                    });
                });
            }
        });
    });

    function onMainDDL1Change(e) {
        var combo = $("#SubDDL1").data("tComboBox");
        combo.value("");
        combo.reload();
    }

    function onSubDDL1DataBinding(e) {
        var combo = $("#MainDDL1").data("tComboBox");
        e.data = $.extend({}, e.data, { mainDDL1ID: combo.value() });
    }

    function onMainDDL2Change(e) {
        var combo = $("#SubDDL2").data("tComboBox");
        combo.value("");
        combo.reload();
    }

    function onSubDDL2DataBinding(e) {
        var combo = $("#MainDDL2").data("tComboBox");
        e.data = $.extend({}, e.data, { mainDDL2ID: combo.value() });
    }
</script>

<table>
    <tr>
        <td>
            @(Html.Telerik().ComboBox()
                .Name("MainDDL1")
                .AutoFill(true)
                .DataBinding(binding => binding.Ajax().Select("LoadMainDDL", "DataSearch"))
                .HighlightFirstMatch(true)
                .ClientEvents(events => events.OnChange("onMainDDL1Change"))
                )
        </td>
        <td>
            @(Html.Telerik().ComboBox()
                .Name("MainDDL2")
                .AutoFill(true)
                .DataBinding(binding => binding.Ajax().Select("LoadMainDDL", "DataSearch"))
                .HighlightFirstMatch(true)
                .ClientEvents(events => events.OnChange("onMainDDL2Change"))
                )
        </td>
    </tr>
    <tr>
        <td>
            @(Html.Telerik().ComboBox()
                .Name("SubDDL1")
                .DataBinding(binding => binding.Ajax().Select("LoadSubDDL1", "DataSearch"))
                .HighlightFirstMatch(true)
                .ClientEvents(events => events.OnDataBinding("onSubDDL1DataBinding"))
                )
        </td>
        <td>
            @(Html.Telerik().ComboBox()
                .Name("SubDDL2")
                .DataBinding(binding => binding.Ajax().Select("LoadSubDDL2", "DataSearch"))
                .HighlightFirstMatch(true)
                .ClientEvents(events => events.OnDataBinding("onSubDDL2DataBinding"))
                )
        </td>
    </tr>
    <tr>
        <td>
            @Html.TextBox("Search1")
        </td>
        <td>
            @Html.TextBox("Search2")
        </td>
    </tr>
    <tr align="center">
        <td colspan="4">
        <input type="button" class="t-button button1" value="Search" id="btnSubmit" />
        </td>
    </tr>
</table>

<div id="result1">
</div>
<div id="result2">
</div>

部分ビュー - 例

@model ...DataSearchModel

@(Html.Telerik().Grid(Model.dtResultSet)
.Name("Grid")
.Footer(false)
.Columns(columns =>
{
columns.Bound(o => o.Row[0]).Title("T_PRCL");
}))
于 2012-07-06T17:43:22.780 に答える