本篇文章给大家谈谈在SQL中查找序列的空缺而无需创建其他表,以及在sql中查找序列的空缺而无需创建其他表的数据的知识点,同时本文还将给你拓展C#如何确保接口的实现具有可以通过反射读取的值的字段,而无需
本篇文章给大家谈谈在SQL中查找序列的空缺而无需创建其他表,以及在sql中查找序列的空缺而无需创建其他表的数据的知识点,同时本文还将给你拓展C#如何确保接口的实现具有可以通过反射读取的值的字段,而无需创建实例?、LINQ:选择一个对象并更改一些属性,而无需创建新对象、oracle – 如何使用PL / SQL查找序列是否存在、postgresql – PSQL脚本中的变量,无需创建函数等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- 在SQL中查找序列的空缺而无需创建其他表(在sql中查找序列的空缺而无需创建其他表的数据)
- C#如何确保接口的实现具有可以通过反射读取的值的字段,而无需创建实例?
- LINQ:选择一个对象并更改一些属性,而无需创建新对象
- oracle – 如何使用PL / SQL查找序列是否存在
- postgresql – PSQL脚本中的变量,无需创建函数
在SQL中查找序列的空缺而无需创建其他表(在sql中查找序列的空缺而无需创建其他表的数据)
我有一张桌子,上面invoices
有一块田地invoice_number
。这是我执行时发生的情况select invoice_number
from invoice
:
invoice_number
--------------
1
2
3
5
6
10
11
我想要一个给我以下结果的SQL:
gap_start | gap_end
4 | 4
7 | 9
我该如何编写SQL来执行此类查询?我正在使用PostgreSQL。
C#如何确保接口的实现具有可以通过反射读取的值的字段,而无需创建实例?
如何解决C#如何确保接口的实现具有可以通过反射读取的值的字段,而无需创建实例??
... 或者另一种实现方式:
我有一个名为 ICommunicationProvider
的接口,然后通过
ISMSCommunicationProvider
、IEmailCommunicationProvider
、IWhatsAppCommunicationProvider
等
这些接口中的每一个都是实现不同消息提供程序的蓝图,对于 SMS,我可能使用 Twilio,对于电子邮件,我可能想使用 SMTP 的 MailChimp,等等。
我创建了一个名为 ISMSCommunicationProvider
的 TwilioSMSCommunicationProvider
实现类,它将用于在系统中创建 Twilio 通信提供程序的实例。可能有多个 Twilio 通信提供程序,每个都有不同的 API 密钥、SMS 号码等 - 但它们都将具有相同的 CommunicationProviderCode
将它们链接到 TwilioSMSCommunicationProvider
实现以及 SettingsKeys
字典定义了设置字段的数量,比如说 4。
现在,我还想创建 TextLocalSMSCommunicationProvider
,它也将是 ISMSCommunicationProvider
的实现,还将具有 CommunicationProviderCode
字段,与 Twilio 实现不同,以及 SettingsKeys
字典但用于设置的字段数量不同。
如果这些字段必须是静态的,我如何确保 systemCode
和 settings
始终在每个扩展 ISMSCommunicationProvider
的类中实现?
它们必须是静态的,因为当将通信提供程序的实例添加到系统/数据库时,我使用反射来填充具有这些实现的下拉列表。我无法实例化这些实现,因为我只需要 CommunicationProviderCode
和 settingsKeys
字典来了解我需要创建哪些设置字段。
下面的示例显示了顶部的一些静态字段的实现,我目前正在使用它们来做我需要做的事情,但它很难看 - 因为我必须记住将它们添加到 ISMSCommunicationProvider
的每个实现中而不是能够使用接口来强迫他们的存在。如果它们是属性 - 我将无法通过反射获取它们,因为我必须创建实例...
是否有更简洁的方法来实现我需要实现的目标?
示例:
ICommunicationProvider
public interface ICommunicationProvider
{
/// <summary>
/// Communication Provider.
/// </summary>
CommunicationProvider CommunicationProvider { get; }
}
ISMSCommunicationProvider
public interface ISMSCommunicationProvider : ICommunicationProvider
{
void Send(ISMS sms);
Task SendAsync(ISMS sms,bool isExceptionReport = false);
Task<bool> ReportException(Exception ex,bool isReceive);
}
TwilioSMSCommunicationProvider
public class TwilioSMSCommunicationProvider : ISMSCommunicationProvider
{
public static readonly string[] SettingsKeys = { "AccountSID","AuthToken","SMSNumber"};
public static readonly string CommunicationProviderCode = "TwilioSMSProvider";
public static readonly string CommunicationProviderName = "Twilio SMS Provider";
public static readonly CommunicationType CommunicationProviderType = CommunicationType.SMS;
private readonly Dictionary<string,string> communicationProviderSettings;
private readonly ICommunicationProviderService communicationProviderService;
/// <summary>
/// Constructor
/// </summary>
/// <param name="communicationProvider"></param>
/// <param name="communicationProviderService"></param>
public TwilioSMSCommunicationProvider(CommunicationProvider communicationProvider,ICommunicationProviderService communicationProviderService)
{
this.CommunicationProvider = communicationProvider;
this.communicationProviderService = communicationProviderService;
this.communicationProviderSettings = communicationProviderService.GetSettingsForCommunicationProvider(SettingsKeys);
TwilioClient.Init(this.communicationProviderSettings["AccountSID"],this.communicationProviderSettings["AuthToken"]);
}
public CommunicationProvider CommunicationProvider { get; }
/// <summary>
/// Send SMS
/// </summary>
/// <param name="sms"></param>
public void Send(ISMS sms)
{
var message = MessageResource.Create(
body: sms.BodyText,from: new Twilio.Types.PhoneNumber(this.communicationProviderSettings["SMSNumber"]),to: new Twilio.Types.PhoneNumber(sms.To)
);
Console.WriteLine(message.Sid);
}
添加一些关于我需要做什么的额外参考; 我首先选择提供者类型:
一旦填充了 Provider Type 框,第二个选择框通过反射获取 ICommunicationProvider
的所有实现,在其静态字段中具有 CommunicationType.SMS
枚举,使用另外两个静态字段 CommunicationProviderName
和 CommunicationProviderCode
并填充下拉列表:
现在,在填写其他详细信息并保存后,会在数据库中创建一个 CommunicationProvider
以及也在 TwilioSMSCommunicationProvider
中名为 SettingsKeys
的静态字段中声明的空设置,在数据库中创建这些设置以供用户填充值:
最终结果的总体思路是 - 在代码中创建 SMS 或电子邮件或 WhatsApp 通信提供程序接口的实现,这将是我创建利用此实现的全新 CommunicationProviders 唯一需要做的事情。实现决定了我需要什么设置,并拥有让它出现在选择框等中所需的所有详细信息。我需要做的就是创建新类,在该类中填写详细信息,实现方法 - 它只是有效。
如您所见,它在实现中需要大量静态字段,这些字段本质上应该存在于 ISMSCommunicationProvider
的每个实现中,它们只是具有不同的值。如果工厂模式能够以更简洁的方式实现这一点 - 请您能指出我正确的方向吗?
解决方法
由于本练习的目标是提供一些元数据以供 UI 代码使用,因此您可以使用自定义属性来捕获所需的信息,而无需使用静态字段:
[AttributeUsage(AttributeTargets.Class)]
class CommunicationProviderMetadataAttribute : Attribute {
public string ProviderCode { get; set; }
public string ProviderName { get; set; }
public CommunicationType CommunicationType { get; set; }
public string[] SettingsKeys { get; set; }
}
现在你可以用属性装饰你的类,而不是提供静态数据:
[CommunicationProviderMetadata(
ProviderCode = "TwilioSMSProvider",ProviderName = "Twilio SMS Provider",CommunicationType = CommunicationType.SMS,SettingsKeys = { "AccountSID","AuthToken","SMSNumber"}
)]
public class TwilioSMSCommunicationProvider : ISMSCommunicationProvider {
...
}
这看起来更简洁,并以最明确的方式传达了元数据的想法。
尽管您仍然可能忘记添加该属性,但有一种方法可以通过添加一个接受所有四个值的构造函数来强制用户在编译时指定所有参数。这种方法的一个优点是,如果您稍后决定添加第五个参数,编译器会告诉您它仍然缺失的所有位置。
,将静态行为与接口结合的一种方法是创建一个单例类。声明一个设置接口:
public interface ISmsCommunicationSettings
{
public string[] SettingsKeys { get; }
public string CommunicationProviderCode { get; }
public string CommunicationProviderName { get; }
public CommunicationType CommunicationProviderType { get; }
}
通过隐藏构造函数并通过静态字段提供唯一实例来实现一个类并使其成为单例:
public class SMSCommunicationSettings : ISmsCommunicationSettings
{
public static readonly SMSCommunicationSettings Instance = new SMSCommunicationSettings();
private SMSCommunicationSettings() // Hide constructor
{}
public string[] SettingsKeys { get; } = { "AccountSID","SMSNumber"};
public string CommunicationProviderCode { get; } = "TwilioSMSProvider";
public string CommunicationProviderName { get; } = "Twilio SMS Provider";
public CommunicationType CommunicationProviderType { get; } = CommunicationType.SMS;
}
将设置添加到提供者界面:
public interface ICommunicationProvider
{
ISmsCommunicationSettings Settings { get; }
CommunicationProvider CommunicationProvider { get; }
}
实现提供者并通过构造函数注入传递设置或直接引用它或通过工厂方法等获取它:
public class TwilioSMSCommunicationProvider : ISMSCommunicationProvider
{
ISmsCommunicationSettings Settings => SMSCommunicationSettings.Instance;
CommunicationProvider CommunicationProvider { get; }
}
现在,每个实例都获得对同一组唯一设置的引用。无需反射。
作为此 Settings
属性的替代方法,您可以在属性中指定设置类的名称:
[CommSettings(nameof(SMSCommunicationSettings))]
public class TwilioSMSCommunicationProvider : ISMSCommunicationProvider
{ ... }
然后通过反射访问设置。
现在可以在最新的 C# 10 预览版中使用(您需要 Visual Studio 2022 预览版):
public interface ISettings { }
public interface ISettingProvider
{
static abstract ISettings Settings { get; }
}
public class Provider : ISettingProvider
{
public static ISettings Settings => throw new NotImplementedException();
}
LINQ:选择一个对象并更改一些属性,而无需创建新对象
如何解决LINQ:选择一个对象并更改一些属性,而无需创建新对象?
我不确定查询语法是什么。但是,这是扩展的LINQ表达式示例。
var query = someList.Select(x => { x.someProp = "foo"; return x; })
这样做是使用匿名方法vs和表达式。这使您可以在一个lambda中使用多个语句。因此,您可以将设置属性和将对象返回到此简洁方法中的两种操作结合在一起。
解决方法
我想更改LINQ查询结果对象的某些属性,而无需创建新对象并手动设置每个属性。这可能吗?
例:
var list = from something in someList
select x // but change one property
oracle – 如何使用PL / SQL查找序列是否存在
例如. (伪代码)
IF EXISTS(MY_SEQ) THEN BEGIN DROP SEQUENCE MY_SEQ; CREATE SEQUENCE MY_SEQ... END; ELSE BEGIN CREATE SEQUENCE MY_SEQ; END;
BEGIN FOR cc IN (SELECT sequence_name as sequence_exists FROM all_sequences WHERE sequence_owner = :seq_owner AND sequence_name = :seq_name) LOOP -- sequence exists,drop it (at most there will be *one* sequence) EXECUTE IMMEDIATE 'DROP SEQUENCE XXX'; END LOOP; -- create sequence EXECUTE IMMEDIATE 'CREATE SEQUENCE XXX'; END;
postgresql – PSQL脚本中的变量,无需创建函数
DECLARE result TEXT; BEGIN SELECT INTO result name FROM test; RAISE NOTICE result; END;
表测试只有1行和列.这是否可能,而无需将此脚本包装在函数中.这将允许我通过say命令行更容易调用脚本.
多谢你们.
解决方法
DO
来创建和执行匿名函数:
DO
executes an anonymous code block,or in other words a transient anonymous function in a procedural language.
像这样的东西:
do $$ declare result text; begin select name into result from test; raise notice ''%'',result; end; $$;
我还修正了你的加薪通知.
如果您只想以最小格式(即易于解析)将表中的单个值转储到标准输出,那么--tuples-only
可能会有所帮助:
-t
--tuples-only
Turn off printing of column names and result row count footers,etc. This is equivalent to the\t
command.
所以你可以从shell中说出这样的话:
result=$(echo ''select name from test;'' | psql -t ...)
我们今天的关于在SQL中查找序列的空缺而无需创建其他表和在sql中查找序列的空缺而无需创建其他表的数据的分享就到这里,谢谢您的阅读,如果想了解更多关于C#如何确保接口的实现具有可以通过反射读取的值的字段,而无需创建实例?、LINQ:选择一个对象并更改一些属性,而无需创建新对象、oracle – 如何使用PL / SQL查找序列是否存在、postgresql – PSQL脚本中的变量,无需创建函数的相关信息,可以在本站进行搜索。
本文标签: