2012-10-19 12 views
8

मैं अपने SQL बॉक्स में SqlDataAdapter के माध्यम से एक मानक Sql चयन कथन भेज रहा हूं, फिर डेटासेट ऑब्जेक्ट को पॉप्युलेट कर रहा हूं।एक डेटासेट को एक दृश्य में वापस कैसे करें

मैं परिणामी डेटासेट में पंक्तियों तक पहुंच सकता हूं, लेकिन मैं डेटासेट को एक सूची में कैसे परिवर्तित कर सकता हूं जिसे एमवीसी व्यू में वापस किया जा सकता है। यानी मैं मानता हूं कि एक सूची वस्तु इसे संभालने का सबसे अच्छा तरीका है।

यहाँ मेरी नियंत्रक सी # कोड है:

public class QAController : Controller 
{ 

    private readonly static string connString = ConfigurationManager.ConnectionStrings["RegrDBConnection"].ToString(); 
    private readonly static SqlConnection sqlConn = new SqlConnection(connString); 
    private readonly static SqlCommand sqlComm = new SqlCommand(); 

    public ActionResult Index() 
    { 
     DbRegressionExec(); 
     return View(); 
    } 
    public static void DbRegressionExec() 
    { 
     // SELECT TABLE CONTENTS FROM SQL !! 
     RegressDB_TableList regresDB = new RegressDB_TableList(); 
     string sqlStr = "select * from [RegressionResults].[dbo].[Diff_MasterList] order by TableName"; 

     // POPULATE DATASET OBJECT 
     DataSet ds = new DataSet(); 
     SqlDataAdapter da = new SqlDataAdapter(sqlStr, sqlConn); 
     da.SelectCommand.CommandType = CommandType.Text; 
     sqlConn.Open(); 
     try 
     { 
      da.Fill(ds, "RegresDB"); 
     } 
     catch (Exception e) 
     { 
      throw; 
     } 
     finally 
     { 
      sqlConn.Close(); 
     } 

     // I can iterate thru rows here, but HOW DO CONVERT TO A LIST OBJECT ???? 

     int numRows = ds.Tables["RegresDB"].Rows.Count; 
     for (int i = 0; i < numRows; i++) 
     { 
      string tblName = ds.Tables["RegresDB"].Rows[i].Field<string>("TableName"); 
     } 

     //List<RegressDB_TableList> masterList = regresDB.RegresTableList.ToList(); //not working !! 
     //var masterList = regresDB.TableName.ToList(); // 

    } 

} 

और एक साधारण वर्ग मैं बनाने के लिए आवश्यकता हो सकती है ऐसा:

namespace RegressionMvc.Models 
{ 
    public class RegresDB_TableName 
    { 
    public string TableName { get; set; } 
    } 
    public class RegressDB_TableList 
    { 
    public List<RegresDB_TableName> RegresTableList { get; set; } 
    } 

}

अंत में, मैं कोशिश कर रहा हूँ एसक्यूएल सर्वर से डेटासेट परिणामों को संभालने का सर्वोत्तम तरीका और उन्हें एमवीसी व्यू पर वापस कैसे बनाएं।

मैं शायद jQuery और जेसन के साथ जा सकता हूं, जिसका अर्थ है कि डेटा फ़ील्ड को जेसन में परिवर्तित करें और JQuery पर वापस आएं, लेकिन मुझे यकीन है कि एसक्यूएल आधारित परिणाम सेट को संभालने के कई तरीके हैं।

आपकी सलाह के लिए अग्रिम धन्यवाद ....

बेस्ट, बॉब

+1

एक मॉडल एक दृश्य के लिए पारित एक संपत्ति के रूप में एक डेटासेट हो सकता है (मैं बहुत यकीन है)। क्या कोई कारण है कि आप डेटासेट और/या डीएओ का उपयोग अधिक परिपक्व और दृढ़ता से टाइप की गई तकनीक जैसे एंटीटी फ्रेमवर्क या एनएचबेर्नेट (आदि) के बजाय कर रहे हैं? –

+0

