zoukankan      html  css  js  c++  java
  • 获取Sql服务器列表 (C#)

    private void button1_Click_1(object sender, System.EventArgs e)
    {
     
    string[] servers = DBGrep.SqlLocator.GetServers();
     
    foreach ( string s in servers )
    {
     
    this.listBox1.Items.Add(s);
    }

    }

    类的代码

    using System;using System.Text; using System.Windows.Forms;using System.Runtime.InteropServices;
    namespace DBGrep
    {  public class SqlLocator
    {  [DllImport("odbc32.dll")]  private static extern short SQLAllocHandle(short hType, IntPtr inputHandle, out IntPtr outputHandle);
      [DllImport(
    "odbc32.dll")]
      
    private static extern short SQLSetEnvAttr(IntPtr henv, int attribute, IntPtr valuePtr, int strLength);
      [DllImport(
    "odbc32.dll")]
     
    private static extern short SQLFreeHandle(short hType, IntPtr handle); 
    [DllImport(
    "odbc32.dll",CharSet=CharSet.Ansi)]
    private static extern short SQLBrowseConnect(IntPtr hconn, StringBuilder inString, 
    short inStringLength, StringBuilder outString, short outStringLength,
    out short outLengthNeeded);

    private const short SQL_HANDLE_ENV = 1;
    private const short SQL_HANDLE_DBC = 2;
    private const int SQL_ATTR_ODBC_VERSION = 200;
    private const int SQL_OV_ODBC3 = 3;
    private const short SQL_SUCCESS = 0;
    private const short SQL_NEED_DATA = 99;
    private const short DEFAULT_RESULT_SIZE = 1024;
    private const string SQL_DRIVER_STR = "DRIVER=SQL SERVER";
    private SqlLocator(){}
    public static string[] GetServers()
    {
    string[] retval = null;
    string txt = string.Empty;
    IntPtr henv 
    = IntPtr.Zero;
    IntPtr hconn 
    = IntPtr.Zero;
    StringBuilder inString 
    = new StringBuilder(SQL_DRIVER_STR);
    StringBuilder outString 
    = new StringBuilder(DEFAULT_RESULT_SIZE);
    short inStringLength = (short) inString.Length;
    short lenNeeded = 0;
    try
    {
    if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_ENV, henv, out henv))
    {
    if (SQL_SUCCESS == SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(IntPtr)SQL_OV_ODBC3,0))
    {
    if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_DBC, henv, out hconn))
    {
    if (SQL_NEED_DATA == SQLBrowseConnect(hconn, inString, inStringLength, outString, 
    DEFAULT_RESULT_SIZE, 
    out lenNeeded))
    {
    if (DEFAULT_RESULT_SIZE < lenNeeded)
    {
    outString.Capacity 
    = lenNeeded;
     
    if (SQL_NEED_DATA != SQLBrowseConnect(hconn, inString, inStringLength, outString, 
     lenNeeded,
    out lenNeeded))
    {
     
    throw new ApplicationException("Unabled to aquire SQL Servers from ODBC driver.");
    }
     
     }

     txt 
    = outString.ToString();
     
    int start = txt.IndexOf("{"+ 1;
     
    int len = txt.IndexOf("}"- start;
     
    if ((start > 0&& (len > 0))
    {
    txt 
    = txt.Substring(start,len);
    }

     
    else
    {
    txt 
    = string.Empty;
    }

    }
     
    }

    }
     
    }

    }

    catch (Exception ex)
    {
     
    //Throw away any error if we are not in debug mode
    #if (DEBUG)
    MessageBox.Show(ex.Message,
    "Acquire SQL Servier List Error");
    #endif 
    txt 
    = string.Empty;
    }

    finally
    {
    if (hconn != IntPtr.Zero)
    {
    SQLFreeHandle(SQL_HANDLE_DBC,hconn);
    }

    if (henv != IntPtr.Zero)
    {
     SQLFreeHandle(SQL_HANDLE_ENV,hconn);
    }

     }

     
    if (txt.Length > 0)
    {
     retval 
    = txt.Split(",".ToCharArray());
     }


    return retval;
    }

    }

    }


  • 相关阅读:
    C# MessageBox.Show()超时后 自动关闭
    WPF中的依赖属性和附加属性
    c# 获取当前活动窗口句柄,获取窗口大小及位置
    c# 数组间相互转换 int[] string[] object[]
    WPF中判断DataGrid增加复选框和头部全选,以及判断哪一行的checkbox被选中
    WPF DataGridTemplateColumn添加按钮和按钮事件获取行参数
    WPF 自定义分页控件 ---- DataPager
    WPF的MVVM模式给ComboBox绑定数据和读取
    DataBinding 绑定计算表达式
    c# 调用方法超时直接返回的功能
  • 原文地址:https://www.cnblogs.com/gwazy/p/111127.html
Copyright © 2011-2022 走看看