例如;
  现在编了一个服务机器程序已经打开了(装在服务器上),
  客户端 没有SQl 是连接的 服务器的数据库!
  如果服务器突然掉线,客户端会包错误
请问这个错误,用什么方法可以抓到了!???
请帮忙谢谢`~~~~~

解决方案 »

  1.   

    using System;
    using System.Data;
    using System.Data.SqlClient;
    namespace FSSoft.Common.DataBase.SqlserverClient
    {
    using FSSoft.Common.DataBase.Config;
    using FSSoft.Common.TextUtil;
    using FSSoft.Common.IO;
    /// <summary>
    /// Sqlserver數據庫連接操作類。
    /// </summary>
    public class SQLcon
    {
    private SqlConnection connection=null;
    /// <summary>
    /// 取得打開的連接對象。
    /// </summary>
    public  SqlConnection Connection
    {
    get
    {
    if(ConOpen())
    return connection;
    else
    throw new Exception(ConfigRead.StrValue(Consts.CONFIG_CON_ERROR_KEY));
    }
    }
    /// <summary>
    /// 打開連接。
    /// </summary>
    /// <returns>true:打開連接成功;false:打開連接失敗。</returns>
    public bool ConOpen()
    {
    try
    {
    if(connection==null)
    {
    connection=new SqlConnection();
    connection.ConnectionString = DBConfigInfo.SqlserverConnectionString;
    }
    switch(connection.State)
    {
    case ConnectionState.Closed:
    connection.Open();
    break;
    case ConnectionState.Broken:
    connection.Close();
    connection.Open();
    break;
    }
    return true;
    }
    catch(Exception e)
    {
    Console.WriteLine(e.Message);
    return false;
    }
    }
    /// <summary>
    /// 關閉連接。
    /// </summary>
    /// <returns>true:關閉連接成功;false:關閉連接失敗。</returns>
    public bool ConClose()
    {
    if(connection==null||connection.State==ConnectionState.Closed)
    return true;
    try
    {
    connection.Close();
    return true;
    }
    catch(Exception e)
    {
    Console.WriteLine(e.Message);
    return false;
    }
    }
    }
    /// <summary>
    /// 提供數據庫查詢,並把相關的結果集賦予Sys_DS對象或預定義的DataTable對象。
    /// </summary>
    public class SQLselect:SQLcon
    {
    private SqlDataAdapter sys_Adapter=null;
    private DataSet sys_DS=null;
    /// <summary>
    /// 查詢適配器對象取得。
    /// </summary>
    public SqlDataAdapter Sys_Adapter
    {
    get
    {
    return sys_Adapter;
    }
    }
    /// <summary>
    /// 查詢結果集對象取得。
    /// </summary>
    public DataSet Sys_DS
    {
    get
    {
    return sys_DS;
    }
    }
    /// <summary>
    /// 構造函數。
    /// </summary>
    public SQLselect()
    {
    sys_DS=new DataSet();
    sys_Adapter=new SqlDataAdapter();
    sys_Adapter.SelectCommand=new SqlCommand();
    sys_Adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    }
    /// <summary>
    /// 释放资源。
    /// </summary>
    ~SQLselect()
    {
    sys_Adapter.Dispose();
    sys_DS.Dispose();
    }
    /// <summary>
    /// 執行查詢並填充結果集至Sys_DS。
    /// </summary>
    /// <param name="sql">SQL語句。</param>
    /// <param name="tableName">自定義TableName。</param>
    public void Fill_DS(String sql,String tableName)
    {
    FillSQL(sql,tableName);
    sys_Adapter.Fill(sys_DS, tableName);
    sys_Adapter.SelectCommand.Parameters.Clear();
    }
    /// <summary>
    /// 執行有選擇記錄查詢並填充結果集至Sys_DS。
    /// </summary>
    /// <param name="sql">SQL語句。</param>
    /// <param name="tableName">自定義TableName。</param>
    /// <param name="startRecord">記錄開始索引。</param>
    /// <param name="maxRecords">記錄條數。</param>
    public void Fill_DS(String sql,String tableName,int startRecord,int maxRecords)
    {
    FillSQL(sql,tableName);
    sys_Adapter.Fill(sys_DS,startRecord,maxRecords,tableName);
    sys_Adapter.SelectCommand.Parameters.Clear();
    }
    /// <summary>
    /// 需繼承,提供查詢前的準備工作。
    /// </summary>
    /// <param name="sql">SQL語句。</param>
    /// <param name="tableName">自定義TableName。</param>
    protected void FillSQL(String sql,String tableName)
    {
    Console.WriteLine(Consts.CONSOLE_SQL+sql);
    sys_Adapter.SelectCommand.CommandText=sql;
    sys_Adapter.SelectCommand.Connection=Connection;
    if(tableName!=null)
    {
    if(sys_DS.Tables.Contains(tableName))
    {
    sys_DS.Tables[tableName].Clear();
    }
    }
    }
    }
    /// <summary>
    /// 提供添加、刪除、修改功能類。
    /// </summary>
    public sealed class SQLTransaction:SQLcon
    {
    private SqlCommand sys_command=null;
    private SqlTransaction sys_trans=null;
    /// <summary>
    /// Command對象取得。
    /// </summary>
    public SqlCommand Sys_command
    {
    get
    {
    return sys_command;
    }
    }
    /// <summary>
    /// 事務對象取得。
    /// </summary>
    public SqlTransaction Sys_Trans
    {
    get
    {
    return sys_trans;
    }
    }
    /// <summary>
    /// 構造函數。
    /// </summary>
    public SQLTransaction()
    {
    sys_command=new SqlCommand();
    }
    /// <summary>
    /// 開始事務。
    /// </summary>
    public void SetSQLBeginTrans()
    {
    sys_trans = Connection.BeginTransaction();
    sys_command.Transaction = sys_trans;
    }
    /// <summary>
    /// 提交事務。
    /// </summary>
    public void SetSQLCommitTrans()
    {
    sys_trans.Commit();
    }
    /// <summary>
    /// 回滾事務。
    /// </summary>
    public void SetSQLRollBack()
    {
    sys_trans.Rollback();
    }
    /// <summary>
    /// 執行數據操作。
    /// </summary>
    /// <param name="sql">SQL語句。</param>
    /// <returns>返回受影響的數據行數。</returns>
    public int Operate(String sql)
    {
    Console.WriteLine(Consts.CONSOLE_SQL+sql);
    sys_command.CommandText = sql;
    sys_command.Connection = Connection;
    sys_command.CommandType=CommandType.Text;
    int OperateCount=sys_command.ExecuteNonQuery();
    sys_command.Parameters.Clear();
    return OperateCount;
    }
    }
    /// <summary>
    /// 提供數據庫高速檢索及存儲過程執行的功能類。
    /// </summary>
    public sealed class SQLreader:SQLcon
    {
    private SqlCommand sys_command=null;
    private SqlDataReader sys_rdr=null;
    /// <summary>
    /// Command對象取得。
    /// </summary>
    public SqlCommand Sys_command
    {
    get
    {
    return sys_command;
    }
    }
    /// <summary>
    /// DataReader對象取得。
    /// </summary>
    public SqlDataReader Sys_rdr
    {
    get
    {
    return sys_rdr;
    }
    }
    /// <summary>
    /// 構造函數。
    /// </summary>
    public SQLreader()
    {
    sys_command=new SqlCommand();
    }
    private void setCommand(String setStr)
    {
    Console.WriteLine(Consts.CONSOLE_SQL+setStr);
    sys_command.CommandText = setStr;
    sys_command.Connection = Connection;
    sys_command.CommandType=CommandType.Text;
    }
    private void setProcedureCommand(String ProcedureName)
    {
    Console.WriteLine(Consts.CONSOLE_PROCE+ProcedureName);
    sys_command.CommandText = ProcedureName;
    sys_command.Connection = Connection;
    sys_command.CommandType=CommandType.StoredProcedure;
    }
    /// <summary>
    /// 執行高速檢索。
    /// </summary>
    /// <param name="sql">SQL語句。</param>
    public void Read_Form(String sql)
    {
    setCommand(sql);
    sys_rdr = sys_command.ExecuteReader();
    }
    /// <summary>
    /// 執行高速檢索(對大型Blob數據比較適用)。
    /// </summary>
    /// <param name="sql">SQL語句。</param>
    public void Read_BlobForm(String sql)
    {
    setCommand(sql);
    sys_rdr = sys_command.ExecuteReader(CommandBehavior.SequentialAccess);
    }
    /// <summary>
    /// 執行存儲過程。
    /// </summary>
    /// <param name="ProcedureName">存儲過程名稱。</param>
    public void Operate_Procedure(String ProcedureName)
    {
    setProcedureCommand(ProcedureName);
    sys_rdr =sys_command.ExecuteReader();
    }
    /// <summary>
    /// 關閉Sys_rdr對象。
    /// </summary>
    public void CloseReader()
    {
    sys_command.Parameters.Clear();
    if(StringConvert.IsNull(sys_rdr))
    return;
    if(!sys_rdr.IsClosed)
    {
    sys_rdr.Close();
    }
    }
    }
    }
      

  2.   

    try
    {
    .....
    }
    catch(System.Exception ex)
    {
    .....
    }
    catch
    {
    }
    这样可以捕到很多的错误!!
      

  3.   

    在客户端每隔1分钟(设定)ping一下服务器,在ping的方法里检查服务器的数据库是否正常运行就可以了。如果ping失败,则客户端给出错误信息即可。
      

  4.   

    一楼的可真详细,使用try....catch...语法就可以处理