使用DataAdapter填充表格

3

我有一张包含少量记录的dataTable,但是它已经断开连接。

我正在使用下面的方法来获取dataTable

static System.Data.DataTable ReadSetUpTable(string queryStr,SqlConnection sc)
{
    try
    {
        var command = new SqlCommand()
                          {Connection = sc, CommandText = queryStr};
        var dataAdapter = new SqlDataAdapter() {SelectCommand = command};
        var dataTable = new System.Data.DataTable();
        dataAdapter.Fill(dataTable);
        return dataTable;
    }
    catch (Exception)
    {
        throw;
    }
} 

到目前为止还没有问题。

我想知道的是是否有一种简单的方法,可以使用不同的连接字符串将这个 dataTable填充到另一个模式中。

针对本帖,假设有一个具有两列的表格。

Create Table Student(StudentId NUMBER(6), StudentName varchar2(50));

我希望使用上面代码中的dataTable填充这个表格。

我可以使用一个命令对象和一个插入语句来实现。例如,这段代码:

static int LoadDataTable(OracleConnection oc, System.Data.DataTable dataTable)
{
    try
    {
        var command = 
            new OracleCommand
            {
                CommandText = "INSERT INTO STUDENT (STUDENTID, STUDENTNAME) VALUES(:studentid, :studentname)",
                CommandType = CommandType.TableDirect,
                Connection = oc
            };
        var op1 = 
            new OracleParameter
            {
                ParameterName = "StudentId",
                Size = 6,
                OracleDbType = OracleDbType.Int32,
            Direction = System.Data.ParameterDirection.Input
            };
        command.Parameters.Add(op1);
        var op2 = 
        new OracleParameter
            {
                ParameterName = "studentName",
                OracleDbType = OracleDbType.Varchar2,
                Size = 50,
                Direction = System.Data.ParameterDirection.Input
            };
        command.Parameters.Add(op2);                                   
       /*
        foreach (var row in dataTable.Rows)
        {
            op1.Value = int.Parse(row[0].ToString());
            op2.Value = row[1].ToString();
            command.ExecuteNonQuery();
        }*/
            foreach (System.Data.DataRow row in dataTable.Rows)
            {
                row.SetAdded();
            }    

            var dataAdapter = new OracleDataAdapter() {InsertCommand = command};
            dataAdapter.Update(dataTable); //This updates the table, but all column values are NULL.

    }
    catch(Exception)
    {
        throw;
    }
} 

有没有更快更简单的方法,我不需要遍历记录?
1个回答

2
在你的第一个代码块中,你正在设置SelectCommand。还有InsertCommandUpdateCommandDeleteCommand
这些命令也存在于OracleDataAdapter对象上...由于DataTable是端点中立的,所以你只需要创建一个OracleCommand来执行插入操作,将其设置为OracleDataAdapterInsertCommand,并调用oracleDataAdapter.Update(dataTable)
随着我对它们的了解加深,我会添加更多细节。
设置InsertCommand的一个很好的例子在这里。请注意,当你向命令添加参数时,传递给.Add( ... )的最后一个值是你映射到的列的名称。
因为你将数据检索到DataTable中,但没有改变它,所以在调用oracleDataAdapter.Update()之前,你需要将每行的RowState更改为'Added'。你需要做类似以下的事情:
foreach (DataRow row in dataTable.Rows) {
    row.SetAdded();
}

如果您需要更多的代码示例,请告诉我...根据您发布的代码,我认为您已经基本掌握了我的意图。


编辑

创建OracleParameters时,您需要将源列设置为DataTable中列的名称。默认情况下,这是由select语句返回的名称,因此:

var op1 = new OracleParameter {
                                ParameterName = "StudentId",
                                Size = 6,
                                OracleDbType = OracleDbType.Int32,
                                Direction = System.Data.ParameterDirection.Input
                                SourceColumn = "StudentId" // If that's what it's called in the DataTable
                              };
command.Parameters.Add(op1);
AcceptChanges()方法位于DataTable中,HasErrors属性也在其中(它同样存在于DataRowsDataSets中)。 AcceptChanges()方法只是告诉DataTable你已经处理了对数据库的更新,当你调用oracleDataAdapter.Update()时,更改将提交到数据库。你之所以调用AcceptChanges()是为了重置行状态,否则下一次更新DataTable时,你会尝试添加已添加的行。 OracleDataAdapter上的AcceptChangesDuringUpdate属性将在更新数据库时自动调用AcceptChanges()方法。我通常不这样做,因为我习惯在调用AcceptChanges()之前测试HasErrors属性并处理它们。然而,我现在正在阅读AcceptChanges()在更新时被默认调用的内容。我不熟悉有错误的行是如何处理的细节, 是否接受更改或者不接受更改。

@James B - 你在哪里将dataAdapter的数据源设置为dataTable? - abhi
@James:dataTable.AcceptChanges()会有效地将所有的rows设置为已添加吗? - IAbstract
你不需要...就像你调用dataAdapter.Fill(dataTable)一样,你可以调用oracleDataAdapter.Update(dataTable)。 - James King
不,那样做会产生相反的效果... AcceptChanges() 会将所有标记为“已添加”、“已修改”等状态的行设置为“未更改”。在调用了 oracleDataAdapter.Update(dataTable) 并且所有行都成功更新后,您需要调用 AcceptChanges()(使用 DataTable 的 HasErrors 属性来确定是否有任何行失败)。 - James King
@JamesB,我已经修改了我的代码,请看一下。我已经成功地在学生表中插入了行,但所有列都为空。OracleDataAdapter上没有AcceptChanges()方法。有两个属性AcceptChangesDuringFill和AcceptChangesDuringUpdate。AcceptChanges是在dataRow上的一个方法。 - abhi
谢谢JamesB。我在我的代码中漏掉了SourceColumn="StudentID"。现在我已经更改了我的代码,行不再被填充为NULL值。 - abhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接