SQL-оператор для проверки подключения? - PullRequest
7 голосов
/ 04 ноября 2008

Я ищу фиктивный оператор SQL, который будет работать с подключением C # SQL для проверки подключения.

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

Сценарий, для которого я тестирую, - это потеря соединения с базой данных, где свойство состояния SQLConnections по-прежнему остается «открытым», но соединения нет.

Ответы [ 9 ]

8 голосов
/ 04 ноября 2008

Вы можете сделать это:

Select 1

Хорошо, как насчет отправки пустой строки или пробела. Это действительные команды для Sql Server.

5 голосов
/ 04 ноября 2008

В большинстве баз данных SQL для этой цели есть «таблица».

В DB2 это:

select * from sysibm.sysdummy1

, в то время как у Oracle по памяти

select * from dual

Это будет зависеть от базы данных на сервере.

2 голосов
/ 04 ноября 2008

Самый простой способ - выполнить выбор, который ничего не делает.

SELECT N'Test'
2 голосов
/ 04 ноября 2008

Потеря связи может произойти в любое время.

Что, если предложенные операторы SELECT выполняются нормально, но соединение разрывается сразу после (успешного) их выполнения?

1 голос
/ 04 ноября 2008

выберите getdate ()

1 голос
/ 04 ноября 2008

Вы должны получить сообщение об ошибке, если вы не можете открыть новое соединение, потому что база данных недоступна.

Мне кажется, что вы постоянно открываете соединение (что, как правило, является плохой идеей - новое соединение должно быть открыто до выполнения пакета). Это тот случай?

0 голосов
/ 06 ноября 2008

Один из способов выяснить, существует ли еще соединение с базой данных, - попытаться выполнить некоторую операцию над соединением. Если соединение разорвано, свойство ConnectionState по-прежнему остается «открытым», но когда вы попытаетесь что-то с ним сделать, вы получите исключение. Например:

SqlConnection sqlConn;
    private bool dbConnectionExists() {
        try
        {
            sqlConn.ChangeDatabase("MyDBname");
            return true;
        }
        catch
        {
            return false;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (dbConnectionExists())
        {
            // Connection ok so do something            
        }
    }

Свойство connectionState изменяется на «Закрыто» после выполнения операции такого типа и дает сбой, поэтому вы можете проверить состояние, если хотите, а также.

Надеюсь, это поможет.

0 голосов
/ 04 ноября 2008

Пример кода Delphi, который, я надеюсь, будет легко адаптировать:

function IsConnValid(var Conn: TADOConnection; DBType: TDBType): boolean;
var
  qry : TADOQuery;
begin
  //gimme a connection, and i'll create a query, try to retrieve dummy data.
  //if retrieval works, return TRUE. otherwise, return FALSE.
  qry := TADOQuery.Create(nil);
  try
    qry.Connection := Conn;

    case DBType of
      //syntax for a dummy query varies by vendor.
      dbOracle    : qry.Sql.Add('SELECT 1 FROM DUAL');
      dbSqlServer : qry.Sql.Add('SELECT 1');
    end;  //case

    try
      qry.Open;
      //try to open the query.
      //if we lost the connection, we'll probably get an exception.
      Result := not(qry.Eof);  //a working connection will NOT have EOF.
      qry.Close;
    except on e : exception do
      //if exception when we try to open the qry, then connection went bye-bye.
      Result := False;
    end;  //try-except
  finally
    qry.Free;
  end;  //try-finally
end;
0 голосов
/ 04 ноября 2008

Было бы лучше отловить несвязанное исключение вашей реализации для КАЖДОГО SQL-оператора, который вы выполняете, а не использовать фиктивный оператор для проверки возможности подключения. Я видел системы, в которых свыше 10% процессорного времени базы данных тратится на ответы на эти фиктивные запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...