использование DataAdapter для заполнения таблицы - PullRequest
3 голосов
/ 26 апреля 2011

У меня отключен 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 и оператор вставки. Например этот код:

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 голосов
/ 27 апреля 2011

В вашем первом блоке кода вы устанавливаете SelectCommand. Также есть InsertCommand, UpdateCommand и DeleteCommand.

Эти команды также существуют для OracleDataAdapter объектов ... Поскольку DataTable не зависит от конечной точки, все, что вам нужно сделать, это создать OracleCommand для вставки, установите его как OracleDataAdapter's InsertCommand и позвоните oracleDataAdapter.Update(dataTable).

Изменит это с более подробной информацией, когда я проверю их.


Хорошим примером установки InsertCommand является здесь . Обратите внимание, что когда вы добавляете параметры в команду, последнее значение, которое вы передаете .Add( ... ), - это имя столбца, с которым вы сопоставляете.

Поскольку вы извлекаете данные в DataTable, но не меняете их, вам нужно изменить RowState каждой строки на «Добавленные» перед вызовом oracleDataAdapter.Update(). Вам нужно будет сделать что-то вроде этого:

foreach (DataRow row in dataTable.Rows) {
    row.SetAdded();
}

Дайте мне знать, если вам нужно больше примеров кода ... из кода, который вы разместили, я думаю, вы в значительной степени поняли, куда я иду.


Редактировать

Когда вы создаете OracleParameters, вам нужно установить в столбце источника имя столбца в DataTable. По умолчанию это имя, возвращаемое уставом выбора, поэтому:

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() вызывается по умолчанию при обновлении сейчас. Я не знаком с подробностями того, как обрабатываются строки с ошибками, приняты изменения или нет.

...