首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DataAdapter填充表

使用DataAdapter填充表
EN

Stack Overflow用户
提问于 2011-04-26 19:53:24
回答 1查看 9.9K关注 0票数 3

我有一个断开连接的dataTable,其中包含一些记录。

我使用下面的函数来获得dataTable

代码语言:javascript
复制
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填充到另一个模式中。

为了这篇文章,假设有一个有两列的表

代码语言:javascript
复制
Create Table Student(StudentId NUMBER(6), StudentName varchar2(50));

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

我可以使用命令对象和insert语句来完成这个任务。例如,这段代码:

代码语言:javascript
复制
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;
    }
} 

有没有一种更快更容易的方法,让我不必翻阅记录?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-26 20:02:53

在第一个代码块中,设置SelectCommand。还有一个InsertCommandUpdateCommandDeleteCommand

这些命令也存在于OracleDataAdapter对象中.由于DataTable与端点无关,您所需要做的就是创建一个OracleCommand来执行插入,将其设置为OracleDataAdapter's InsertCommand,并调用oracleDataAdapter.Update(dataTable)

将修改这与更多的细节,因为我检查他们。

设置InsertCommand的一个很好的例子是这里。注意,当您向命令添加参数时,传递给.Add( ... )的最后一个值是要映射到的列的名称。

因为要将数据检索到DataTable中,而不是对其进行更改,所以在调用oracleDataAdapter.Update()之前,需要将每一行的RowState更改为“添加”。你需要这样做:

代码语言:javascript
复制
foreach (DataRow row in dataTable.Rows) {
    row.SetAdded();
}

如果你需要更多的代码示例请告诉我..。从你发布的代码来看,我想你已经很清楚我要去哪里了。

编辑

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

代码语言:javascript
复制
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上的属性AcceptChanges()将自动调用.我通常不这么做,因为我习惯于测试HasErrors属性并在调用AcceptChanges()之前处理这些属性.不过,我正在读到,默认情况下现在在更新中调用AcceptChanges()。我不熟悉错误行是如何处理的,更改是否被接受的细节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5795691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档