1

tbl1次の名前 (および)を持つ 2 つのテーブルを持つデータベースがあるとしますtbl2。上記の各テーブルには、異なる数の列がtbl1あり、3列とtbl24 列があります。

上記の各テーブルを にコピーする必要がありますDataTable

もちろん、以下のコードのように手動で行うこともできます。

    class 
    {  
      public Main()  
      {
        // for tbl1 with 3 columns.
        string sql = "select * from tbl1"
        MySqlCommand com = new MySqlCommand(sql, con);
        MySqlDataReader dr = com.ExecuteDataReader();
        DataTable dt = GetDataTable(3);

        while (dr.Read())
        {
          if (dr.HasRows)
          {
            dt.Rows.Add(dr[0], dr[1], dr[2]);  <---- Point of interest
          }
        }

        // for tbl2 with 4 columns.
        string sql = "select * from tbl2";
        MySqlCommand com = new MySqlCommand(sql, con);
        MySqlDataReader dr = com.ExecuteDataReader();
        DataTable dt = GetDataTable(4);

        while (dr.Read())
        {
          if (dr.HasRows)
            {
              dt.Rows.Add(dr[0], dr[1], dr[2], dr[3]);  <---- Point of interest
            }
        }
    }

      public DataTable GetDataTable(int columnCount)
      {
        DataTable dt = new DataTable();

        if (columnCount > 0)
        {
          for (int i = 0; i < length; i++)
          {
            dt.Columns.Add(i.ToString(), typeof(object));
          }
        }
        return dt;
      }
    }  

しかし、私がやりたいのは、特に矢印を示した部分で、上記のプロセスを自動化することです。

列に対して行ったように行を動的に追加する方法はありますか?

行を文字列として追加するプロセスを生成し、その文字列をコマンドとして呼び出す関数を使用して行を動的に追加できると考えていましたが、本当に迷って何をすべきかわかりません... plsは以下のコードを参照してください.

EX:    
String generated from a function base on number of columns:
    "dt.Rows.Add(dr[0], dr[1], dr[2], dr[3])"
Then, use the string as a command to add rows...
4

2 に答える 2

4

データリーダーの GetSchemaTable メソッドを使用して、列数を確認します。

このようなもの (たとえば、テストされていないコード):

public DataTable ReadTable(string sql, params object[] parameters) {


    using (var cmd = CreateCommand(sql, parameters))
        {
            var reader = cmd.ExecuteReader();
            if (reader == null)
            {
                return null;
            }

            var schemaTable = reader.GetSchemaTable();
                            DataTable dt = GetTable(schemaTable);

            while (reader.Read())
            {
                var values = new object[reader.FieldCount];
                reader.GetValues(values);
                                    dt.Rows.Add(values);

            }
        }
}

private DataTable GetTable(DataTable schemaTable) {
        if (schemaTable == null || schemaTable.Rows.Count == 0)
        {
            return null;
        }

        var dt = new DataTable();
        foreach (DataRow schemaRow in schemaTable.Rows)
        {
            var col = new DataColumn
            {
                ColumnName = schemaRow["ColumnName"].ToString(),
                                    DataType = schemaRow["DataType"]
                                  // use the debugger to find out the name of the type column in the schematable, 
                                  // and any other properties you need
            };
                            dt.Columns.Add(col);
        }
        return dt;

}

注: このようなコードを使用して DataTable を作成するのではなく、読み取った行を IEnumerable オブジェクトに変換します (SQL ステートメントを使用して自動的にこれを行わない DB2 Entity Framework ライブラリを使用しています)。

多くの人が言及したように、DataTable を読み取るだけの場合は、DataAdapter を作成し、Fill() メソッドを使用します。

// Assumes that connection is a valid SqlConnection object.
string queryString = 
 "SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");

http://msdn.microsoft.com/en-us/library/bh8kx08z(v=vs.80).aspx

于 2013-04-30T19:20:28.773 に答える