2008-11-04 2 views
6

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

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

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

ответ

4

Для большинства баз данных SQL для этого используется «таблица».

В DB2, это:

select * from sysibm.sysdummy1 

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

select * from dual 

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

7

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

Select 1 

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

+0

Отлично подходит для SQL Server, но это не сработает для DB2 или Oracle. См. Ответ Pax Diablo. – Dave 2008-11-04 12:56:34

1

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

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

+0

Да, новое соединение открывается, когда начинается партия, но партия может занять 15 минут. – 2008-11-04 13:28:52

+0

ОК ... так что тогда? отменяет ли абонент через несколько минут? Является ли ваш тайм-аут соединения достаточно высоким? (по умолчанию он равен 2 минутам. – StingyJack 2008-11-04 14:20:58

2

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

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

1

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

SELECT N'Test' 
0

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

0

Пример 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

Один из способов узнать, если подключение к базе данных до сих пор на самом деле существует, чтобы попытаться выполнить некоторые операции по подключению , Если соединение скончалось, свойство 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 на «Закрыто», как только этот тип операции выполняется и не так, то вы можете проверить состояние, если вы хотите, как хорошо.

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

Смежные вопросы