#node.js #sql-server
Вопрос:
Я пытаюсь собрать все экземпляры SQL Server в сети. В моем приложении пользователь выберет конкретный экземпляр SQL Server и базу данных на этом сервере.
Итак, есть ли какой-либо пакет или драйвер для этого в Node.js?
Комментарии:
1. Наверное, проще написать простое . Программа командной строки NET, которая запускается
System.Data.Sql.SqlDataSourceEnumerator.Instance .GetDataSources()
и возвращает ее в формате stdout, который затем считывается из вашей программы NodeJS.2. У нас этого нет . СЕТЬ, как это интегрировать? У нас есть только node js и MS SQL.
3. «У нас нет .NET» — даже для крошечной утилиты командной строки, которая содержит всего 5 значимых строк исходного кода, которые вы можете скомпилировать и запустить из оболочки Bash в Linux с минимальными инструментами? Похоже, вы работаете в догматической организации. Догма-это плохо.
4. Извините, это не для организации или какого-либо проекта компании. Я разрабатываю приложение для своей цели самообучения. Итак, не могли бы вы, пожалуйста, помочь сделать это в кодировании node js?
Ответ №1:
По — видимому SqlDataSourceEnumerator
, он не входит в .NET Core-только в .NET Framework, поэтому он не является кроссплатформенным, поэтому не обращайте внимания на мои замечания об использовании или написании простой утилиты .NET Core.
Во время исследования того, как SqlDataSourceEnumerator
это работает (через эту тему) Я нашел этот проект, который легко перенести в NodeJS… что я и сделал ниже:
const BROADCAST_ADDR = '192.168.0.255'; // Use ifconfig/ipconfig to get your broadcast address.
const SQL_BROWSER_PORT = 1434;
const dgram = require( 'dgram' );
async function discoverSqlServers() {
// SQL Browser responds to a single-byte message of 0x02:
const message = Buffer.alloc( /*size:*/ 1, /*fill:*/ 2 );
const udp = dgram.createSocket( 'udp4' );
// Set-up the listener before sending the UDP message:
const messages = [];
udp.on( 'message', function( incoming, remote ) {
messages.push( incoming );
} );
try {
udp.setBroadcast( true );
try {
await sendAsync( udp, message, SQL_BROWSER_PORT, BROADCAST_ADDR );
}
catch( err ) {
throw; // TODO: Graceful error handling.
}
// Wait for 10 seconds for responses.
await delayAsync( 10 * 1000 );
// Parse and return any messages received:
return messages.map( parseSqlBrowserMessage ).filter( e => e !== null );
}
finally {
udp.close();
}
}
/** Promise wrapper over dgram.send */
function sendAsync( udp, message, port, address ) {
return new Promise( ( resolve, reject ) => {
udp.send( message, 0, message.length, SQL_BROWSER_PORT, BROADCAST_ADDR, function( err, bytes ) {
if( err ) { reject( err ); }
else return resolve();
} );
} );
}
/** Promise wrapper over setTimeout */
function delayAsync( time ) {
return new Promise( ( resolve, reject ) => {
setTimeout( resolve, time );
} );
}
const sqlBrowserRegexp = /[^;]*ServerName;(?<ServerName>[wd] );InstanceName;(?<InstanceName>[wd] );IsClustered;(?<IsClustered>[w] );Version;(?<Version>[d] .[d] .[d] .[d] )(;tcp;(?<tcp>d ))?(;np;(?<np>[^;] ))?;;/gi;
function parseSqlBrowserMessage( message ) {
const m = message.match( sqlBrowserRegexp );
if( m amp;amp; m.groups ) {
return ( {
name: m.groups.InstanceName,
version: m.groups.Version,
tcp: m.groups.tcp, // TCP/IP
np: m.groups.np // Named Pipes
} );
}
return null;
}