You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从MSSQL填充的DataGridView中实现IP转DNS的方法?

把IP地址转换为DNS域名的两种实用方案

嘿,我看你现在是用SQL查询填充DataGridView,想要把解析出来的IP地址转成对应的DNS域名对吧?这里有两种方案,我优先推荐你用C#代码层处理的方式,更灵活也更安全:

方案一:在C#代码中处理(推荐)

在应用层做反向DNS解析会比在SQL端处理更可控,还能避免数据库层面的安全风险,步骤很清晰:

  1. 简化你的SQL查询:先把存储的分段IP转成标准的IP字符串就行,不用原来那么多层嵌套的CAST,简化后的SQL如下:

    SELECT TOP(10)
        -- 拼接成标准Source IP
        CAST(SUBSTRING([nSrcIPAddress], 1, 1) AS INT) + '.' + 
        CAST(SUBSTRING([nSrcIPAddress], 2, 1) AS INT) + '.' + 
        CAST(SUBSTRING([nSrcIPAddress], 3, 1) AS INT) + '.' + 
        CAST(SUBSTRING([nSrcIPAddress], 4, 1) AS INT) AS SourceIP,
        -- 同理拼接Destination IP
        CAST(SUBSTRING([nDstIPAddress], 1, 1) AS INT) + '.' + 
        CAST(SUBSTRING([nDstIPAddress], 2, 1) AS INT) + '.' + 
        CAST(SUBSTRING([nDstIPAddress], 3, 1) AS INT) + '.' + 
        CAST(SUBSTRING([nDstIPAddress], 4, 1) AS INT) AS DestinationIP
    FROM 你的表名称
    
  2. 在C#中解析DNS并绑定数据:修改你的btnGo_Click方法,先获取IP数据,再逐个解析域名,还要处理解析失败的情况(毕竟不是所有IP都有反向DNS记录):

    using System.Net; // 别忘了引用这个命名空间
    using System.Data.SqlClient;
    using System.Data;
    
    private void btnGo_Click(object sender, EventArgs e)
    {
        string connStr = "你的数据库连接字符串";
        string query = @"SELECT TOP(10)
            CAST(SUBSTRING([nSrcIPAddress],1,1) AS INT) + '.' + 
            CAST(SUBSTRING([nSrcIPAddress],2,1) AS INT) + '.' + 
            CAST(SUBSTRING([nSrcIPAddress],3,1) AS INT) + '.' + 
            CAST(SUBSTRING([nSrcIPAddress],4,1) AS INT) AS SourceIP,
            CAST(SUBSTRING([nDstIPAddress],1,1) AS INT) + '.' + 
            CAST(SUBSTRING([nDstIPAddress],2,1) AS INT) + '.' + 
            CAST(SUBSTRING([nDstIPAddress],3,1) AS INT) + '.' + 
            CAST(SUBSTRING([nDstIPAddress],4,1) AS INT) AS DestinationIP
        FROM 你的表名称";
    
        DataTable dataTable = new DataTable();
        // 用using确保资源自动释放
        using (SqlConnection conn = new SqlConnection(connStr))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(query, conn))
            {
                dataTable.Load(cmd.ExecuteReader());
            }
        }
    
        // 给DataTable添加域名列
        dataTable.Columns.Add("SourceDomain", typeof(string));
        dataTable.Columns.Add("DestinationDomain", typeof(string));
    
        // 遍历每行解析DNS
        foreach (DataRow row in dataTable.Rows)
        {
            string sourceIp = row["SourceIP"].ToString();
            try
            {
                IPHostEntry hostEntry = Dns.GetHostEntry(sourceIp);
                row["SourceDomain"] = hostEntry.HostName;
            }
            catch (SocketException)
            {
                // 解析失败时显示原IP并标注
                row["SourceDomain"] = $"{sourceIp} (无反向DNS记录)";
            }
    
            string destIp = row["DestinationIP"].ToString();
            try
            {
                IPHostEntry hostEntry = Dns.GetHostEntry(destIp);
                row["DestinationDomain"] = hostEntry.HostName;
            }
            catch (SocketException)
            {
                row["DestinationDomain"] = $"{destIp} (无反向DNS记录)";
            }
        }
    
        // 绑定到DataGridView
        dataGridView1.DataSource = dataTable;
    }
    

