Выполнение нескольких запросов ADO.NET на лету - PullRequest
0 голосов
/ 19 ноября 2010

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

Дело в том, что я хочу показать соответствующую информацию, например, если он вводит что-то вроде:

SELECT * FROM server;
UPDATE server SET name = 'Kojak';

Получает:

  1. Выбранные строки
  2. Количество строк, на которые повлияло ОБНОВЛЕНИЕ

Мой цикл печати выглядиткак:

reader = cmd.ExecuteReader();
do
{

    while (reader.Read())
    {
        if (!(reader.RecordsAffected > 0))
        {
            for (int i = 0; i < reader.FieldCount; i++)
                host.WriteLine("Field " + i + ": " + reader[i].ToString());
        }
        else {
            host.WriteLine(reader.RecordsAffected.ToString() + " Affected rows.");
        }
    }                    
} while (reader.NextResult());
host.WriteLine("Block executed successfuly");

Дело в том, что мне не удается сделать различие между SELECT и UPDATE, потому что reader.Read () возвращает FALSE, когда достигает второго запроса.Как я могу решить эту проблему и получить количество затронутых строк при наличии запроса UPDATE / DELETE / INSERT?

Спасибо.

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Вы не можете использовать cmd.ExecuteReader() для выполнения запросов. Вам нужно использовать ExecuteNonQuery().

Я бы подумал, что вам нужно будет проанализировать список операторов SQL, чтобы определить, какой это тип команды (например, SELECT или UPDATE), и вызвать соответствующий метод.

0 голосов
/ 22 ноября 2010

@ Дэвид: вот как я это сделал:

public int Execute(String block, dbStudio.components.DbsTab host)
{
    this.Connect();
    DbCommand cmd = this.dbConnection.CreateCommand();
    DbDataReader reader = null;

    cmd.CommandText = block;
    int ret = -1;

    try
    {
        long ticks = DateTime.Now.Ticks;
        reader = cmd.ExecuteReader();
        do
        {
            while (reader.Read())
            {
                String str = "";
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    //host.WriteLine("Field " + i + ": " + reader[i].ToString());
                    str = str + reader[i].ToString() + "    ";
                }
                host.WriteLine(str);
            }
        } while (reader.NextResult());

        host.WriteLine("Block executed successfuly");
        host.WriteLine(reader.RecordsAffected.ToString() + " Affected rows.");
        host.WriteLine(((DateTime.Now.Ticks - ticks) / 1000).ToString() + "ms");

        ret = reader.RecordsAffected;
    }
    catch (Exception e)
    {
        host.WriteLine(e.Message);
    }
    finally
    {
        this.Disconnect();
    }
    return ret;
}
...