有没有更好的方法来执行这样的查询:
SELECT COUNT(*)
FROM (SELECT DISTINCT DocumentId, DocumentSessionId
FROM DocumentOutputItems) AS internalQuery
Run Code Online (Sandbox Code Playgroud)
我需要计算此表中不同项目的数量,但不同的是超过两列.
我的查询工作正常,但我想知道我是否只使用一个查询得到最终结果(不使用子查询)
假设我有一个这样的触发器:
CREATE TRIGGER trigger1
ON [dbo].[table1]
AFTER UPDATE
AS
BEGIN
--declare some vars
DECLARE @Col1 SMALLINT
DECLARE @Col1 TINYINT
--declare cursor
DECLARE Cursor1 CURSOR FOR
SELECT Col1, Col2 FROM INSERTED
--do the job
OPEN Cursor1
FETCH NEXT FROM Cursor1 INTO @Col1, @Col2
WHILE @@FETCH_STATUS = 0
BEGIN
IF ...something...
BEGIN
EXEC myProc1 @param1 = @Col1, @Param2 = @Col2
END
ELSE
IF ...something else...
BEGIN
EXEC myProc2 @param1 = @Col1, @Param2 = @Col2
END
FETCH NEXT FROM Cursor1 INTO @Col1, @Col2 …Run Code Online (Sandbox Code Playgroud) 我有一个View,它有一个绑定到我的ViewModel(MVVM模式)的项目列表.
让我们说它看起来像那样:
<ScrollViewer Width="Auto" Height="Auto">
<ItemsControl ItemsSource="{Binding Path=MessageLog}"
Grid.IsSharedSizeScope="True"
ScrollViewer.CanContentScroll="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" SharedSizeGroup="FullName"/>
<ColumnDefinition Width="*" SharedSizeGroup="MessageLog"/>
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text="{Binding Path=PostedBy.FullName}" />
<TextBlock Text="{Binding Path=DatePosted}" />
</StackPanel>
<TextBlock Grid.Column="1" Text="{Binding Path=MessageLog}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
当用户向MessageLog添加内容(VM中有一个属性MessageLog)时,我想自动滚动到最新的项目.
换句话说,我只想在用户键入消息并点击输入时自动移动滚动条(就像Skype一样).
MessageLog上的绑定按预期工作,并在视图上更新项目.(我很高兴,我想这样离开)
我想知道如果使用MVVM模式方法,我仍然可以在View后面的代码文件中实现自动滚动吗?这似乎是相当逻辑的,因为滚动行为与VM无关,而ViewModel对View没有任何了解.这样对吗?我是正确的方式还是我错过了什么?
一般来说,在向View添加实现时有意义吗?
控制台应用程序有3个线程:Main,T1,T2.目标是尽可能以最低延迟(μs)从主线程"发信号"T1,T2(并让它们做一些工作)
注意:
看看下面的代码:
样品1
class Program
{
private static string msg = string.Empty;
private static readonly CountdownEvent Countdown = new CountdownEvent(1);
static void Main(string[] args)
{
while (true)
{
Countdown.Reset(1);
var t1 = new Thread(Dowork) { Priority = ThreadPriority.Highest };
var t2 = new Thread(Dowork) { Priority = ThreadPriority.Highest };
t1.Start();
t2.Start();
Console.WriteLine("Type message and press [enter] to start");
msg = Console.ReadLine();
ElapsedLogger.WriteLine("Kick off!");
Countdown.Signal();
Thread.Sleep(250);
ElapsedLogger.FlushToConsole();
}
}
private static void Dowork()
{
string t = Thread.CurrentThread.ManagedThreadId.ToString(); …Run Code Online (Sandbox Code Playgroud) 我正在编写一个客户端,每秒向服务器发送一个"心跳信号".客户端在后台线程中调用WCF服务以报告其活动.
如何对此进行单元测试?我是否需要等待几秒钟并检查是否多次调用了适当的方法?
它应该是某种情景测试吗?也许我不应该担心在整个客户的整个生命周期中不断调用服务?
我可以测试对WCF服务的单个调用,但它不测试"心跳模式".
我正在使用TDD方法.(C#,NUnit,Moq)
有什么建议或例子吗?
编辑:
我认为还不够清楚.
这是我所拥有的更简单的版本:
public class FeedService
{
private Timer t;
public FeedService()
{
t.Interval = 1000;
t.Elapsed += TimerElapsed;
t.Start();
}
private void TimerElapsed(object sender, ElapsedEventArgs e)
{
t.Stop();
SendHeartbeat();
t.Start();
}
}
Run Code Online (Sandbox Code Playgroud)
......这是我的考验:
[Test]
public void Heartbeat_called_twice_after_2_seconds()
{
var mockFeedService = new Mock<FeedService>();
Thread.Sleep(2000);
mockFeedService.Verify(x => x.SendHeartBeat(), Times.AtLeast(2));
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
1)为什么我的测试总是失败?我做错了什么?
2)我应该测试一下吗?
我有以下T-SQL代码:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION T1_Test
/*This is a dummy table used for "locking"
and it doesn't contain any meaningful data.*/
UPDATE lockTable
SET ID = 1
WHERE ID = 1
DECLARE @Count TINYINT
SELECT @Count = COUNT(*)
FROM debugSP
WAITFOR DELAY '00:00:5';
INSERT INTO debugSP
(DateCreated, ClientId, Result)
SELECT
GETDATE(), @@SPID, @Count
COMMIT TRANSACTION T1_Test
Run Code Online (Sandbox Code Playgroud)
我正在使用标记为注释的"锁定"黑客获取独占锁.
注意:使用TABLOCKX或UPDLOCK提示将不起作用,因为我通过拆分语句并在中间添加WAITFOR命令以进行测试来破坏ATOMIC-ity.我不想要那样的东西:
INSERT INTO debugSP (DateCreated, ClientId, Result)
SELECT GETDATE(), @@SPID, COUNT(*)
FROM debugSP
Run Code Online (Sandbox Code Playgroud)
这是运行两个同时会话(带锁表)后的正确结果
Id DateCreated ClientId Result
-- ----------------------- …Run Code Online (Sandbox Code Playgroud) c# ×2
sql ×2
sql-server ×2
t-sql ×2
.net ×1
binding ×1
cursor ×1
database ×1
ipc ×1
locking ×1
low-latency ×1
mvvm ×1
nunit ×1
performance ×1
transactions ×1
unit-testing ×1
wpf ×1