找回密码
 加入
搜索
查看: 3676|回复: 12

[系统综合] 怎么遍历数据库,找到sql服务器

    [复制链接]
发表于 2017-7-3 16:06:24 | 显示全部楼层 |阅读模式
之前搜到c#的代码,遍历数据库找到sql server 服务器主机名。不够精确,把局域网里面所有装了sql server的机器都搜索出来了。
想搜索数据库名 xxx的服务器,查到服务器名称。
想问问用什么命令查
 楼主| 发表于 2017-7-5 09:57:27 | 显示全部楼层
我粘一下c#的编码,遍历局域网内数据库
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data.Sql;

class Program
{
    static void Main()
    {
        // Retrieve the enumerator instance and then the data.  
        SqlDataSourceEnumerator instance =
          SqlDataSourceEnumerator.Instance;
        System.Data.DataTable table = instance.GetDataSources();

        // Display the contents of the table.  
        DisplayData(table);

        Console.WriteLine("Press any key to continue.");
        Console.ReadKey();
    }

    private static void DisplayData(System.Data.DataTable table)
    {
        foreach (System.Data.DataRow row in table.Rows)
        {
            foreach (System.Data.DataColumn col in table.Columns)
            {
                Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
            }
            Console.WriteLine("============================");
        }
    }
}
 楼主| 发表于 2017-7-5 10:03:37 | 显示全部楼层

这是执行效果,找出一堆sql server 机器,实际上,只有pingpingpi; win-90e38rraj34 两个有 myhis数据库

只找出带myhis的主机名,去掉其他的

c#我搞不明白,看看有没有简单的方法

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2017-7-5 12:07:44 | 显示全部楼层
回复 3# pingguo002


    你確定這是所有的語法嗎?? 看起來這段 像是在查詢比對資料庫是不是有你要的

至於 有多少 資料庫主機  看起來 語法裡面好像看不到
 楼主| 发表于 2017-7-5 14:51:33 | 显示全部楼层
是这段代码,图发错了;
这个代码运行完显示的是英文的。内容一样
刚才运行过

http://blog.csdn.net/zhaojie2013/article/details/20038981
链接
发表于 2017-7-7 11:41:16 | 显示全部楼层
回复 1# pingguo002


    這個問題 我還蠻關注的  

不過我也想不到方法.........幫你推一下


不過我想請問  你的問題是

想要找 區網內的 所有 資料庫主機 還是

要找 某一台主機上的 所有資料庫資料呢??

有 找 區網內的 所有 資料庫主機 的方法嗎??
 楼主| 发表于 2017-7-11 10:25:16 | 显示全部楼层
谢谢!
情况是这样的,我的客户用的his系统,只有一台主机,安装ms sql server数据库。有n个分机,
分机不安装sqlserver。
我只需要找到主机的计算机名,填到分机的配置文件里就ok
客户经常出现,分机找不到主机的情况,人工电话解决太麻烦了。
想做个简单工具解决连接问题,我现在找到一个C#的方法,主机运行一个程序做广播,分机接收。
http://www.cnblogs.com/zhangbaochong/p/4944894.html
C#的可移植性一般,一少部分客户运行失败。不是最佳方案

这段代码我用vs2008编译报错,现在安装个vs2010试试
发表于 2017-7-11 10:36:28 | 显示全部楼层
回复 7# pingguo002

我覺得有幾個疑問 請教

1. 主機 沒有固定的內部IP 嗎?? 怎麼會找不到主機
2. 分機上的 配置文件裡是 採用 電腦名稱 還是 IP
3. 當你的 配置文件 無法找到主機時?? 此時 主機的IP 是變動了  還是 換位置了??
4. 如果是網路狀況的話  不管你怎麼改配置 應該都是不通吧
5. 如果 你只是 為了回填 主機位置  不需要這麼麻煩吧  最簡單方法 在共用位置 開個文件  主機回報自己資料 到文件,分機 讀取文件也可行 不是??
 楼主| 发表于 2017-7-12 11:02:33 | 显示全部楼层
