我有以下要求:
select *
from tbA A, tbB B, tbC C, tbD D
where
A.ID=B.ID and B.ID2= C.ID2 and A.ID=D.ID and C.ID3=D.ID3 and B.ID4=D.ID4
and
A.Foo='Foo'
Run Code Online (Sandbox Code Playgroud)
我多次听说过这种连接语法是折旧的,我应该使用'JOIN'关键字.
如何在这种复杂的连接中执行此操作(多个表连接在属于不同表的多个列上)?您认为这种最佳做法仍适用于此吗?
请考虑以下代码:
private enum myEnum
{
A,
B
}
private void myMethod(myEnum m)
{
switch (m)
{
case myEnum.A:
//do stuff
break;
case myEnum.B:
//do stuff
break;
default:
throw new NotImplementedException(m.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将第三个成员C添加到myEnum,我只会在运行时被NotImplementedException警告
我想做的是让编译器在有未处理的情况并且没有默认情况的情况下警告我:case.
有没有办法做到这一点,或者解决这个问题的其他方法,最终目标是在编译时警告某些东西丢失了?
在另一个SO问题中,我看到有几个人建议我总是使用TryGetValue.
虽然我总是在Contains?/ Access模式上使用TryGetValue,但是当我希望密钥始终在字典中时,我会故意避免使用此模式.然后我去寻找直接的索引器,这样如果没有键就会引发异常,因为真正意外发生了一些事情(即在我期望的时候键不在字典中).
由于似乎已经对我的"最佳实践"达成了普遍共识(我提到明确建议在任何时候使用TryGetValue的帖子中有4人中有3人),我渴望阅读有关该主题的扩展讨论. .
如何将无限小数(即.333333333 ...)转换为字符串分数表示(即"1/3").我正在使用VBA,以下是我使用的代码(我在"b = a Mod b"行遇到溢出错误:
Function GetFraction(ByVal Num As Double) As String
If Num = 0# Then
GetFraction = "None"
Else
Dim WholeNumber As Integer
Dim DecimalNumber As Double
Dim Numerator As Double
Dim Denomenator As Double
Dim a, b, t As Double
WholeNumber = Fix(Num)
DecimalNumber = Num - Fix(Num)
Numerator = DecimalNumber * 10 ^ (Len(CStr(DecimalNumber)) - 2)
Denomenator = 10 ^ (Len(CStr(DecimalNumber)) - 2)
If Numerator = 0 Then
GetFraction = WholeNumber
Else
a = Numerator …Run Code Online (Sandbox Code Playgroud) 我有以下数据:
SectorKey Sector foo
1 A null
2 B null
... ... ...
1 null a
2 null b
2 null c
1 null d
2 null e
... ... ...
Run Code Online (Sandbox Code Playgroud)
我希望根据sectorKey的值更新列为Sector时的扇区,即当SectorKey为1时我希望Sector为'A',而当SectorKey为2时我想要'B'
我试过这个查询:
update tbFoo
set Sector=A.sector
from tbFoo A INNER JOIN tbFoo B
ON A.SectorKey=B.SectorKey
and A.Sector is not null
and B.Sector is null
Run Code Online (Sandbox Code Playgroud)
并收到此错误消息:
表'tbFoo'含糊不清.
我试过别名第一个tbFoo,但它似乎不是一个有效的语法.我不明白为什么SQLServer抱怨模糊的命名,因为我的所有表都有别名.
我找到了这个帖子,我觉得我在做的事情与在upvoted答案中完全一样.我也尝试了在接受的答案中建议的查询:
update tbFoo A
set Sector =
(select Sector from tbFoo
where A.SectorKey=SectorKey and Sector is not null)
Run Code Online (Sandbox Code Playgroud)
然后SQLServer抱怨"A"附近的语法不正确
关于可能发生的事情的任何想法,并解决这个问题?我正在使用SQLServer …
我的一位客户希望我对他的一些旧数据进行定期"真正"破坏,我正在评估最好的方法.
数据在表中,我想销毁其中包含的一些行.
我可以手动删除/导出另一台计算机上的数据库/消磁硬盘/重新导入保存的数据,但我需要一个自动解决方案.
是否有一个等效的删除(如在delete*from foo中)命令,它会执行数据的安全销毁(使用DoD安全擦除,或类似的东西?)
您是否看到了执行此自动删除的其他方法?
顺便说一句,我知道有人检索我使用sql delete命令销毁的一些数据的可能性非常小,但我的一些客户需要它.所以请不要将这个问题变成关于数据处理程序主题的全球辩论!
编辑:我想要解决的问题不是"我应该如何销毁数据以使其无法恢复",而是"如何说服我的客户说他们的数据无法恢复".
我已经读了很多次,不应该盲目地捕捉异常.有人说可以将你的Main()包装成一个catch块来显示错误而不是只退出(例如参见这篇SO帖子),但似乎有一种共识,即如果出现意外情况,你绝不应让程序运行,因为它处于未知状态,并可能以意想不到的方式行事.
虽然我同意隐藏错误而不是修复错误这一事实绝对是错误的想法,但请考虑以下情况:
你有一个庞大的服务器.百万行代码.
启动时,它会将所有Customer加载到其本地缓存中.
对我来说,写这个很有意义:
foreach (string CustomerID in Customers)
try
{
LoadCustomer(CustomerID);
}
catch (Exception ex) // blind catch of all exceptions
{
// log the exception, and investigate later.
}
Run Code Online (Sandbox Code Playgroud)
没有盲目捕获,无法加载单个客户只会使所有服务器崩溃.
我绝对宁愿让我的服务器对一个客户产生一些未知的副作用,而不是整个服务器.
当然,如果我运行我的catch代码,我要做的第一件事就是修复代码中的错误.
有什么东西我在这里俯瞰吗?是否有已知的最佳实践(除了'永远不会捕获意外异常'策略'?)
是否更好地捕获LoadCustomer()方法中的异常,从那里重新抛出'CustomerLoadException',并捕获CustomerLoadException而不是调用代码中的所有Exception?
我正在尝试以编程方式确定与给定IP地址关联的公司*.
我的第一个猜测是:
string hostname = Dns.GetHostEntry(IPAddress.Parse(ip)).HostName;
Run Code Online (Sandbox Code Playgroud)
但如果没有正确设置反向DNS,这将无效,这似乎在90%的时间内发生.
但是,即使反向DNS失败,某些网站仍能成功确定与特定IP相关联的公司.例如,在此站点上,即使未设置主机名,ISP提供商字段有时也包含有价值的信息(即公司名称).
使用.net实现同样功能的最简单方法是什么?
备注:
编辑关于whois的使用:有时,没有与IP相关联的whois信息
虽然我一直在努力保持WinForms应用程序,我正在努力简单易学,我正在工作的(金融)功能领域非常丰富,我觉得我应该帮助用户弄清楚要做什么一旦程序启动,请执行下一步.
我必须在我正在处理的软件中添加它,通常是"下一步要做的事情"(即验证某些内容,回复消息等)
在过去的几天里,我一直在考虑这个问题,我觉得在这个领域已经尝试了很多东西:
Clippy(RIP).
的?右上角的按钮(又名"这是什么"按钮),用户已经学会忽略点击"retro-transponder amplitude" ?可能会带来一个有用的"复古转发器振幅"工具提示,这不值得鼠标前往右上角.
这有几个变化?按钮,包括状态栏中的上下文帮助区域(指鼠标当前悬停的东西),解决了必须点击"?"的问题,但仍然不让用户抓住整个界面一目了然.编辑:Joe建议的上下文帮助窗口就是另一个例子.
帮助文件是有帮助的(只要它们写得很好),但它们缺乏"即时反馈"的东西 - 恰恰是Clippy试图解决的问题
"一天的提示"通常是视线拍摄(通常比一些用户甚至没有时间发现"启动时显示当天的提示"勾选复选框的速度快)
我正在考虑的是使用覆盖帮助屏幕,即点击"F1"会在屏幕上弹出很多叠加工具提示,说明所有内容,可能是红色工具提示(而不是黄色)用于推荐的下一个操作.释放F1(或可能再次击中它)会隐藏所有帮助杂乱
这将解决我提到的四种方法的问题:
帮助只是按需弹出(vs clippy)
你不必点击?那么屏幕上的每个标签(vs ?按钮)
您不必花时间在帮助文件中搜索相关信息.文档就在您的指尖(vs .chm帮助文件)
有用的提示会在相关时间显示(即,在显示时会显示有关对话框foo的提示,而不是在程序启动时 - 当您可能不知道foo对话框的外观时)
在某些软件中已经尝试过这个吗?你认为这是个好主意吗?你有其他想法来解决我的问题吗?
免责声明:请不要回答"你应该解决你的真正问题,那就是你的UI过于复杂".请假设已完成所有操作以保持UI简单.
想想一架客机驾驶舱.努力进入了用户界面,但它仍然非常复杂.现在想象普通用户应该能够使用它:你将如何解决这个问题?这正是我的问题.
我有一个表定义为:
OrderID bigint NOT NULL,
IDA varchar(50) NULL,
IDB bigint NULL,
[ ... 50 other non relevant columns ...]
Run Code Online (Sandbox Code Playgroud)
此表的自然主键是(OrderID,IDA,IDB),但这不可能,因为IDA和IDB可以为null(它们都可以为null,但它们永远不会同时定义).现在我对这3列有一个独特的约束.
现在,问题是我需要一个主键来启用事务复制,我面临两个选择:
第二个替代接缝更清洁,因为我的PK是有意义的,并且是可行的(参见msdn链接),但由于我从未在任何地方看到这样做,我想知道它们是否对这种方法有所帮助.
.net ×3
sql ×3
sql-server ×2
architecture ×1
dns ×1
exception ×1
join ×1
primary-key ×1
usability ×1
vba ×1
warnings ×1
whois ×1
winforms ×1