1

ローカル データベースの列をドロップダウン リストに表示しようとしています。問題は、データがすべて 1 行に表示されないように、データを分割する必要があることです。「;」を使用しました データを分離してから、split(";") メソッドを使用してデータを分割します。以下に書いたコードを試してみましたが、うまくいきません。どんな助けでも大歓迎です。

public string DisplayTopicNames()
{
    string topicNames = "";

    // declare the connection string 
    string database = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|/Forum.accdb;Persist Security Info=True";

    // Initialise the connection 
    OleDbConnection myConn = new OleDbConnection(database);
    //Query
    string queryStr = "SELECT TopicName FROM Topics";
    // Create a command object 
    OleDbCommand myCommand = new OleDbCommand(queryStr, myConn);
    // Open the connection 
    myCommand.Connection.Open();
    // Execute the command 
    OleDbDataReader myDataReader = myCommand.ExecuteReader();

    // Extract the results 
    while (myDataReader.Read())
    {
        for (int i = 0; i < myDataReader.FieldCount; i++)
            topicNames += myDataReader.GetValue(i) + " ";
        topicNames += ";";
    }

    //Because the topicNames are seperated by a semicolon, I would have to split it using the split()
    string[] splittedTopicNames = topicNames.Split(';');
    // close the connection 
    myCommand.Connection.Close();

    return Convert.ToString(splittedTopicNames);
}
4

3 に答える 3

2

テーブルから 1 つの列だけを返しています。
フィールド カウントに対して for ループを使用する理由はありません (常に 1 です)
。代わりに、aを使用しList(Of String)て、見つかった行によって返された値を保存できます。
次に、このリストを返して、DropDownList のデータソースとして使用します

List<string> topicNames = new List<string>();
// Extract the results 
while (myDataReader.Read())
{
    topicNames.Add(myDataReader.GetValue(0).ToString();
}
....
return topicNames;

ただし、フィールドTopicName自体にセミコロンで区切られた文字列が含まれているかどうかは明確ではありません。
この場合、次のように記述できます。

List<string> topicNames = new List<string>();
// Extract the results 
while (myDataReader.Read())
{
    string[] topics = myDataReader.GetValue(0).ToString().Split(';')
    topicNames.AddRange(topics);
}
...
return topicNames;

文字列の配列を返したい場合は、リストを配列に変換するだけです

return topicNames.ToArray();

EDIT
もちろん、配列または List(Of String) を返すには、メソッドの戻り値を変更する必要があります

 public List<string> DisplayTopicNames()
 {
     ......
 }

また

 public string[] DisplayTopicNames()
 {
     ......
 }

それでもセミコロンで区切られた文字列を返したい場合は、この方法で return ステートメントを変更します

 return string.Join(";", topicNames.ToArra());
于 2013-04-12T20:06:50.173 に答える
0

私が気を失っていない限り、次のようなものがうまくいくはずです:

while (myDataReader.Read())
{
    for (int i = 0; i < myDataReader.FieldCount; i++)
        ddl.Items.Add(myDataReader.GetValue(i))
}

ddlの名前はどこにありますかDropDownList。ここで利用できない場合は、代わりにコレクションにddl追加して、それを返します。List<string>そして、このコードはもはや無関係になるかもしれません:

//Because the topicNames are seperated by a semicolon, I would have to split it using the split()
string[] splittedTopicNames = topicNames.Split(';');
// close the connection 
myCommand.Connection.Close();

return Convert.ToString(splittedTopicNames);

しかし、これらすべてに加えて、コードを少し再構築したいと思いますusing

public string DisplayTopicNames()
{
    string topicNames = "";

    // declare the connection string 
    string database = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|/Forum.accdb;Persist Security Info=True";

    // Initialise the connection 
    using (OleDbConnection myConn = new OleDbConnection(database))
    {
        myConn.Open();

        // Create a command object 
        OleDbCommand myCommand = new OleDbCommand("SELECT TopicName FROM Topics", myConn);

        // Execute the command 
        using (OleDbDataReader myDataReader = myCommand.ExecuteReader())
        {
            // Extract the results 
            while (myDataReader.Read())
            {
                for (int i = 0; i < myDataReader.FieldCount; i++)
                {
                    ddl.Items.Add(myDataReader.GetValue(i));
                }
            }
        }
    }

    // not sure anything needs returned here anymore
    // but you'll have to evaluate that
    return "";
}

このステートメントを利用する理由usingは、管理されていないリソースが に存在し、DataReader適切Connectionに破棄されるようにするためです。ステートメントを離れると、オブジェクトusingが自動的に呼び出さDisposeれます。このステートメントは、 を実装するオブジェクトに対してのみ使用さIDisposableれます。

于 2013-04-12T20:08:58.297 に答える