代码之家  ›  专栏  ›  技术社区  ›  Partial

修改数据表

  •  4
  • Partial  · 技术社区  · 15 年前

    情况:

    你好!我正在尝试用MS Access数据库填充WPF工具包数据报。

    以下是我现在的产品(它可以工作):

    //Load the datagrid with the database
        private void LoadDataGrid(string filename, string path)
        {
            string databaseConn = "Provider=Microsoft.ACE.OLEDB.12.0;" +
                                  "Data Source=" + path + "\\" + filename,
                   tableName ="";
            OleDbConnection conn = null;
            DataTable schemaTable,
                      table = new DataTable();
    
            try
            {
                conn = new OleDbConnection(databaseConn);
                try
                {
                    conn.Open();
                    schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
                                                           new object[] { null, null, null, "TABLE" });
                    tableName = "[" + schemaTable.Rows[0].ItemArray[2].ToString() + "];";
                    string sqlQuery = "SELECT * FROM " + tableName;
                    OleDbCommand command = new OleDbCommand(sqlQuery, conn);
                    OleDbDataReader reader;
                    reader = command.ExecuteReader();
                    table.Load(reader);
                    DataGrid_.ItemsSource = table.DefaultView;
                }
                catch (Exception ex)
                {
                    System.Windows.MessageBox.Show(ex.Message); 
                }
                finally
                {
                    conn.Close();
                }
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message); 
            }
        }
    

    上面的代码示例在MS Access数据库的帮助下加载WPF工具包数据报。

    我想做的是能够在一开始在数据报中插入一列。此列将用于写入行号。我认为可以工作的是修改 桌子 变量(即 可计算的 对象)。


    问题:

    那么,如何在 桌子 变量,为新列中的每一行添加行号,并在数据报中包含数据库中的所有数据?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Alfred Myers    15 年前

    另一种方法是在将IDataReader加载到数据表中之前,在该数据表上创建一列。

    
    // the rest of your code
    //
    DataTable table = new DataTable();
    DataColumn col = table.Columns.Add("RowNumber", typeof(int));
    col.AutoIncrementSeed = 1;
    col.AutoIncrement = true;
    
    //
    // the rest of your code
    //
    
    table.Load(reader)
    //
    // the rest of your code
    

    下面的代码片段演示了与问题上下文无关的技术

    
    //Simulates data coming from a database or another data source
    DataTable origin = new DataTable(); 
    DataColumnCollection columns = origin.Columns; 
    columns.Add("Id", typeof(int)); 
    columns.Add("Name", typeof(string)); 
    origin.Rows.Add(55, "Foo"); 
    origin.Rows.Add(14, "Bar"); 
    IDataReader reader = origin.CreateDataReader();
    
    DataTable table = new DataTable(); 
    
    //Sets up your target table to include a new column for displaying row numbers
    //These are the three lines that make it all happen.
    DataColumn col = table.Columns.Add("RowNumber", typeof(int)); 
    col.AutoIncrementSeed = 1; 
    col.AutoIncrement = true; 
    
    //Simulates loading data from the database
    table.Load(reader); 
    
    // Examine table through the debugger. Is will have the contents of "origin" with the column "RowNumber" prepended
    
        2
  •  2
  •   MusiGenesis    15 年前

    最简单的解决方案是修改代码,使其在原始的select查询中包含“虚拟”rownumber字段,如下所示:

    SELECT ROWNUM AS ROWNUMBER, * FROM TABLE1
    

    不幸的是,access没有rownum函数,所以我认为最简单的解决方案是在select查询中添加rownumber列,如下所示:

    SELECT 0 AS ROWNUMBER, * FROM TABLE1
    

    它将在开始处添加一个包含所有零的列,然后遍历生成的数据表并设置行号,如下所示:

    int rownumber = 1;
    foreach (DataRow row in table.Rows)
    {
        row["ROWNUMBER"] = rownumber;
        rownumber++;
    }
    

    然后将数据表转储到网格中。