1客户经常改ip,切换内外网用;客户经常重装系统
2分机用计算名  ip 都可以
4网络不通的时候也有,客户自己不会判断网络通不通,电话沟通非常难。客户使用内外,不能远程调试
5客户网络类型都不固定,没有规范,有双网同时接入的,双网卡的,交换机直连(不用路由器),路由器直连。
发表于 2017-7-12 12:02:48 | 显示全部楼层
本帖最后由 kk_lee69 于 2017-7-12 12:03 编辑

回复 9# pingguo002

呵呵  那你 解決了嗎??

你只是要得到IP  不介意用廣播的話
並且 可以 可以接受 SERVER端  CLINE 端都要安裝的話 倒是
有解決辦法

簡單的做法就是  線上很多 聊天軟件的案例   這個需要兩端廣播 溝通

這段程式碼就可以解決問題
 楼主| 发表于 2017-7-14 15:49:30 | 显示全部楼层
http://www.cnblogs.com/zhangbaochong/p/4944894.html
算有个解决方案,先用这个方法做个小插件,主机运行一下,分机再运行,取主机名,填表。
C#必须装framwork才能运行,这点麻烦。
c++的代码没运行成功,只能用c#了。
发表于 2017-7-14 18:09:03 | 显示全部楼层
回复 11# pingguo002


找到解決方法

給你一個 列出 區網所有 MSSQL 主機的 語法

至於 這台主機裡面是否有你要的資料庫  這個部分 還得自己在修改

#include <Array.au3>

$aCompList2 = _netwerklist(0x4)
TCPStartup()

DIM $aCompList3[UBound($aCompList2)][2]

FOR $i=1 TO  UBound($aCompList2)-1 Step 1
        $aCompList3[$i][0]=$aCompList2[$i]
        $aCompList3[$i][1]=TCPNameToIP($aCompList2[$i])
Next

TCPShutdown()

_ArrayDisplay($aCompList3)


Func _netwerklist($iSrvType = -1, $sDomain = '')
    Local $uBufPtr = DllStructCreate("ptr;int;int"), $res[1] = [0], $i
    Local $uRecord = DllStructCreate("dword;ptr"), $iRecLen = DllStructGetSize($uRecord)
    Local $uString = DllStructCreate("char[16]")
    Local $uDomain = DllStructCreate("byte[32]"), $pDomain = 0
    If Not ($sDomain = '' Or $sDomain = '*') Then
        DllStructSetData($uDomain, 1, StringToBinary($sDomain, 2))
        $pDomain = DllStructGetPtr($uDomain)
    EndIf
    Local $ret = DllCall("netapi32.dll", "int", "NetServerEnum", _
            "ptr", 0, "int", 100, _
            "ptr", DllStructGetPtr($uBufPtr, 1), "int", -1, _
            "ptr", DllStructGetPtr($uBufPtr, 2), _
            "ptr", DllStructGetPtr($uBufPtr, 3), _
            "int", $iSrvType, "ptr", $pDomain, "int", 0)
    If $ret[0] Then Return SetError(1, $ret[0], '')
    Local $res[DllStructGetData($uBufPtr, 3) + 1] = [DllStructGetData($uBufPtr, 3)]
    For $i = 1 To DllStructGetData($uBufPtr, 3)
        Local $uRecord = DllStructCreate("dword;ptr", DllStructGetData($uBufPtr, 1) + ($i - 1) * $iRecLen)
        Local $sNBName = DllStructCreate("byte[32]", DllStructGetData($uRecord, 2))
        DllStructSetData($uString, 1, BinaryToString(DllStructGetData($sNBName, 1), 2))
        $res[$i] = DllStructGetData($uString, 1)
    Next
    $ret = DllCall("netapi32.dll", "int", "NetApiBufferFree", "ptr", DllStructGetData($uBufPtr, 1))
    Return $res
EndFunc   ;==>_netwerklist

评分

参与人数 1金钱 +20 收起 理由
nec520 + 20 果然可以 讚啦

查看全部评分

 楼主| 发表于 2017-7-17 15:01:45 | 显示全部楼层
谢谢,非常棒的代码!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-22 11:05 , Processed in 0.086856 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表