Вызов awscli ec2 description-subnets фактически вернет вам количество неиспользованных частных адресов IPv4 в подсети. Адреса IPv4 для любых остановленных экземпляров считаются недоступными.
Например:
aws ec2 describe-subnets \
--subnet-ids subnet-c0c1a23a \
--query "Subnets[0].AvailableIpAddressCount"
Пример выходных данных:
249
Чтобы рассчитать общее количество используемых IP-адресов в подсети 10.0.0.0/24 или, в более общем случае, a / N:
10.0.0.0/24 => 2**(32-24) - 5
10.0.0.0/N => 2**(32-N) - 5
Обратите внимание, что вы вычитаете 5, потому что первые четыре IP-адреса и последний IP-адрес в каждом блоке CIDR подсети зарезервированы AWS и не могут быть назначены экземпляру. [ 1111]
И, если быть точным, скрипт Python:
import boto3
ec2 = boto3.resource('ec2')
# Use this for specific subnets
# filters = [{'Name':'subnet-id', 'Values':['subnet-c0c1a23a']}]
# subnets = ec2.subnets.filter(Filters=filters)
# Use this for all subnets
subnets = ec2.subnets.all()
for subnet in list(subnets):
free_ips = subnet.available_ip_address_count
n = int(subnet.cidr_block.split('/')[1])
cidr_ips = 2**(32-n)
used_ips = cidr_ips - free_ips
print('{:s}: cidr={:d}, aws used=5, you used={:d}, free={:d}'.\
format(subnet.id, cidr_ips, used_ips - 5, free_ips))
Пример вывода:
subnet-1eb2e345: cidr=256, free=251, aws used=5, you used=0
subnet-c0c1a23a: cidr=256, free=249, aws used=5, you used=2
Еще после большего количества исследования я нашел, что было два ответа части.
Если Вы соединяетесь с PostgreSQL через ODBC (единственный способ, которым Crystal Reports может вытянуть данные PostgreSQL по состоянию на время этой записи), использование владельца данных Вы затем, можно использовать следующий код:
reportDoc.Load(report);
reportDoc.DataSourceConnections[0].SetConnection("Driver={PostgreSQL ANSI};Server=myServer;Port=5432;", "myDatabase", "myUser", "myPassword");
reportDoc.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, path);
// Depending on your application you may have more than one data source connection that needs to be changed.
Этот метод только работает, если Вы соединяетесь как пользователь, который владеет данными, о которых Вы сообщаете относительно того, потому что название схемы не должно быть предоставлено.
Если Вы соединяетесь с PostgreSQL через ODBC с пользователем кроме владельца данных затем, необходимо вручную предоставить название схемы. Это выполняется со следующим кодом.
reportDoc.Load(report);
ConnectionInfo connInfo = new ConnectionInfo();
connInfo.ServerName = "Driver={PostgreSQL ANSI};Server=myServer;Port=5432;";
connInfo.DatabaseName = "myDatabase";
connInfo.UserID = "myUser";
connInfo.Password = "myPassword";
TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();
tableLogOnInfo.ConnectionInfo = connInfo;
foreach (Table table in reportDoc.Database.Tables)
{
table.ApplyLogOnInfo(tableLogOnInfo);
table.LogOnInfo.ConnectionInfo.ServerName = connInfo.ServerName;
table.LogOnInfo.ConnectionInfo.DatabaseName = connInfo.DatabaseName;
table.LogOnInfo.ConnectionInfo.UserID = connInfo.UserID;
table.LogOnInfo.ConnectionInfo.Password = connInfo.Password;
// Apply the schema name to the table's location
table.Location = "mySchema." + table.Location;
}
reportDoc.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, path);
Существует два критических сведения здесь при попытке соединиться с базой данных PostgreSQL из Crystal Reports.
Было несколько источников, используемых, который не имел ответа, который работал в моем определенном сценарии, но это привело меня в правильном направлении. Эти источники упоминаются ниже.
Я просто прошел это то же испытание.
Я установил свои соединения как это (где sDataSource и т.д.... являются строкой с информацией),
Dim myConnectionInfo As ConnectionInfo = New ConnectionInfo()
myConnectionInfo.ServerName = sDataSource
myConnectionInfo.DatabaseName = sInitialCatalog
myConnectionInfo.UserID = sUserID
myConnectionInfo.Password = sPassword
Dim myTables As Tables = report.Database.Tables
Dim myTableLogonInfo As TableLogOnInfo = New TableLogOnInfo()
myTableLogonInfo.ConnectionInfo = myConnectionInfo
For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables
myTable.ApplyLogOnInfo(myTableLogonInfo)
myTable.LogOnInfo.ConnectionInfo.DatabaseName = myTableLogonInfo.ConnectionInfo.DatabaseName
myTable.LogOnInfo.ConnectionInfo.ServerName = myTableLogonInfo.ConnectionInfo.ServerName
myTable.LogOnInfo.ConnectionInfo.UserID = myTableLogonInfo.ConnectionInfo.UserID
myTable.LogOnInfo.ConnectionInfo.Password = myTableLogonInfo.ConnectionInfo.Password
Next
protected void Page_Load(object sender, EventArgs e)
{
try
{
ReportDocument cryRpt = new ReportDocument();
TableLogOnInfos crtableLogoninfos = new TableLogOnInfos();
TableLogOnInfo crtableLogoninfo = new TableLogOnInfo();
ConnectionInfo crConnectionInfo = new ConnectionInfo();
cryRpt.Load(@"D:\tem\WebAppReport\WebAppReport\CrystalReport1.rpt");
crConnectionInfo.ServerName = "misserver";
crConnectionInfo.DatabaseName = "testAccountability_data";
crConnectionInfo.UserID = "RW";
crConnectionInfo.Password = "RW";
foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in cryRpt.Database.Tables)
{
crtableLogoninfo = CrTable.LogOnInfo;
crtableLogoninfo.ConnectionInfo = crConnectionInfo;
CrTable.ApplyLogOnInfo(crtableLogoninfo);
}
CrystalReportViewer1.ReportSource = cryRpt;
CrystalReportViewer1.RefreshReport();
}
catch
{
}
}
Прежде всего спасибо за эту информацию!!!
Я использую MySQL/C#/Crystal Reports. После настройки ODBC/DSN что-то настолько простое, что это сработало со мной.
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using MySql.Data.MySqlClient;
.
.
.
ConnectionInfo connInfo = new ConnectionInfo();
connInfo.ServerName = "Driver={MySQL ODBC 3.51 Driver};DSN=MyODBCDatasourceName";
TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();
tableLogOnInfo.ConnectionInfo = connInfo;
// rpt is my Crystal Reports ReportDocument
// Apply the schema name to the table's location
foreach (Table table in rpt.Database.Tables)
{
table.ApplyLogOnInfo(tableLogOnInfo);
table.Location = table.Location;
}
Обновление ODBC в кристаллическом файле отчета.
Мы используем ODBC с MSSQL, мы не смогли найти способа обновления ODBC внутри кристаллических файлов в рамках проекта на C sharp.
На примере, приведенном здесь, мы смогли найти способ обновления ODBC в MSSQL, и это так же просто:
Cursor.Current = Cursors.WaitCursor;
CrystalDecisions.Windows.Forms.CrystalReportViewer CR_Viewer;
CR_Viewer = new CrystalDecisions.Windows.Forms.CrystalReportViewer();
this.Controls.Add(CR_Viewer);
ConnectionInfo connInfo = new ConnectionInfo();
connInfo.ServerName = "YOUR ODBC NAME";
TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();
tableLogOnInfo.ConnectionInfo = connInfo;
//THIS IS A CRYSTAL RPT FILE DIFINE AS A CLASS
Facturation_Nord_Ouest.Reports.Facture_Français CrystalReportFr;
CrystalReportFr = new Facturation_Nord_Ouest.Reports.Facture_Français();
for (int i = 0; i < CrystalReportFr.Database.Tables.Count; i++)
{
CrystalReportFr.Database.Tables[i].ApplyLogOnInfo(tableLogOnInfo);
}
CR_Viewer.ReportSource = CrystalReportFr;
CR_Viewer.ActiveViewIndex = 0;
CR_Viewer.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
CR_Viewer.Dock = System.Windows.Forms.DockStyle.Fill;
CR_Viewer.Location = new System.Drawing.Point(0, 0);
CR_Viewer.Size = new System.Drawing.Size(545, 379);
CR_Viewer.TabIndex = 0;
CR_Viewer.Name = "Invoice";
CR_Viewer.Zoom(100);
CR_Viewer.Show();
Cursor.Current = Cursors.Default;
При этом ODBC в кристаллическом файле обновляется автоматически.