Microsoft SQL Server DBMS中可空数据类型的大小是多少?
例如,非可空int应该占用4个字节,可空的列空间将占多少?
子问题:nullable int,char(N),nvarchar(N) - 我假设它们可能以不同方式存储.
我读过的内容:
我的方案是我计划创建一个具有多个(未知)订阅者的 ServiceBus 主题。他们可以使用主题过滤器,因此不会处理来自主题的每条消息。
我需要给定的消息 (Id) 等待所有处理程序完成其工作以继续工作流程。自然地,每个处理程序在完成时都会产生一条消息,我可以使用例如 Durable Function 来等待事件列表。
但问题是我怎么知道订阅消息的列表已经/将被发送到?
通过Microsoft.Azure.ServiceBus.Management.ManagementClient.GetSubscriptionsAsync()我可以获得我的主题的所有订阅列表。但是我找不到如何根据过滤器评估它是否会接受给定的消息。
如果使用 ServiceBus 无法实现这一点,是否有任何替代方案(除了使用 Pub/Sub 的自定义实现重新发明轮子)来实现这种场景?
在C#中#define指令的目的和用法是什么?
关于这个主题的问题已经很少了,但我没有答案.他们只举例说明它的工作原理.但我需要更深入的解释:它为什么存在以及使用它的好方法(如果有的话).
基本上我知道如何使用它,但对我来说,用法看起来很奇怪.我们来看看例子:
#define DEV
#if DEV
Console.WriteLine("Development trace log message");
#endif
Run Code Online (Sandbox Code Playgroud)
对我来说,这与使用项目定义的条件编译符号的#if条件构建完全不同.如果我们使用项目定义的符号,它将附加到项目构建配置,我们可以使用构建配置来管理构建(并从构建中排除)所需的代码.所以代码
#if DEBUG
Console.WriteLine("Debug log message");
#endif
Run Code Online (Sandbox Code Playgroud)
对我来说没问题.但正如我所说,它与使用#define指令完全不同,因为它是可管理的. 我是否正确,第一个示例只能在每次构建时手动注释/取消注释#define行?如果是的话,它是不可管理的,难以维护的,我认为#define的这种用法是极其不好的做法,并且根本不存在于语言中.
我可以想象在#if语句中使用#define/#undef.就像是
#if DEBUG
#if CLIENT1
#define TEST_CLIENT1
#endif
#endif
#if TEST_CLIENT1
connectionString = "Some specific test connection" //I know this is bad practice even in conditional. Only for example purpose.
#elif
//Read connection from config
#endif
#if UNITTESTS
#undef TEST_CLIENT1
#endif
#if TEST_CLIENT1
Console.WriteLine("Some message");
#endif
Run Code Online (Sandbox Code Playgroud)
很抱歉这么复杂的例子,但这至少是我觉得有用的东西.虽然我不会以任何方式编写这样的代码=). #define有什么用处吗?
PS:我自己从未使用#define 5年并且没有意愿去做,但是我得到了一个支持项目,它有很多奇怪的定义,甚至以奇怪的方式命名.这些定义通常放在文件的顶部,就像我在这里的第一个例子.我不知道如何维护这段代码.
我需要为创建的IIS应用程序池的logs文件夹设置权限.设置权限的代码:
<CreateFolder Directory="SiteLogsFolder">
<util:PermissionEx User="Everyone" Read="yes" GenericRead="yes"/>
<util:PermissionEx User="[IisSiteUser]" GenericRead="yes" GenericWrite="yes" GenericExecute="yes" Delete="yes" DeleteChild="yes"/>
</CreateFolder>
<CustomAction Id="SetIis6SiteUser" Property="IisSiteUser" Value="NT AUTHORITY\NetworkService"/>
<CustomAction Id="SetIis7SiteUser" Property="IisSiteUser" Value="IIS AppPool\[SITE_APP_POOL]"/>
<InstallExecuteSequence>
<Custom Action="SetIis7SiteUser" Before="InstallInitialize">IISMAJORVERSION>="#7"</Custom>
<Custom Action="SetIis6SiteUser" Before="InstallInitialize">IISMAJORVERSION="#6"</Custom>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)
这适用于Windows Server 2003上的IIS 6,但Windows Server 2008上的IIS 7.5无效.我收到错误:
ExecSecureObjects: Error 0x80070534: failed to get sid for account: IIS AppPool\MyAppPool
Run Code Online (Sandbox Code Playgroud)
调查细节:
MSDN文档和许多使用ReaderWriterLockSlim类的示例建议使用以下模式:
cacheLock.EnterWriteLock();
try
{
//Do something
}
finally
{
cacheLock.ExitWriteLock();
}
Run Code Online (Sandbox Code Playgroud)
但我很好奇它是否完全安全.获取锁之后是否可能发生某些异常,但是在try语句之前锁定被锁定状态?最明显的候选人是ThreadAbortException.我知道这种情况的可能性非常小,但后果极其糟糕 - 所以我认为值得考虑一下.我不相信编译器理解这种模式并阻止处理器在try语句之前中断线程.
如果理论上有可能这个代码不安全,有没有办法让它更安全?
为什么Icon for Shortcut元素的Id属性应该以'.ico'或'.exe'结尾?
所以这段代码
<Icon Id="ProgramIcon" SourceFile="Images\MyAppIcon.ico"/>
<Component Guid="MY_GUID" Id="MyAppComponent">
<File Source="MyApp.exe" Name="MyApp.exe" Id="MyApp.exe">
<Shortcut Id="MyApp.Shortcut" Directory="ApplicationProgramMenuDir" WorkingDirectory="INSTALLDIR" Name="MyApp" Icon="ProgramIcon" Advertise="yes" />
</File>
</Component>
Run Code Online (Sandbox Code Playgroud)
生成编译错误:
error LGHT0204: ICE50: The extension of Icon 'ProgramIcon' for Shortcut 'MyApp.Shortcut' does not match the extension of the Key File for component 'MyAppComponent'. [D:\APPS\MyProject.wixproj]
Run Code Online (Sandbox Code Playgroud)
但这段代码
<Icon Id="ProgramIcon.ico" SourceFile="Images\MyAppIcon.ico"/>
<Component Guid="MY_GUID" Id="MyAppComponent">
<File Source="MyApp.exe" Name="MyApp.exe" Id="MyApp.exe">
<Shortcut Id="MyApp.Shortcut" Directory="ApplicationProgramMenuDir" WorkingDirectory="INSTALLDIR" Name="MyApp" Icon="ProgramIcon.ico" Advertise="yes" />
</File>
</Component>
Run Code Online (Sandbox Code Playgroud)
编译好.
这是我第一次看到任何元素的Id属性的这种限制,它看起来很奇怪.我认为这甚至没有任何理由成为警告.所以我不明白这个功能的一些基础知识.请帮我理解所述行为的原因.
我正在为产品创建 msi-installer,安装后我需要在浏览器中启动 web url。我使用 WIX 3.5 创建安装程序(但这可能并不重要)。我在http://www.tramontana.co.hu/wix/lesson5.php#5.2 中找到的示例不起作用 - 安装程序日志说的
“操作结束 15:27:30:LaunchBrowser。返回值 1631。”。
我在互联网上看到很多关于这个问题的帖子,但没有人提供解决方案(有人发现多语言问题,有人联系微软解决)。
我只能猜测问题出在 Windows 7 的安全性中(我遇到了问题)。也许 Windows 安装程序被禁止启动 exe 文件(我用其他 exe-s 尝试了许多其他示例,但结果都相同)。
有人有通用的解决方案吗?
我为我们的产品实现了一个安装程序。安装程序需要管理员权限,因此我使用带有清单文件的安装引导程序(按照推荐那样)在启用了 UAC 的 Windows 计算机上获得这些权限。安装和卸载都很顺利——用户会被请求许可,安装程序会做它需要做的事情。
\n\n但是,如果您运行“控制面板\xe2\x86\x92程序和功能”并为已安装的程序选择“更改”*,则会出现错误(自定义,来自安装程序 LaunchConditions),告知安装程序需要管理权限。在这种情况下,我找不到任何方法来请求权限 - Windows 只是运行 MSI 文件,并且不知道有关所需权限的任何信息。
\n\n更奇怪的是修复功能 - 它请求许可,但随后无法使用 SetupBootstrapper 执行安装期间允许的某些操作。
\n\n我在这里发现了类似的问题:
\n\n但所提出的解决方案在我们的案例中是不可接受的。
\n\n现在更改功能的唯一解决方法是始终使用SetupBootstrapper,而不使用程序和功能菜单,但这对用户不太友好,并且迫使用户将安装程序保留在他/她的硬盘上。
\n\n有没有人更好的建议?
\n\nPS:我用的是WiX来创建安装程序,因此很高兴听到有关 WiX 解决方案的信息,但我很确定它不依赖于安装程序创建语言,而仅依赖于 MSI 细节。
\n我知道垃圾收集器使用Finalize方法让对象释放非托管资源.根据我所知,Object.Finalize永远不会被GC直接调用(如果它的类型通过实现终结器来覆盖 Finalize方法,则在构造过程中将对象添加到f-reachable队列中).
Object.Finalize仅从自动生成的终结器代码中调用:
try
{
//My class finalize implementation
}
finally
{
base.Finalize(); // Here chain of base calls will eventually reach Object.Finalize/
}
Run Code Online (Sandbox Code Playgroud)
因此,从Object派生一个任意类,不会调用Object.Finalize - 你需要对Object.Finalize的终结器有意义,对于大多数类来说它没有意义并且没有使用(不是说它的实现是空的).
如果没有覆盖Object.Finalize,并且在没有try {} finally { base.Finalize() }调用的情况下生成根终结器,那么在类中检查Finalize方法的存在是否太复杂?类似于Add集合初始化的方法 - 您不必实现任何接口或覆盖该方法 - 只需实现public void Add(item)方法.
它会使C#编译器有点复杂,但是通过删除一个冗余调用使得终结器运行得稍微快一些,最重要的是 - 使得Object类更容易理解而不需要具有Finalize空实现的保护方法,而不需要完成任何事情.
此外,有可能实现从Object派生的FinalizableObject类,并使编译器派生所有具有终结器的类.它可以实现IDisposable并使得Microsoft推荐的处理模式可以重用,而无需在每个类中实现它.其实我很惊讶这样的基类不存在.
我们有一个管理打印文档的项目.起初我想知道为什么不能在一个地方设置打印选项.例如,可以使用MS Word自动化完成第一页和其他页面的打印机托盘选择:
var doc = _applicationObject.Documents.OpenNoRepairDialog(FileName: ref sourceFile, ReadOnly: ref readOnly,
AddToRecentFiles: ref addToRecentFiles,
Visible: ref visible);
doc.PageSetup.FirstPageTray = (WdPaperTray) firstPageTrayCode;
doc.PageSetup.OtherPagesTray = (WdPaperTray) otherPagesTrayCode;
_applicationObject.ActivePrinter = printerPath;
doc.Activate();
_applicationObject.PrintOut(Background: ref backgroundPrint, FileName: sourceFile);
doc.Close(ref saveChanges, ref _missing, ref _missing);
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,打印机托盘被指定为整数,因为某些打印机没有托盘的标准值(我们遇到了HP的问题 - 这里描述的托盘代码).所以我们首先使用代码检索托盘打印机的内容:
var setting = new PrinterSettings();
setting.PrinterName = myPrinterName;
foreach (PaperSource tray in setting.PaperSources)
{
Console.WriteLine("\t{0}: #{1}", tray.SourceName, tray.RawKind);
}
Run Code Online (Sandbox Code Playgroud)
这段代码没有任何问题.
但是这里没有办法指定双面打印和装订选项.双面打印可以做到的,使用驱动程序功能OpenPrinter和SetPrinter,就像描述这里的以及和微软推荐此论坛主题. Staple完全不清楚 …