我正在尝试查询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);
}
答案 0 :(得分:1)
我有同样的问题,在深入挖掘后,我发现最大的Outconnection大小小于返回stringLength2Ptr,这是一个被截断的原因。
因此请检查返回的stringLength2Ptr大小并将最大大小指定为outconnection。如果返回stringLength2Ptr大小较大并且您尝试获取OutConnection的字符串数据,那么它将无法返回完整字符串。 我不知道你如何使用你的outconnection字符串数据。
if(SQL_NEED_DATA == SQLBrowseConnect(m_connectionHandle,inConnection,stringLength,outConnection, 4 * DEFAULT_RESULT_SIZE ,输出stringLength2Ptr )) { }
在我的情况下,增加联系已经解决了我的问题。