奇怪的事情与我不得不重建,并从备份恢复数据库服务器发生。
我使用ADODB.Connection,并在其现代化的C#应用EF6指着一个老VB6应用程序,使用应该是什么形式的两个相同的连接字符串,
servername\INSTANCE
当这样运行SQL Server在同一台机器上运行,VB6的应用程序和EF6应用程序都可以使用此连接字符串来连接。
当网络上的另一台机器上运行,VB6的应用程序连接,但EF6应用程序没有。
(与标准“服务器未找到”消息,错误:26 - 错误定位在System.Data.SqlClient.SqlInternalConnectionTds..ctor指定的服务器/实例)
如果我来看看具体实例的端口和连接带
servername,instance_port_number
那么这两个应用程序连接,无论机器我运行它们。 因此,它看起来像是可能与SQL Server浏览器中发生的事情引起的问题。
有没有一种方法可以让我得到某种诊断信息从SQL Server浏览的,什么样的数据它送到哪里,足不出户就来监控所有的网络流量?
对网络跟踪进行故障排除另一种方法是发送一个实例枚举查询到SQL Server Browser服务,并检查结果。 这将验证SQL Server浏览器是通过UDP端口1434和返回的数据包中包含实例名称和所需的客户端端口信息连接到命名实例到达。
运行下面的问题机器上的PowerShell脚本。
# verify UDP port 1433 connectivity and query SQL Server Browser for all instances
Function Get-SqlServerBrowerDatagramForAllInstances($hostNameOrIpAddress)
{
Write-Host "Querying SQL Browser for all instances on host $hostNameOrIpAddress ..."
try
{
$udpClient = New-Object Net.Sockets.UdpClient($hostNameOrIpAddress, 1434)
$bufferLength = 1
$browserQueryMessage = New-Object byte[] 1
$browserQueryMessage[0] = 2
$bytesSent = $udpClient.Send($browserQueryMessage, $browserQueryMessage.Length)
$udpClient.Client.ReceiveTimeout = 10000
$remoteEndPoint = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Broadcast, 0)
$browserResponse = $udpClient.Receive([ref]$remoteEndPoint)
$payloadLength = $browserResponse.Length - 3
$browserResponseString = [System.Text.ASCIIEncoding]::ASCII.GetString($browserResponse, 3, $payloadLength)
$elements = $browserResponseString.Split(";")
Write-Host "SQL Server Browser query results:`r`n"
for($i = 0; $i -lt $elements.Length; $i = $i + 2)
{
if ($elements[$i] -ne "")
{
Write-Host "`t$($elements[$i])=$($elements[$i+1])"
}
else
{
Write-Host ""
# next instance
$i = $i - 1
}
}
}
catch [Exception]
{
Write-Host "ERROR: $($_.Exception.Message)" -ForegroundColor Red
}
}
# verify UDP port 1433 connectivity and query SQL Server Browser for single instance
Function Get-SqlServerBrowerDatagramByInstanceName($hostNameOrIpAddress, $instanceName)
{
Write-Host "Querying SQL Browser for host $hostNameOrIpAddress, instance $instanceName ..."
try
{
$instanceNameBytes = [System.Text.Encoding]::ASCII.GetBytes($instanceName)
$udpClient = New-Object Net.Sockets.UdpClient($hostNameOrIpAddress, 1434)
$bufferLength = $InstanceNameBytes.Length + 2
$browserQueryMessage = New-Object byte[] $bufferLength
$browserQueryMessage[0] = 4
$instanceNameBytes.CopyTo($browserQueryMessage, 1)
$browserQueryMessage[$bufferLength-1] = 0
$bytesSent = $udpClient.Send($browserQueryMessage, $browserQueryMessage.Length)
$udpClient.Client.ReceiveTimeout = 10000
$remoteEndPoint = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Broadcast, 0)
$browserResponse = $udpClient.Receive([ref]$remoteEndPoint)
$payloadLength = $browserResponse.Length - 3
$browserResponseString = [System.Text.ASCIIEncoding]::ASCII.GetString($browserResponse, 3, $payloadLength)
$elements = $browserResponseString.Split(";")
$namedInstancePort = ""
Write-Host "SQL Server Browser query results:`r`n"
for($i = 0; $i -lt $elements.Length; $i = $i + 2)
{
if ($elements[$i] -ne "")
{
Write-Host "`t$($elements[$i])=$($elements[$i+1])"
if($elements[$i] -eq "tcp")
{
$namedInstancePort = $elements[$i+1]
}
}
}
}
catch [Exception]
{
Write-Host "ERROR: $($_.Exception.Message)" -ForegroundColor Red
}
}
Get-SqlServerBrowerDatagramForAllInstances -hostNameOrIpAddress "servername"
Get-SqlServerBrowerDatagramByInstanceName -hostNameOrIpAddress "servername" -instanceName "INSTANCE"
在实体框架6,你可以采取的DbContext对象,这样做。 Yourcontext.Database.log = S => mylogger.Debug(一个或多个);
右手边是一个lambda函数,接受字符串s和记录它。
所有的SQL和参数记录到日志中。