我已经读过使用ToUpper和ToLower来执行不区分大小写的字符串比较是不明智的,但是在LINQ-to-SQL方面我没有其他选择.LINQ-to-SQL忽略String.Compare的ignoreCase和CompareOptions参数(如果您使用区分大小写的数据库,即使您要求不区分大小写的比较,也会得到区分大小写的比较).ToLower或ToUpper是最好的选择吗?这个比那个好吗?我以为我读过ToUpper更好的地方,但我不知道这是否适用于此.(我正在进行大量的代码审查,每个人都在使用ToLower.)
Dim s = From row In context.Table Where String.Compare(row.Name, "test", StringComparison.InvariantCultureIgnoreCase) = 0
Run Code Online (Sandbox Code Playgroud)
这转换为一个SQL查询,它简单地将row.Name与"test"进行比较,并且不会在区分大小写的数据库上返回"Test"和"TEST".
我出乎意料地接管了我们TFS系统的前任管理员,他们突然离开了公司.在发生这种情况之前,我成了TFS管理员和TFS应用服务器的管理员,但至少还有一件我无法弄清楚的事情.似乎在前一个管理员帐户下设置了一些警报,每当签入文件时都会向我们所有人发送电子邮件.我无法确切地说出这个订阅的确切含义,但我猜它是在项目的"项目警报"对话框,或者是使用TFS Power Tools的警报编辑器设置的警报.我无法在这些区域看到其他用户设置的警报.有没有办法直接编辑tbl_subscription表来尝试删除或更改这些警报?(我想我在SQL表中看到了警报,但我不想直接破解数据库.)
如果我按照以下步骤操作,则会出现此错误:
最后一步发生错误,因为X的值和X的原始值(由GetOriginalEntityState返回)不同,新值与Y不一致?这是为什么?这是LINQ to SQL中的错误.必须是因为如果我在步骤5中将Y更改为另一个(非空)值,我看不到相同的行为.这是正确的方法吗?我可以看到几种方式:
有没有更好的解决方案.这是应该报道的吗?
我有一个在VS 2008中正常构建的项目,然后我们安装并开始使用TFS Build,然后我们升级到TFS 2010.一切都很好并且构建正确(在我实现新的构建过程之后,使一切都非常好从任何远程Visual Studio 2010客户端单击构建启动).Visual Studio不需要安装在Build Agent上.我非常努力(非常努力)不在构建代理上安装Visual Studio,因为我的理解是没有必要,并且我们没有许可将它安装在非开发机器上.
现在我尝试将解决方案升级到VS 2010,仍然针对.NET 3.5,因为它是针对SQL Server CLR过程的程序集,而SQL Server还不支持.NET 4.0.但我根本无法在TFS Build下进行构建.我似乎无法从TFS Build和MS Build命令行获得一致的错误消息,但我认为它与Microsoft.Cpp.Targets不在C:\ Program Files\MSBuild \中有关,因为我没有没有安装Visual Studio.我确实安装了Microsoft Windows SDK 7.1,这样我就可以为其他一些.NET 4.0项目运行像svcutil这样的.NET 4.0 SDK工具,但似乎没有安装这个构建所需的东西.TFS构建错误给我的是:
C:\ TFSBld [...]\GenerateLanguage\GenerateLanguage.vcxproj(46,3):错误MSB4019:找不到导入的项目"C:\ Microsoft.Cpp.Default.props".确认声明中的路径是否正确,以及该文件是否存在于磁盘上.
当我点击该错误时,它会将我带到vcxproj文件中的这一行:
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
Run Code Online (Sandbox Code Playgroud)
我真正需要在这个项目中运行resgen来从resx文件生成资源文件,并将它们编译成sattelite程序集.我正在使用makefile构建来执行此操作,手动运行resgen(我认为这是因为我无法找到将sattelite程序集编译为独立解决方案的方法),然后将它们编译成DLL(I不记得现在怎么工作,但我认为是手动运行AL.exe从资源文件编译DLL文件).所以基本上我只需要运行命令行来构建这个项目,我似乎找不到合理的方法来做到这一点而不抛弃整个项目并编辑TFS构建脚本来运行一堆硬编码的命令行代替.必须有一个更好的方法.
我整天都在这里,并尝试编写我自己的.targets文件和.xml属性表来取代标准文件,但它已经超出了我的想象.我试过简单地删除这些行,但是然后MSBuild抱怨没有"Build"目标.我尝试在vcxproj文件中添加一个虚拟对象,但是它似乎没有运行完成所有工作的构建前和构建后步骤.
我注意到在尝试为SQL Server编写CLR过程时,由于被归因于HashSet,因此不允许使用HashSet [HostProtectionAttribute(SecurityAction.LinkDemand, MayLeakOnAbort = true)].SQL Server CLR过程不允许使用MayLeakOnAbort设置的对象.好的,所以在CLR程序中有一些类要避免,甚至可能会考虑在CLR程序之外使用.奇怪的是,Dictionary<K,V>在没有类似的限制.现在基于我对HashSet是什么以及Dictionary是什么的理解,我希望Dictionary应该具有Hashset的所有复杂性,然后是一些.那么,为什么词典没有受到类似的限制呢?我正在"考虑使用HashSet<T>"并认真考虑使用字典,即使我没有编写CLR过程,只需要一个可以快速测试复杂键的成员资格的集合(对象参考为没有定义比较,散列或相等接口的对象).我最好使用Hashset还是字典?Hashset是否与众不同之处在于它允许使用没有比较的类或基于内存地址的相等接口或可能是为什么HashSet不那么"干净"的原因?
似乎每次我使用XMLReader时,我最终会进行一系列的试验和错误,试图弄清楚我要阅读的内容与我正在阅读的内容和我刚才阅读的相比.我总是把它弄清楚,但是在我多次使用它之后,我似乎并没有牢牢掌握当我调用各种函数时XMLReader实际上在做什么.例如,当我第一次调用Read时,如果它读取元素开始标记,它现在是在元素标记的末尾,还是准备开始读取元素的属性?如果我调用GetAttribute,它是否知道属性的值?如果我此时调用ReadStartElement会发生什么?它会完成读取start元素,还是寻找下一个元素,跳过所有属性?如果我想阅读一些元素怎么办 - 什么' 是尝试读取下一个元素并确定其名称的最佳方法.将Read继续IsStartElement工作,或者IsStartElement将返回有关我刚读过的元素之后的节点的信息吗?
正如您所看到的,我真的不了解XMLReader在读取的各个阶段所处的位置以及各种读取函数对其状态的影响.是否有一些我根本没注意到的简单模式?
这是问题的另一个例子(取自回复):
string input = "<machine code=\"01\">The Terminator" +
"<part code=\"01a\">Right Arm</part>" +
"<part code=\"02\">Left Arm</part>" +
"<part code=\"03\">Big Toe</part>" +
"</machine>";
using (System.IO.StringReader sr = new System.IO.StringReader(input))
{
using (XmlTextReader reader = new XmlTextReader(sr))
{
reader.WhitespaceHandling = WhitespaceHandling.None;
reader.MoveToContent();
while(reader.Read())
{
if (reader.Name.Equals("machine") && (reader.NodeType == XmlNodeType.Element))
{
Console.Write("Machine code {0}: ", reader.GetAttribute("code"));
Console.WriteLine(reader.ReadElementString("machine"));
}
if(reader.Name.Equals("part") && (reader.NodeType == XmlNodeType.Element))
{
Console.Write("Part code {0}: ", reader.GetAttribute("code"));
Console.WriteLine(reader.ReadElementString("part"));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
第一个问题,机器节点被完全跳过.MoveToContent似乎移动到机器元素的内容,导致它永远不会被解析.此外,如果您跳过MoveToContent,则会收到错误:"'Element'是无效的XmlNodeType." 尝试ReadElementString,我无法解释.
接下来的问题是,在读取第一部分元素时,ReadElementString似乎在阅读后将阅读器定位在下一个部分元素的开头.这会导致reader.Read在下一个循环的开头跳过下一个跳转到最后一个part元素的part元素.所以这段代码的最终输出是:
零件代码01a:右臂 …
我正在使用带有SqlClient.SqlConnection的SQL连接字符串,并在字符串中指定Connection Timeout = 5,但它仍然等待30秒才返回失败.如何让它放弃并快速返回?我在一个快速的本地网络上,不想等待30秒.未打开的服务器需要30秒才能失败.这只是一个快速的实用程序,它将始终只在本地网络上运行.
编辑:对不起,如果我不清楚.我希望SqlConnection.Open更快地失败.希望这可以从我想要更快失败的服务器被关闭的事实中推断出来.
编辑:似乎设置有时只会失败.就像它知道服务器的IP地址,并使用TCP/IP与它通信(非本地)但不能联系该地址的SQL Server?我不确定该模式是什么,但我在本地连接SQL Server停止时没有看到问题,并且在尝试连接到不存在的服务器时我没有看到它.我曾尝试联系Windows 2008防火墙阻止SQL Server的服务器时看到过它.
我正在编写一个游戏开发IDE,用于创建和编译.NET项目(我过去几年一直在研究),并且我正在更新它以生成输出,不仅适用于Windows/Visual Studio,还适用于对于Linux/MonoDevelop(一个非常简单的.NET进程,但仍然需要一些调整).
作为其中的一部分,我发现有必要开始生成app.config文件作为其中的一部分,以将依赖的DLL名称映射到具有<dllmap>元素的Linux依赖项名称.我很担心谁负责将app.config文件复制到输出名称app.exe.config.在Visual Studio项目中,app.config的Build Action通常设置为"None",其设置表明它不会被复制到任何地方,但是当Visual Studio编译项目时它会生成app.exe.config(虽然我有时发现这是不可靠的).当我使用MSBuild构建IDE生成的解决方案文件(用于调试目的)时,MSBuild将app.config复制到app.exe.config.但是当我使用CSharpCodeProvider.CompileAssemblyFromFile编译项目时(自然而然)并没有 像配置文件作为源代码包含("app.config(1,1):错误CS0116:命名空间不直接包含诸如字段或方法之类的成员"),当然它不会将其复制到当我不将它作为输入包括时输出.我是否有责任单独将app.config复制到app.exe.config,或者有更标准的方法吗?
是否硬连线采用第一个*.config文件?在我的IDE中,可以想象app.config文件将被重命名或添加另一个(就像在Visual Studio中一样).我觉得IDE对配置文件有这个秘密行为似乎很奇怪(我认为MonoDevelop在这方面表现相似,因为我找不到配置文件的特殊操作).我不知道它甚至会选择这个秘密行动适用的文件.
我注意到当我使用此语句时,该Action列不可为空:
SELECT TOP 0 SerialNumber, 0 [Action] INTO #MyTable FROM FSE_SerialNumber
Run Code Online (Sandbox Code Playgroud)
但是当我使用这个语句时,该Action列可以为空:
SELECT TOP 0 SerialNumber, CAST(0 as int) [Action] INTO #MyTable FROM FSE_SerialNumber
Run Code Online (Sandbox Code Playgroud)
我以这种方式创建表的原因是因为我不希望临时表从服务器默认排序规则或其他地方继承SerialNumber的排序规则.我希望它匹配FSE_SerialNumber..SerialNumber的排序规则.
我的问题是,我可以依靠演员函数给我一个可以为空的列,或者这个没有明确定义并且可能会改变.为什么演员突然使列可以为空?有没有更好的方法(除了评论)澄清我的意图是在那里获得一个可以为空的列?
我们一直在使用SAP"COM许可证桥"来访问其许可证服务器并以编程方式查询系统的硬件密钥(以重用自己的许可证).这在SAP Business One版本2007A,2007B和8.8上运行良好,但是在8.81中它们似乎更新了它们的CORBA接口而没有更新COM包装器,因为我们现在在尝试调用GetHardwareKey函数时获得了内存异常.
所以我下载了IIOP.NET并开始尝试编写自己的界面.无论如何我从来都不喜欢COM包装器.但我遇到了我的旧远程.NET远程控制 - 无法在服务器和客户端都没有定义公共接口的情况下调用远程方法.我尝试使用IIOP.NET附带的IDL到CLS编译器,但我继续得到关于接口beign不兼容的错误(SAP没有提供IDL文件).我不知道IIOP和CORBA如何确定接口是否兼容.但我甚至尝试调试IIOP.NET代码并强制它执行该方法,尽管不兼容,但收到一个空字符串而不是我想要的硬件密钥.
我的下一步是尝试实现虚假的许可证服务器并检查来自生产客户端的请求,以期确定它们应该是什么样子,但考虑到我遇到的困难,我并不指望取得多大的成功.深入了解.NET远程的内容.
我真正的问题是如何获取或生成SAP Business One硬件密钥,但由此产生的问题包括:
编辑:我设法通过应用RepositoryID属性使IIOP.NET/CORBA相信我有一个兼容的接口:
[Ch.Elca.Iiop.Idl.InterfaceType(Ch.Elca.Iiop.Idl.IdlTypeInterface.ConcreteInterface)]
[Ch.Elca.Iiop.Idl.RepositoryID("IDL:LicenseInfo:1.0")]
public interface ILicenseInfo : Ch.Elca.Iiop.Idl.IIdlEntity
{
void GetHardwareKey(out string hwKey);
}
Run Code Online (Sandbox Code Playgroud)
但我仍然得到一个空字符串结果.
编辑2:经过一些实验和调试之后,我发现响应消息确实包含了我正在寻找的数据,但是没有正确地解析成客户端值,可能是因为我的接口定义不好.希望进一步调试响应处理将帮助我弄清楚如何纠正我的界面.奇怪的是,它从响应中解析的第一件事是一个空的盒装值,这似乎不适合"out string"参数.
编辑3:我发现我需要将字符串属性应用于这样的参数,以防止它们被视为盒装值:
void GetHardwareKey([StringValue(), WideChar(true)] out string hwKey);
Run Code Online (Sandbox Code Playgroud)
但是,尽管有WideChar属性,我对CodeSet不支持WChar或其他东西的错误.我已经非常接近搞清楚了.
编辑4:我对如何为WChar设置代码集感到困惑.如果我没有设置它,我收到一个错误:"未指定或不支持WChar代码集." 因为服务器返回了一个unicode字符串而没有覆盖默认字符集.我找不到任何方法来覆盖客户端.我试着打电话:
omg.org.CORBA.OrbServices.GetSingleton().OverrideDefaultCharSets(
CharSet.UTF8, WCharSet.UTF16);
Run Code Online (Sandbox Code Playgroud)
但这似乎对客户端没有任何影响.示例代码显示在服务器端调用它.但我没有写服务器,所以我无法控制它.我唯一的选择是为了我自己的目的重写IIOP.NET代码,强制默认的WChar CodeSet生效?