枚举sql server实例

时间:2015-11-23 19:10:42

标签: c# sql-server

我正在尝试查询odbc以显示"可见"数据库实例。以下尝试过多个不同的系统。它会在所有系统上返回一些,但在大多数情况下并不是所有系统都能找到。特别是在某些系统上,它不返回本地数据库实例。 SQLBrowseConnect有哪些限制?我知道数据库存在,SQL浏览器运行,我可以连接到实例,它显示在SQL管理器窗口中,但它对SQLBrowseConnect是不可见的。我也尝试过使用SqlDataSourceEnumerator,它也有局限性,特别是在SQLServer 2014实例上使用它时会返回一个空列表(可能是因为我的代码在.NET 4.0中)。

编辑:应该提到的是,当odbc没有时,SqlDataSourceEnumerator.Instance.GetDataSources()会找到本地数据库。

枚举SQL Server实例的防弹方法是什么?

IntPtr m_environmentHandle = IntPtr.Zero;
IntPtr m_connectionHandle = IntPtr.Zero;
StringBuilder inConnection = new StringBuilder(InputParam);
short stringLength = (short) inConnection.Length;
StringBuilder outConnection = new StringBuilder(4 * DEFAULT_RESULT_SIZE);
short stringLength2Ptr = 0;

try
{
     if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_ENV, m_environmentHandle, out m_environmentHandle))
     {
        if (SQL_SUCCESS ==
               SQLSetEnvAttr(m_environmentHandle, SQL_ATTR_ODBC_VERSION, (IntPtr) SQL_OV_ODBC3, 0))
        {
             if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_DBC, m_environmentHandle, out m_connectionHandle))
             {
                  if (SQL_NEED_DATA ==
                      SQLBrowseConnect(m_connectionHandle, inConnection, stringLength, outConnection,
                      4 * DEFAULT_RESULT_SIZE, out stringLength2Ptr))
                  {
                      var sqlState = new StringBuilder(DEFAULT_RESULT_SIZE);
                      var sqlMessage = new StringBuilder(DEFAULT_RESULT_SIZE);
                      var info = SQLGetDiagRec(SQL_HANDLE_ENV, m_connectionHandle, 1, sqlState, IntPtr.Zero, sqlMessage, DEFAULT_RESULT_SIZE, IntPtr.Zero);
                      if (SQL_NEED_DATA !=
                          SQLBrowseConnect(m_connectionHandle, inConnection, stringLength, outConnection,
                                    DEFAULT_RESULT_SIZE, out stringLength2Ptr))
                      {
                         throw new ApplicationException("No Data Returned.");
                      }
                  }
             }
        }
    }
}

catch (Exception ex)
{
    throw new ApplicationException("Cannot Locate SQL Server.");
}
finally
{
    if (m_connectionHandle!= IntPtr.Zero)
        SQLFreeHandle(SQL_HANDLE_DBC, m_connectionHandle);
    if (environmentHandle!= IntPtr.Zero)
        SQLFreeHandle(SQL_HANDLE_DBC, environmentHandle);
}

1 个答案:

答案 0 :(得分:1)

我有同样的问题,在深入挖掘后,我发现最大的Outconnection大小小于返回stringLength2Ptr,这是一个被截断的原因。

因此请检查返回的stringLength2Ptr大小并将最大大小指定为outconnection。如果返回stringLength2Ptr大小较大并且您尝试获取OutConnection的字符串数据,那么它将无法返回完整字符串。 我不知道你如何使用你的outconnection字符串数据。

if(SQL_NEED_DATA ==                       SQLBrowseConnect(m_connectionHandle,inConnection,stringLength,outConnection,                        4 * DEFAULT_RESULT_SIZE 输出stringLength2Ptr ))                   { }

在我的情况下,增加联系已经解决了我的问题。