2014-06-16 51 views
0

我试图从数据库中获取数据作为列表,但没有显示任何结果。我试图调试,但此行后,它不会让我step over/F10如何从数据库中获取数据,以列表<>存储,并显示结果以查看

DataSet ds = new DataSet(); 
da.Fill(ds); 

我想通过下面这个例子在这里做到这一点:link 1这里link 2,但发现很难,因此我认为我应该问这里。

有人能解释为什么它不显示结果,因此我可能在这里做错了什么?我如何解决并实现它来显示数据?

下面是你的检查全部控制器代码:

public static List<DBTrack> GetListOfTracks() 
{ 
    if (DBTrackData == null) 
    { 
     string myConnectionString = "Data Source="; // I have taken off the source 
     string mySelectString = "SELECT TrackID, AddedDate, TrackName, ArtistName from TBL_Track"; 
     SqlDataAdapter da = new SqlDataAdapter(); 
     DataSet ds = new DataSet(); 
     da.Fill(ds); 

     OleDbConnection myConnection = new OleDbConnection(myConnectionString); 
     OleDbCommand myCommand = new OleDbCommand(mySelectString, myConnection); 
     myCommand.Connection.Open(); 
     OleDbDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); 

     List<DBTrack> list = new List<DBTrack>(); 
     while (myReader.Read()) 
     { 
      DBTrack data = new DBTrack(); 
      data.TrackID = (Guid)(myReader["TrackID"]); 
      data.AddedDate = (DateTime)myReader["AddedDate"]; 
      data.TrackName = (string)myReader["TrackName"]; 
      data.ArtistName = (string)myReader["ArtistName"]; 
      list.Add(data); 
     }; 
    } 

    return DBTrackData; 
} 

编辑:

SqlConnection mySQLconnection = new SqlConnection(@"Data Source=server-2\SQLExpress;Initial Catalog=End;Integrated Security=False;User ID=test1;Password=**"); 
SqlCommand mySelectString = new SqlCommand("SELECT TrackID, AddedDate, TrackName, ArtistName from TBL_Track"); 

using (SqlConnection connection = new SqlConnection("context connection=true")) 
{ 
connection.Open(); 

using (SqlCommand myCommand = new SqlCommand // The best overload method System.Data.SqlClient.SqlCommand.SqlCommand has some invalid arguments 
(mySelectString, mySQLconnection))   // Cannot convert from System.Data.SqlClient.SqlCommand to 'string' 
{ 

回答

2

您应该设置DBTrackData到列表中的结果:

while (myReader.Read()) 
{ 
    ... 
} 

DBTrackData = list; 

您也可以直接编辑0​​在你的代码:

private static List<DBTrack> DBTrackData 
public static List<DBTrack> GetListOfTracks() 
{ 
    if (DBTrackData == null) 
    { 
     ... 

     DBTrackData = new List<DBTrack>(); 
     while (myReader.Read()) 
     { 
      DBTrack data = new DBTrack(); 

      ... 

      DBTrackData.Add(data); 
     }; 
    } 

    return DBTrackData; 
} 

因此,完全应该是:

public static List<DBTrack> GetListOfTracks() 
{ 
    try 
    { 
     if (DBTrackData == null) 
     { 
      string myConnectionString = "Data Source="; // I have taken off the source 
      string mySelectString = "SELECT TrackID, AddedDate, TrackName, ArtistName from TBL_Track"; 

      using (OleDbConnection myConnection = new OleDbConnection(myConnectionString)) 
      { 
       myConnection.Open(); 

       using (OleDbCommand myCommand = new OleDbCommand(mySelectString, myConnection)) 
       { 
        OleDbDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); 

        List<DBTrack> list = new List<DBTrack>(); 

        while (myReader.Read()) 
        { 
         DBTrack data = new DBTrack(); 
         data.TrackID = (Guid)(myReader["TrackID"]); 
         data.AddedDate = (DateTime)myReader["AddedDate"]; 
         data.TrackName = (string)myReader["TrackName"]; 
         data.ArtistName = (string)myReader["ArtistName"]; 

         list.Add(data); 
        } 

        DBTrackData = list; 
       } 
      } 
     } 

     return DBTrackData; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

    return DBTrackData; 
} 
+0

感谢帕特里克的详细帮助:)我想你的建议也和上面一样的评论,调试器不会让我'跨过/ F10'通过此行' OleDbConnection myConnection = new OleDbConnection(myConnectionString);',这是否意味着我有'string myConnectionString'中的连接问题以连接到'DB'?再次感谢:) – user3679123

+0

我这么认为。如果它显示给你一个例外,你可能有一些连接问题。 –

+0

谢谢 - 我没有收到任何异常或错误消息。它只是不会从这行代码向前传递'OleDbCommand myCommand = new OleDbCommand(mySelectString,myConnection);'。 – user3679123

2

你的主要问题是,你正在使用获取数据的两种不同的方式,但第一只部分实现。您正在使用数据适配器和数据读取器。你的数据适配器甚至没有被传递连接或查询,所以这就是它不起作用的原因。所以你可以删除那部分代码。

如果您在DBTrackData不为空时立即返回,而不是在整个代码中有一个大的if块,那么读起来也更容易。然后,您将有类似:

public static List<DBTrack> GetListOfTracks() 
{ 
    if (DBTrackData != null) return DBTrackData; 

    string myConnectionString = "Data Source="; // I have taken off the source 
    string mySelectString = "SELECT TrackID, AddedDate, TrackName, ArtistName from TBL_Track"; 

    OleDbConnection myConnection = new OleDbConnection(myConnectionString); 
    OleDbCommand myCommand = new OleDbCommand(mySelectString, myConnection); 
    myCommand.Connection.Open(); 
    OleDbDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); 

    List<DBTrack> list = new List<DBTrack>(); 
    while (myReader.Read()) 
    { 
     DBTrack data = new DBTrack(); 
     data.TrackID = (Guid)(myReader["TrackID"]); 
     data.AddedDate = (DateTime)myReader["AddedDate"]; 
     data.TrackName = (string)myReader["TrackName"]; 
     data.ArtistName = (string)myReader["ArtistName"]; 
     list.Add(data); 
    }; 

    //Setting DBTrackData means these values will get returned on every call to GetListOfTracks for this instance of the class 
    DBTrackData = list; 

    return list; 
} 
+0

@PatrickHofman你怎么知道这是目的?这是某种缓存机制,但我们无法从问题中判断它是否每次都设置,或者调用代码是否确定何时设置。它可能每天都有人居住。我已经回答了问题 - 为什么代码在某一行上失败。 DBTrackData是否被设置与该点是分开的。 –

+0

不够公平,我会编辑答案以用代码注释设置此值。 –

+0

感谢您的详细解答。它现在更有意义:)我尝试了你的建议,它仍然不会显示数据库中的数据。这是否意味着我的'myConnectionString'没有连接到'DB'?因为调试器不会让我'超越/ F10'传递这一行'OleDbConnection myConnection = new OleDbConnection(myConnectionString);'。再次感谢:) – user3679123

相关问题