小编Sas*_*sha的帖子

SQL Server可以为空的数据类型大小

Microsoft SQL Server DBMS中可空数据类型的大小是多少?

例如,非可空int应该占用4个字节,可空的列空间将占多少?

子问题:nullable int,char(N),nvarchar(N) - 我假设它们可能以不同方式存储.

我读过的内容:

  • 在哪里可以找到SQL Server数据类型的大小 - 获取SQL版本列表的好方法以及我的SQL Server版本的大小.但是没有说可空类型.
  • http://msdn.microsoft.com/en-us/library/ms189124.aspx - 有一个计算所需可变大小列空间的公式:"Variable_Data_Size = 2 +(Num_Variable_Cols x 2)+ Max_Var_Size".这很奇怪:为什么它包含*2乘数(没有告诉nvarchar - 这个公式适用于所有可变大小的类型来自解释); 它必须是一个错字,Max_Var_Size被添加而不是相乘; 最后它包含+2个字节用于存储值的长度,但同样不包含用于存储NULL值的任何内容.据我所知,可以使用值长度为2个字节的3个剩余位来存储NULL标识符,但它是否真的以这种方式存储?
  • SQL Server中"Null"值的大小 - 对我而言,最顶层的答案令人困惑.@Mark Byers说"如果字段是固定宽度,则存储NULL占用与任何其他值相同的空间 - 字段的宽度",但是不可能在相同的计数中存储标准整数值间隔和附加NULL值位.然后"如果字段是可变宽度,则NULL值不占用空间" - 再次存储NULL根本不能占用空间 - 它必须存储一些空值的标记.与其他答案类似的混淆:有人说它需要2个额外的字节,有人 - 只有1个字节.
  • http://home.clara.net/drdsl/MSSQL/DataTypes.html - 包含类型大小的漂亮表,但同样没有专门用于NULL值的表.

sql sql-server

11
推荐指数
1
解决办法
3163
查看次数

Azure ServiceBus:等待所有订阅者处理完一条消息

我的方案是我计划创建一个具有多个(未知)订阅者的 ServiceBus 主题。他们可以使用主题过滤器,因此不会处理来自主题的每条消息。

我需要给定的消息 (Id) 等待所有处理程序完成其工作以继续工作流程。自然地,每个处理程序在完成时都会产生一条消息,我可以使用例如 Durable Function 来等待事件列表。

但问题是我怎么知道订阅消息的列表已经/将被发送到?

通过Microsoft.Azure.ServiceBus.Management.ManagementClient.GetSubscriptionsAsync()我可以获得我的主题的所有订阅列表。但是我找不到如何根据过滤器评估它是否会接受给定的消息。

如果使用 ServiceBus 无法实现这一点,是否有任何替代方案(除了使用 Pub/Sub 的自定义实现重新发明轮子)来实现这种场景?

.net c# servicebus azure

8
推荐指数
1
解决办法
432
查看次数

#define指令目的

在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年并且没有意愿去做,但是我得到了一个支持项目,它有很多奇怪的定义,甚至以奇怪的方式命名.这些定义通常放在文件的顶部,就像我在这里的第一个例子.我不知道如何维护这段代码.

c# conditional-compilation c-preprocessor

7
推荐指数
1
解决办法
733
查看次数

为新创建的IIS AppPool标识设置的权限

我需要为创建的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)

调查细节:

  • 我也试过"IIS APPPOOL"域 - 结果相同.
  • 还尝试设置PermissionEx元素的Domain和User属性,而不是在User属性中合并它们.同样的错误.
  • 在PermissionEx中使用活动目录帐户工作正常.此外,活动目录帐户在设置时可以正常使用IIS站点池.
  • 如果我尝试为另一个AppPool设置权限(而不是我的安装程序创建一个,例如IIS AppPool\DefaultAppPool),那么一切正常.仅当我为安装程序创建的AppPool设置权限时才会出现此问题.
  • 我检查了ConfigureIIs,SchedSecureObjects和ExecSecureObjects的排序,并尝试强制ConfigureIIs在其他两个之前执行(在此线程中推荐).不幸的是,这也没有帮助.

