考虑一下C#中的这对函数:
void func1() {
DispatcherTimer tmr = new DispatcherTimer();
tmr.Interval = TimeSpan.FromSeconds(5);
tmr.Tick += func2;
tmr.Start();
}
void func2(object a, EventArgs b) {
// Called every 5 seconds once func1() is called
}
Run Code Online (Sandbox Code Playgroud)
在调用func1()一次后,func2()从那时起每隔5秒被调用一次,即使我丢失了对我的计时器的引用,因为它的作用域仅限于func1().这意味着计时器显然仍在内存中,在调用func1()之后很长时间.我的问题是,如果我将它添加到func2():
void func2(object a, EventArgs b) {
// Called every 5 seconds once func1() is called
((DispatcherTimer)a).Stop()
}
Run Code Online (Sandbox Code Playgroud)
很快就会通过垃圾收集来获取计时器,还是会继续留在内存中直到程序退出?如果它留在内存中,我如何手动标记它(或做类似的事情)?
我有一个第二个问题(如果你愿意回答)是在这种情况下,如果一个普通的Timer会有完全相同的行为,或者我应该知道一个显着的差异.
谢谢!
编辑:当我说"SQL Server"时,我真的在谈论Management Studio.对不起,如果那令人困惑.
哦,我讨厌这样的事情发生.我昨天正在使用SQL Server并尝试使用PIVOT命令来试图弄清楚它是如何工作的.所以我创建了一个包含四列的新表,第一列的前几行将具有相同的值.
我将"value1"添加到第一行,第一列,然后点击输入 - 正弦没有添加任何键或约束,它允许我输入下一行,第一行的其他列为NULL(这是精细).令我惊讶的是,它还允许我在第二行输入"value1"并输入 - 这应该是不可能的,因为现在有两个相同的行.但是,因为我只是乱搞,这并没有打扰我.所以我继续创建四行:
表格1
Col1 Col2 Col3 Col4
---------------------------------
Value1 NULL NULL NULL
Value1 NULL NULL NULL
Value1 NULL NULL NULL
Value1 NULL NULL NULL
Run Code Online (Sandbox Code Playgroud)
显然这很奇怪并打破了关系理论,但我并不在乎,因为这只是我创建的一张桌子.但是,我只是把头发拉到接下来发生的事情上.在我获得这些数据之后,我无法对表做任何事情.如果我试图填写任何行上的col2,col3或col4,SQL Server会尖叫我有重复行:"没有行更新.第1行中的数据未提交....行值(s)更新或删除要么不使行唯一,要么改变多行(4行)."
换句话说,SQL Server允许我输入重复的行,但是当我尝试更新行以使它们成为唯一时,它不允许我,因为它有重复的行作为其原因.最糟糕的是我甚至无法删除任何行(我得到相同的错误消息).我在这个场景中找到的唯一解决方案是删除表并重新开始 - 这很荒谬.
我的问题是,这种行为如何在一个已经发展了十多年的着名计划中存在?我是那个没脑子的人,我应该接受SQL Server的行为吗?对我来说,这是不可接受的,SQL Server应该从不允许我首先输入重复的行,或者它应该允许我更新重复的行,直到它们都是唯一的,然后尝试保存.
这绝不意味着某种SQL Server讨厌的帖子.我遇到这样的行为是相对罕见的,但是当我这样做时,它确实可以让我落后并让我发疯.我只是不明白为什么程序有像这样的内置行为.就像它为什么在世界上做的那样,让我先输入重复的行,如果它不打算让我修复它?
我记得当天和MS Access一起工作,我会遇到同样奇怪,古老的行为.有几次我不得不复制大量的数据,重新创建表格,然后将其复制回来只是因为Access允许我做一些它不应该做的事情,并且现在阻止我进行任何修改以修复它 - 有效地产生僵局.
那么这里发生了什么?在接近SQL Server时,我是否需要某种范式更改?这是我或SQL Server的问题吗?(你可以说是我,我可以接受它.)
在Excel中使用VBA脚本,我试图在表中插入一个新行,然后返回该行的标识值.如果我跑:
INSERT INTO DataSheet(databaseUserID, currentTimestamp)
VALUES (1, CURRENT_TIMESTAMP);
SELECT SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)
在Management Studio中,插入行并按预期返回给我返回的标识值.但是,当我通过VBA中的ADODB记录集运行完全相同的查询时,我遇到了麻烦.该行确实已插入,但我无法访问标识值.记录集列出了0个字段,实际上也已关闭.我已尝试使用和不使用分号,我也尝试将查询作为单个事务运行.同样的交易,没有骰子.知道发生了什么事吗?
这是我的VBA:
Dim rs As ADODB.Recordset
Dim cn As Connection
Dim SQLStr As String
Dim serverName As String
Dim databaseName As String
serverName = "MSSQLServer"
databaseName = "QA"
cxnStr = "Driver={SQL Server};Server=" & serverName & ";Database=" & databaseName & ";"
SQLStr = "INSERT INTO DataSheet(databaseUserID, currentTimestamp)
VALUES (1, CURRENT_TIMESTAMP); SELECT SCOPE_IDENTITY()"
Set cn = New ADODB.Connection
cn.Open cxnStr
Set rs = New ADODB.Recordset
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic
MsgBox …Run Code Online (Sandbox Code Playgroud) 我注意到.NET DLL的位置有些奇怪.我试图调试System.ServiceModel.dll的问题,我注意到即使我安装了.NET 4.0,我的GAC中也只安装了3.0版本的ServiceModel DLL(我通过探索C:\ Windows进行了检查) \部件).但是,如果我导航到"C:\ Program Files\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Profile\Client",则4.0版本就位于此处.那么为什么.NET不将4.0版本安装到GAC中呢?
考虑到它没有,我的4.0程序如何知道在哪里可以找到4.0 DLL?我上面给出的文件路径是自动探测的吗?我回头看了我的应用程序,它使用4.0 DLL来确认它不会在本地复制DLL,因此它似乎必须从GAC获取它(现在我知道DLL不在那里),或者在探测.NETFramework文件夹.这让我很困惑......
编辑:我遵循MystereMan的建议并运行"Gacutil.exe/l System.ServiceModel",但它仍然只显示3.0版本.这是否意味着.NET 4毕竟没有将DLL安装到GAC中?
编辑#2和解决方案:我的PATH中的gacutil.exe是一个旧版本,无法看到4.0程序集.通过搜索我的计算机,我在这里找到了4.0版本的gacutil.exe:C:\ Program Files\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools.使用它,我终于可以看到列出了System.ServiceModel.dll的4.0.谢谢大家的帮助!
谢谢,
- 罗伯特·
在任何人投票决定将其作为欺骗者之前,请知道我到目前为止发现的每个问题都是关于有利于数据库建模的特定程序的问题.我的问题是什么是行业标准语言(如果有的话)用于建模关系数据库?
我知道UML在一般情况下非常流行,特别是对于OOP建模,我正在阅读的书的作者(Davidson的"Pro SQL Server 2005数据库设计和优化")使用IDEF1X.MS Visio虽然它支持IDEF1X,但默认为通用建模语言,没有很多特定符号(称为"关系"符号集),但我知道Visio非常标准,因为它是Office套件的一部分.
那么,作为一名暑期实习生试图建立我的简历,哪种建模语言将证明在未来的行业中最有用?
我正在寻找一种高级的算法理解,这样我就可以了解SQL-Server正在做什么来执行连接.随意简洁,我不是在寻找极其细腻的细节.促使我理解联接如何更好地实现的事情是我刚刚发布的这个问题背后的情景.我觉得他们最终是两个单独的问题,这就是为什么我没有将它们结合起来.
谢谢!
如何使用.query()语法t-sql来选择特定节点,但只获取内部文本而不是包含在节点标签中的内部文本?
就像我这样做的时候:
SELECT TOP 1 [XMLContent].query('/Event/Username'), * from Events
Run Code Online (Sandbox Code Playgroud)
我明白了:
<Username>BURGUNDY</Username>
Run Code Online (Sandbox Code Playgroud)
但我想要的只是BURGUNDY.很明显我可以做一些子字符串来获得它,但我希望有一个快速简便的方法来做到这一点.
有一段时间我一直在努力将数据从膨胀的Excel工作簿插入到SQL数据库中.我的团队建议保留.xls的备份,他们想知道将Excel工作簿实际放在数据库中是否一个好主意,以便我们项目中的所有相关数据都在一起.
我知道有些数据库支持插入二进制文件,但显然这不是数据库系统最初的预期用途,所以我认为这是一个坏主意.我的投票是将URL放入数据库中的工作簿,并将工作簿保存在Intranet上的安全位置.
什么是优点(如果有的话,除了将生产数据和备份保存在同一个地方)和将BLOB放在数据库中的缺点?
编辑:为了进一步澄清,虽然我给出了一个特定的场景,但我打算这个问题主要是关于一般的BLOB.但是,无论我能为你的回答收集什么,这将有助于我在我的具体情况,当然,赞赏.:)
谢谢,
-Robert
PS对于那些不知道的人,BLOB是"Binary Large Object"的缩写
我上学期参加了计算机网络,并在linux(使用gcc)中为我的项目做了一些C编程.我遇到的一件非常繁琐的事情是,如果我的程序崩溃或停滞(然后我必须按Ctrl + C来杀死它),网络端口仍然会打开一分钟左右.因此,如果我想立即再次运行该程序,我将首先进入头文件,更改端口,重新制作程序,然后最终运行它.显然,这非常繁琐非常繁琐.
是否有任何方法可以在进程被终止时立即释放端口?要么通过linux中的某些设置,要么是我的程序的makefile,甚至是C中的编程?
编辑:我指的是编写服务器并选择一个特定端口来托管程序.
正如许多年轻程序员所做的那样,我学会了在代码中的不同点插入"here1","here2"等多个打印到控制台语句的有用性,以确定我的程序何时出错.在我的CS研究中,这种强力调试技术为我节省了很多次.但是,当我开始用C编程时,我偶然发现了一个有趣的问题.如果我试着跑
void* test;
printf("hello world");
test[5] = 234;
Run Code Online (Sandbox Code Playgroud)
当然,我为testChar而没有malloc'ing内存的段错误.但是,你会在逻辑上认为的"Hello World"将在赛格故障发生之前打印的,因为这是代码的流程,但以我的经验,它始终是赛格故障首先发生的情况,以及"世界你好"根本没有打印到控制台.(我没能测试这个确切的例子,但我遇到了这种使用在Linux中gcc的情况很多次了.)我猜这有两种编译器重新安排一些事情和/或printf的做使用某种异步刷新的缓冲区,因此不是立即的.这完全是我的猜测,因为我老实说不知道为什么会这样.在我使用的任何其他语言中,无论"testChar = ..."行引起什么问题,"hello world"仍会被打印,因此我可以确定问题所在.
我的问题是为什么在我编程C时会发生这种情况?为什么不首先打印你好世界?其次,有没有比这更好的C编程调试技术完成相同的基本操作?如何,一个简单/直观的方法来找到有问题的代码行?
编辑:我偶然给了一个工作的例子哈哈.我现在拥有的应该是一个段错误.有趣的是,通常当我不想要一个段落错误时,我得到一个,现在当我真正想要一个我编写法律代码时!