दृश्य में डेटासेट डेटा के साथ आप क्या करने जा रहे हैं?यदि आपको इसे संपादित करने और इसे नियंत्रक कार्रवाई में वापस करने की आवश्यकता है, तो आप डेटासेट डेटा को अधिक दृश्य-अनुकूल डेटा संरचना में स्थानांतरित करना चाहते हैं। –

उत्तर

4

लघु जवाब

सीधे आपके सवाल का जवाब।

आपका कोड की तरह कुछ करने के लिए बदल सकता है:

string sqlStr = "SELECT * FROM [RegressionResults].[dbo].[Diff_MasterList] ORDER BY TableName"; 
return sqlConn.Query<RegresDB_TableName>(sqlStr); 
+0

सभी को धन्यवाद। मैं सोमवार को इस सामान को आजमाऊंगा और वापस एएसएपी पोस्ट करूंगा। - बॉब –

+0

हाय सब - मैं ईएफ और न ही एनएचबीरनेट का उपयोग नहीं कर रहा हूं क्योंकि मैं एसबीएल सर्वर टी-एसक्यूएल में लिखा गया डीबी तुलना उपकरण प्रबंधित करने के लिए बस एक छोटा फ्रंट एंड एडमिन पेज लिख रहा हूं। इस मामले में मुझे कुछ "मास्टर" टेबलों के साथ-साथ कुछ SQL सिस्टम दृश्यों में से चुनने की आवश्यकता है। तो यह सीआरयूडी आवश्यकताओं के साथ आपका सामान्य अनुप्रयोग नहीं है। आप सबको धन्यवाद !!! –

+1

@bob EF या NHibernate मेरे उत्तर से कैसे संबंधित है? – Charlino

4

आप डीएओ का उपयोग कर के साथ फंस रहे हैं, मैं एक डेटासेट का उपयोग नहीं सुझाव है और बदले के साथ एक जोरदार टाइप किया वर्ग का उपयोग SqlDataReader.GetValues() विधि की गति। यह अधिक काम है, लेकिन अगर आप दृढ़ता से टाइप किए गए वर्ग चाहते हैं तो मुझे कहीं और किया जाना चाहिए, जिसे मैं अत्यधिक अनुशंसा करता हूं।

var tableList = new List<RegresDB_TableName>(); 
int numRows = ds.Tables["RegresDB"].Rows.Count; 
for (int i = 0; i < numRows; i++) 
{ 
    string tblName = ds.Tables["RegresDB"].Rows[i].Field<string>("TableName"); 
    tableList.Add(new RegresDB_TableName() { TableName = tblName }; 
} 

return View(tableList); 

लांग जवाब (है कि वास्तव में छोटा है)

dapper-dot-net बाहर का प्रयास करें:

public class Person 
{ 
    public Person(Object[] values] 
    { 
    this.FirstName = (string)values[0]; 
    this.LastName = (string)values[1]; 
    this.Birthday = (DateTime)values[2]; 
    this.HasFavoriteColor = (bool)values[3]; 
    } 

    public string FirstName { get; private set; } 
    public string LastName { get; private set; } 
    public DateTime Birthday { get; private set; } 
    public bool HasFavoriteColor { get; private set; } 
} 

public static void DbRegressionExec() 
{ 
    List<Person> viewModel = new List<Person>(); 

    // SELECT TABLE CONTENTS FROM SQL !! 
    RegressDB_TableList regresDB = new RegressDB_TableList(); 
    string sqlStr = "select 
     FirstName 
     ,LastName 
     ,Birthday 
     ,HasFavoriteColor 
     from [RegressionResults].[dbo].[Diff_MasterList] 
     order by TableName"; 

    // POPULATE VIEWMODEL OBJECT 
    sqlConn.Open(); 

    try 
    { 
     using (SqlCommand com = new SqlCommand(sqlStr, sqlConn)) 
     { 
     using (SqlDbReader reader = com.ExecuteReader()) 
     { 
      while(reader.Read()) 
      { 
      viewModel.Add(new Person(com.GetValues())); 
      } 
     } 
     } 
    } 
    catch (Exception e) 
    { 
     throw; 
    } 
    finally 
    { 
     sqlConn.Close(); 
    } 

    return this.View(viewModel); 
} 
+0

उस @ एरिक-फिलिप्स के लिए धन्यवाद। मैंने अतीत में एसकएलडीबी रीडर का उपयोग किया है, हालांकि इस मामले में मुझे यकीन नहीं है कि सबसे अच्छा अभ्यास क्या है। मै उसे करने की एक कोशिश तो करूंगा। –

+0

इस मामले में सबसे अच्छा अभ्यास एक धार्मिक सवाल है। डीएओ, डेटासेट, ईएफ, एनएचबेर्नेट का प्रयोग करें, वे सभी काम करते हैं। मेरे अनुभव में मैं अपनी सभी परियोजनाओं (यहां तक ​​कि छोटी परियोजनाओं) के लिए इकाई फ्रेमवर्क का उपयोग करता हूं जो किसी भी संख्या में टेबल (यहां तक ​​कि 1) का उपयोग करते हैं। मेरी राय में परियोजना जितनी छोटी होगी उतनी आसान इकाई फ्रेमवर्क का सामना करना है। –

5

अपने नियंत्रक में इस

[HttpGet] 
public ActionResult View(Modelclass viewmodel) 
{ 
    List<Modelclass> employees = new List<Modelclass>(); 
    DataSet ds = viewmodel.GetAllAuthors(); 
    var empList = ds.Tables[0].AsEnumerable().Select(dataRow => new Modelclass{ 
     AuthorId = dataRow.Field<int>("AuthorId"), 
     Fname = dataRow.Field<string>("FName"), 
     Lname = dataRow.Field<string>("Lname") 
    }); 
    var list = empList.ToList(); 



    return View(list); 
} 

की तरह और ध्यान में रखते हुए

@{ 
var gd = new WebGrid(Model, canPage: true, rowsPerPage: 5, selectionFieldName: "selectedRow",ajaxUpdateContainerId: "gridContent"); 
    gd.Pager(WebGridPagerModes.NextPrevious);} 
@gd.GetHtml(tableStyle: "table", 

     columns: gd.Columns(
       gd.Column("AuthorId", "AuthorId"), 
       gd.Column("Fname", " Fname"), 
       gd.Column("Lname", "Lname", style: "description") 

)) 
+0

मुझे आपका जवाब पसंद है, लेकिन मुझे नहीं पता कि 'सूची कर्मचारी = नई सूची (); 'कथन का उपयोग कभी भी किया जाता है। –

0

नियंत्रक कोड कोड डाल

//pQ is your query you have created 
//P4DAL is the key name for connection string 

    DataSet ds = pQ.Execute(System.Configuration.ConfigurationManager.ConnectionStrings["Platform4"].ConnectionString); 


    //ds will be used below 
    //create your own view model according to what you want in your view 
//VMData is my view model 

var _buildList = new List<VMData>(); 
      { 
       foreach (DataRow _row in ds.Tables[0].Rows) 
       { 
        _buildList.Add(new VMData 
        { 
    //chose what you want from the dataset results and assign it your view model fields 

         clientID = Convert.ToInt16(_row[1]), 
         ClientName = _row[3].ToString(), 
         clientPhone = _row[4].ToString(), 
         bcName = _row[8].ToString(), 
         cityName = _row[5].ToString(), 
         provName = _row[6].ToString(), 
        }); 



       } 

      } 

    //you will use this in your view 
    ViewData["MyData"] = _buildList; 

देखें

@if (ViewData["MyData"] != null) 
{ 

    var data = (List<VMData>)ViewData["MyData"]; 
    <div class="table-responsive"> 
     <table class="display table" id="Results"> 

      <thead> 
       <tr> 
        <td>Name</td> 
        <td>Telephone</td> 
        <td>Category </td> 
        <td>City </td> 
        <td>Province </td> 

       </tr> 
      </thead> 

      <tbody> 
       @foreach (var item in data) 
       { 
      <tr> 
       <td>@Html.ActionLink(item.ClientName, "_Display", new { id = item.clientID }, new { target = "_blank" })</td> 
       <td>@item.clientPhone</td> 
       <td>@item.bcName</td> 
       <td>@item.cityName</td> 
       <td>@item.provName</td> 

      </tr> 

      } 
      </tbody> 


     </table> 
     </div> 
     } 
संबंधित मुद्दे