方案二:在SQL中处理(不推荐,有局限性)

如果你一定要在SQL层面完成解析,也有办法,但要注意安全和性能问题:

子方案1:使用CLR集成函数

SQL Server本身没有内置的反向DNS函数,你可以通过CLR集成来扩展:

  1. 先写一个C#类库,实现反向解析的逻辑:
    using System;
    using System.Data.SqlTypes;
    using System.Net;
    using Microsoft.SqlServer.Server;
    
    public class DnsHelper
    {
        [SqlFunction(DataAccess = DataAccessKind.None)]
        public static SqlString ReverseLookup(SqlString ipAddress)
        {
            if (ipAddress.IsNull)
                return SqlString.Null;
    
            try
            {
                IPHostEntry entry = Dns.GetHostEntry(ipAddress.Value);
                return new SqlString(entry.HostName);
            }
            catch
            {
                // 解析失败返回原IP
                return ipAddress;
            }
        }
    }
    
  2. 编译成DLL后,在SQL Server中注册并创建函数:
    -- 先启用CLR集成
    sp_configure 'show advanced options', 1;
    RECONFIGURE;
    sp_configure 'clr enabled', 1;
    RECONFIGURE;
    
    -- 注册你的CLR程序集(替换成实际的DLL路径)
    CREATE ASSEMBLY DnsHelperAssembly FROM 'C:\YourPath\DnsHelper.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS;
    
    -- 创建可调用的SQL函数
    CREATE FUNCTION dbo.ReverseDns(@ip NVARCHAR(15))
    RETURNS NVARCHAR(255)
    AS EXTERNAL NAME DnsHelperAssembly.DnsHelper.ReverseLookup;
    
  3. 然后在你的查询中直接使用这个函数:
    SELECT TOP(10)
        dbo.ReverseDns(
            CAST(SUBSTRING([nSrcIPAddress],1,1) AS INT) + '.' + 
            CAST(SUBSTRING([nSrcIPAddress],2,1) AS INT) + '.' + 
            CAST(SUBSTRING([nSrcIPAddress],3,1) AS INT) + '.' + 
            CAST(SUBSTRING([nSrcIPAddress],4,1) AS INT)
        ) AS SourceDomain,
        dbo.ReverseDns(
            CAST(SUBSTRING([nDstIPAddress],1,1) AS INT) + '.' + 
            CAST(SUBSTRING([nDstIPAddress],2,1) AS INT) + '.' + 
            CAST(SUBSTRING([nDstIPAddress],3,1) AS INT) + '.' + 
            CAST(SUBSTRING([nDstIPAddress],4,1) AS INT)
        ) AS DestinationDomain
    FROM 你的表名称
    
    注意:CLR集成需要较高的数据库权限,EXTERNAL_ACCESS权限也有安全风险,所以只在必要时使用。

子方案2:用xp_cmdshell调用nslookup(强烈不推荐)

这种方法是通过调用系统命令nslookup来解析,但启用xp_cmdshell会带来极大的安全隐患,容易被攻击者利用执行恶意命令,性能也很差,所以只做个了解,绝对不建议在生产环境用:

-- 启用xp_cmdshell(非常危险!)
sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'xp_cmdshell', 1;
RECONFIGURE;

-- 创建解析函数
CREATE FUNCTION dbo.ReverseDns_Cmd(@ip NVARCHAR(15))
RETURNS NVARCHAR(255)
AS
BEGIN
    DECLARE @result NVARCHAR(255), @cmd NVARCHAR(100)
    SET @cmd = 'nslookup ' + @ip + ' 2>&1'
    CREATE TABLE #tempOutput (line NVARCHAR(255))
    INSERT INTO #tempOutput EXEC xp_cmdshell @cmd
    SELECT @result = line FROM #tempOutput WHERE line LIKE '%name =%'
    IF @result IS NOT NULL
        SET @result = LTRIM(RTRIM(SUBSTRING(@result, CHARINDEX('=', @result)+1, 255)))
    ELSE
        SET @result = @ip
    DROP TABLE #tempOutput
    RETURN @result
END

内容的提问来源于stack exchange,提问作者Dwayne Dibbley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:10:54