permissions iis-7 wix

7
推荐指数
1
解决办法
1923
查看次数

使用ReaderWriterLockSlim.EnterXXX()的模式与随后的try-finally子句是否完全安全

MSDN文档和许多使用ReaderWriterLockSlim类的示例建议使用以下模式:

cacheLock.EnterWriteLock();
try
{
    //Do something
}
finally
{
    cacheLock.ExitWriteLock();
}
Run Code Online (Sandbox Code Playgroud)

但我很好奇它是否完全安全.获取锁之后是否可能发生某些异常,但是在try语句之前锁定被锁定状态?最明显的候选人是ThreadAbortException.我知道这种情况的可能性非常小,但后果极其糟糕 - 所以我认为值得考虑一下.我不相信编译器理解这种模式并阻止处理器在try语句之前中断线程.

如果理论上有可能这个代码不安全,有没有办法让它更安全?

.net c# multithreading readerwriterlockslim

7
推荐指数
2
解决办法
841
查看次数

为什么Icon元素要求Id属性以'.exe'或'.ico'结尾

为什么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属性的这种限制,它看起来很奇怪.我认为这甚至没有任何理由成为警告.所以我不明白这个功能的一些基础知识.请帮我理解所述行为的原因.

icons windows-installer wix

6
推荐指数
1
解决办法
2262
查看次数

Windows 安装程序自定义操作错误 1631

我正在为产品创建 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 尝试了许多其他示例,但结果都相同)。

有人有通用的解决方案吗?

windows-installer custom-action exe

5
推荐指数
1
解决办法
4776
查看次数

安装更改不要求UAC权限

我为我们的产品实现了一个安装程序。安装程序需要管理员权限,因此我使用带有清单文件的安装引导程序(按照推荐那样)在启用了 UAC 的 Windows 计算机上获得这些权限。安装和卸载都很顺利——用户会被请求许可,安装程序会做它需要做的事情。

\n\n

但是,如果您运行“控制面板\xe2\x86\x92程序和功能”并为已安装的程序选择“更改”*,则会出现错误(自定义,来自安装程序 LaunchConditions),告知安装程序需要管理权限。在这种情况下,我找不到任何方法来请求权限 - Windows 只是运行 MSI 文件,并且不知道有关所需权限的任何信息。

\n\n

更奇怪的是修复功能 - 它请求许可,但随后无法使用 SetupBootstrapper 执行安装期间允许的某些操作。

\n\n

我在这里发现了类似的问题

\n\n

但所提出的解决方案在我们的案例中是不可接受的。

\n\n

现在更改功能的唯一解决方法是始终使用SetupBootstrapper,而不使用程序和功能菜单,但这对用户不太友好,并且迫使用户将安装程序保留在他/她的硬盘上。

\n\n

有没有人更好的建议?

\n\n

PS:我用的是WiX来创建安装程序,因此很高兴听到有关 WiX 解决方案的信息,但我很确定它不依赖于安装程序创建语言,而仅依赖于 MSI 细节。

\n

repair windows-installer uac wix

5
推荐指数
1
解决办法
3686
查看次数

为什么.NET Object有方法Finalize()?

我知道垃圾收集器使用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推荐处理模式可以重用,而无需在每个类中实现它.其实我很惊讶这样的基类不存在.

.net c# garbage-collection finalizer

5
推荐指数
2
解决办法
1464
查看次数

使用高级选项打印(纸盘选择,双面打印,装订)

我们有一个管理打印文档的项目.起初我想知道为什么不能在一个地方设置打印选项.例如,可以使用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完全不清楚 …

.net printing duplex tray office-automation

3
推荐指数
1
解决办法
1万
查看次数