簡體   English   中英

枚舉SQL Server實例

[英]Enumerating sql server instances

我正在嘗試在odbc中查詢“可見”數據庫實例。 下面在多個不同的系統上進行了嘗試。 它在所有系統上都返回一些,但是在大多數情況下,並不是所有都可以找到。 特別是在某些系統上,它不返回本地數據庫實例。 SQLBrowseConnect的局限性是什么? 我知道數據庫存在,SQL Browser運行,我可以連接到實例,它顯示在SQL Manager窗口中,但是它對SQLBrowseConnect不可見。 我也嘗試過使用SqlDataSourceEnumerator,它也有局限性,尤其是在SQLServer 2014實例上使用時,它返回一個空列表(可能是由於我在.NET 4.0中的事實)。

編輯:應該提到的是SqlDataSourceEnumerator.Instance.GetDataSources()在odbc找不到時找到本地數據庫。

枚舉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);
}

我遇到了同樣的問題,深入研究之后,發現最大Outconnection大小小於return stringLength2Ptr,這是被截斷的原因。

因此,請檢查您的返回stringLength2Ptr大小,並將最大大小分配給outconnection。 如果返回的stringLength2Ptr大小較大,並且您嘗試獲取OutConnection的字符串數據,則它將無法返回完整的字符串。 我不知道您如何使用外部連接字符串數據。

如果(SQL_NEED_DATA == SQLBrowseConnect(m_connectionHandle,inConnection,stringLength,outConnection, 4 * DEFAULT_RESULT_SIZEout stringLength2Ptr )){}

就我而言,越來越多的外部連接解決了我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM