Здравствуйте, Smilless, Вы писали:
S>Все равно не догоняю какой в этом сакраментальный смысл?
Ну захотелось так человеку, нигде же не написано, что он делает правильно
Я бы использовал для конвертации IPAddress и хранил бы как varbinary(16).
А если делать по-хорошему — либо писать свой UDT, либо, не заморачиваясь, хранить строчкой (если адрес никак не будет обрабатываться и нужен только для отчётности).
S>показано что ни о каких IPV6 мыслей не было и в помине.
Никаких мыслей не было ещё на этапе преобразования IP в long
Я повторю свой вопрос — что вам требуется? Хранить IPv4/v6/имя машины?
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, Smilless, Вы писали:
S>>Все равно не догоняю какой в этом сакраментальный смысл? S>Ну захотелось так человеку, нигде же не написано, что он делает правильно S>Я бы использовал для конвертации IPAddress и хранил бы как varbinary(16). S>А если делать по-хорошему — либо писать свой UDT, либо, не заморачиваясь, хранить строчкой (если адрес никак не будет обрабатываться и нужен только для отчётности).
S>>показано что ни о каких IPV6 мыслей не было и в помине. S>Никаких мыслей не было ещё на этапе преобразования IP в long
S>Я повторю свой вопрос — что вам требуется? Хранить IPv4/v6/имя машины?
Угу именно так ip4 адрес и никаких ip6. Но из Ваших ответов думаю все уже понял, просто витиеватый ход мыслей того товарища ввел в ступор))))
There are 10 types of people in the world: Those who understand binary, and those who don't.
using System;
using System.Data.SqlTypes;
using System.Net;
using System.Text;
/// <summary>
/// INet_NtoA and INet_AtoN MSSQL CLR.
/// This code will allow you to store IPv4 Addresses as INT64 values in the database, rather than a text string.
/// This allows you to sort the IP Address, where as it is difficult to do this if IP Addresses are stored as strings.
/// The INT 64 will allow you to sort it in proper subnet order.
/// </summary>public partial class UserDefinedFunctions
{
/// <summary>
/// This function will take in an Int64 value, and convert it into a well formed IP Address.
/// </summary>
/// <param name="IP">Int64 Value that is the IP Address that wants converting.</param>
/// <returns>Well formatted IP Address in string format. i.e. 10.10.10.254</returns>
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString INET_NTOA(long IP)
{
try
{
IPAddress ip = new IPAddress(IP);
string szIpAddress = ip.ToString();
string[] octets = szIpAddress.Split('.');
int iCnt = octets.GetUpperBound(0);
StringBuilder ipReversed = new StringBuilder();
while (iCnt >= 0)
{
ipReversed.Append(octets[iCnt]);
if (iCnt >= 1)
{
ipReversed.Append(".");
}
iCnt--;
}
IPAddress address;
if (!IPAddress.TryParse(ipReversed.ToString(), out address))
{
throw new ApplicationException("The IP provided to INET_AtoN is not valid.");
}
return ipReversed.ToString();
}
catch (Exception ex)
{
throw new ApplicationException("Unhandled exception occured converting, the following value '" + IP.ToString() + "' into a well formed IP Address. See inner exception for details", ex);
}
}
/// <summary>
/// Convert a well formed IP address back into its Int64, value for storing or sorting.
/// </summary>
/// <param name="IP">Well formed valid IP Address i.e. 10.10.10.10</param>
/// <returns>SQLInt64 value of the converted IP Address string.</returns>
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlInt64 INET_ATON(string IP)
{
try
{
IPAddress address;
if (!IPAddress.TryParse(IP, out address))
{
throw new ApplicationException("The IP provided to INet_AtoN is not valid.");
}
string[] szIpReverse = IP.Split('.');
StringBuilder sbIPReversed = new StringBuilder();
int iCntRv = szIpReverse.GetUpperBound(0);
while (iCntRv >= 0)
{
sbIPReversed.Append(szIpReverse[iCntRv]);
if (iCntRv >= 1)
{
sbIPReversed.Append(".");
}
iCntRv--;
}
IPAddress oIP = IPAddress.Parse(sbIPReversed.ToString());
byte[] byteIP = oIP.GetAddressBytes();
uint uip = (uint)byteIP[3] << 24;
uip += (uint)byteIP[2] << 16;
uip += (uint)byteIP[1] << 8;
uip += (uint)byteIP[0];
return (SqlInt64)Convert.ToInt64(uip);
}
catch (Exception ex)
{
throw new ApplicationException("Unhandled exception whilst converting INet_AtoN address into a valid Int64 representation. Please see inner exception for details", ex);
}
}
};
И вот никак не могу понять, зачем он риверсирует IP? Т.е. можно же просто строку парсим и число сохраняем. И при обратном число достали в конструктор и на выход строку.
There are 10 types of people in the world: Those who understand binary, and those who don't.
Здравствуйте, Smilless, Вы писали:
S>И вот никак не могу понять, зачем он риверсирует IP? Т.е. можно же просто строку парсим и число сохраняем. И при обратном число достали в конструктор и на выход строку.
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, Smilless, Вы писали:
S>>И вот никак не могу понять, зачем он риверсирует IP? Т.е. можно же просто строку парсим и число сохраняем. И при обратном число достали в конструктор и на выход строку.
S>Очевидно, для совместимости с inet_ntoa Function
S>P.S. А как вы будете хранить IPv6 адреса/машины с динамическим IP?
Все равно не догоняю какой в этом сакраментальный смысл?