使用DataAdapter填充表
本文关键字:填充 DataAdapter 使用 | 更新日期: 2023-09-27 17:52:58
我有一个包含一些记录的断开连接的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;
}
}
是否有一个更快,更容易的方法,我将不必通过记录循环?
在您的第一个代码块中,您正在设置SelectCommand
。还有InsertCommand
、UpdateCommand
和DeleteCommand
。
这些命令也存在于OracleDataAdapter
对象上…由于DataTable
是端点中立的,因此您所需要做的就是创建OracleCommand
来执行插入,将其设置为OracleDataAdapter's
InsertCommand
,并调用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
属性也是(它也存在于DataRows
和DataSets
上)。
AcceptChanges()
只告诉DataTable你已经处理了对数据库的更新…当您调用oracleDataAdapter.Update()
时,更改被提交到数据库。调用AcceptChanges()
的原因是重置行状态…否则,下次更新DataTable时,您将尝试添加已经添加的行。
OracleDataAdapter
上的AcceptChangesDuringUpdate
属性将自动调用AcceptChanges()
作为更新数据库的一部分…我通常不这样做,因为我习惯于测试HasErrors
属性并在调用AcceptChanges()
之前处理这些属性…然而,我读到AcceptChanges()
在默认情况下被称为现在的更新。我不熟悉如何处理出错行的细节,无论更改是否被接受。