gpt4 book ai didi

c# - 使用 DataAdapter 填充表

转载 作者:行者123 更新时间:2023-11-30 17:18:24 24 4
gpt4 key购买 nike

我有一个断开连接的 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 的一个很好的例子是here .请注意,当您向命令添加参数时,您传递给 .Add( ... ) 的最后一个值是您要映射到的列的名称。

因为您要将数据检索到 DataTable 中, 但不改变它,你需要改变 RowState在调用 oracleDataAdapter.Update() 之前将每一行的“已添加” .你需要做这样的事情:

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 时,您将尝试添加已添加的行。

属性(property)AcceptChangesDuringUpdateOracleDataAdapter 上会自动调用AcceptChanges()作为数据库更新的一部分...我通常不这样做,因为我习惯于测试 HasErrors属性并在调用之前处理这些 AcceptChanges() ...但是我正在阅读AcceptChanges()现在在更新时默认调用。我不熟悉如何处理错误行的详细信息,是否接受更改。

关于c# - 使用 DataAdapter 填充表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5795691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com