我有一个包含一些记录的已断开连接的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
填充此表。
我可以使用命令Object和insert语句来完成它。例如这段代码:
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;
}
}
是否有更快捷,更简单的方法可以循环播放记录?
答案 0 :(得分:2)
在第一段代码中,您正在设置SelectCommand
。还有InsertCommand
,UpdateCommand
和DeleteCommand
。
这些命令也存在于OracleDataAdapter
个对象上......由于DataTable
是端点中立的,所以您需要创建一个OracleCommand
来进行插入,设置它作为OracleDataAdapter's
InsertCommand
,并致电oracleDataAdapter.Update(dataTable)
。
在检查时会更详细地修改它。
设置InsertCommand
的一个好例子是here。请注意,向命令添加参数时,传递给.Add( ... )
的最后一个值是要映射到的列的名称。
由于您要将数据检索到DataTable
,但未对其进行更改,因此在调用RowState
之前,您需要将每行的oracleDataAdapter.Update()
更改为“已添加”。你需要做这样的事情:
foreach (DataRow row in dataTable.Rows) {
row.SetAdded();
}
如果你需要更多的代码示例,请告诉我...从你发布的代码中,我认为你已经掌握了我要去的地方的要点。
修改强>
创建OracleParameters时,需要将source列设置为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时,您将尝试添加已添加的行。
AcceptChangesDuringUpdate
上的属性OracleDataAdapter
将自动调用AcceptChanges()
作为数据库更新的一部分...我通常不这样做,因为我已经习惯了测试HasErrors
属性并在调用AcceptChanges()
之前处理这些属性...但是我现在正在读取在更新时默认调用AcceptChanges()
。如果接受更改,我不熟悉如何处理错误行的详细信息。