目前,我们有许多表在主键上使用 newid() 。这导致了大量的碎片。所以我想更改该列以使用 newsequentialid() 代替。
我认为现有数据仍将保持相当分散,但新数据的分散程度将减少。这意味着我也许应该等待一段时间,然后再将 PK 索引从非聚集更改为聚集。
我的问题是,有人有这样做的经验吗?有什么是我忽略的、应该注意的吗?
我很难过.突然之间,Visual Studio无法在Windows/System32目录中找到exe文件(例如xcopy,attrib等).
我有一些预构建和后构建事件,它们执行使用xcopy和attrib的批处理文件.以前它们工作正常,但今天,在构建过程中,Visual Studio找不到它们.显示错误:'xcopy'未被识别为内部或外部命令,可操作程序或批处理文件.
当我第一次发现问题时,我尝试在常规cmd提示符下运行xcopy,并且出现了同样的问题.重新启动计算机后,问题在常规cmd提示符中消失,但仍保留在Visual Studio中.重新启动后,Visual Studio cmd提示中也不会出现此问题 - 仅在Visual Studio本身内.
如果在我执行的一个批处理文件中设置检查PATH变量或echo%systemroot%,则一切正常.
在工具 - >选项菜单中,有VisualC++目录的设置.但是,我正在运行C#,而不是C++,此外,我从未更改过这些设置,它们似乎是正确的.
以前有人有这个问题吗?思考?
我试图将NHibernate与未与NHibernate映射的遗留实体一起使用.有时这意味着我需要手动将NHibernate数据刷新到数据库,这样当我尝试将遗留实体与NHibernate映射实体连接时,我不会收到外键异常.
当这发生在需要回滚的事务中时会发生问题.从NHibernate刷新的数据不会回滚.
我能做些什么吗?
UPDATE
仍然很好奇如何做到这一点 - 我不相信给出的任何答案都解决了这个问题.我需要调用Flush().问题是,如何回滚已刷新的数据?
我出生在现代世界,所以我不经常需要处理这类事情,但有人可以解释如何在以下代码中获得正确的数字.这是许多人的一次尝试:
#define X 2527
#define Y 2463
#define Z 3072
main()
{
long int c = X*Y*Z;
printf("%ld",c);
}
Run Code Online (Sandbox Code Playgroud)
我只是想打印一个长整数,但它总是打印错误的结果.我得到整数溢出 - 如果是这样我怎么能防止它们?或者它是我选择的printf格式化程序?
有时您需要定义一些业务规则,规范模式是一个有用的工具。例如:
public class CanBorrowBooksSpec : ISpecification<Customer>
{
public bool Satisfies(Customer customer)
{
return customer.HasLibraryCard
&& !customer.UnpaidFines.Any();
}
}
Run Code Online (Sandbox Code Playgroud)
然而,我经常发现我需要将这些规则“推送”到 SQL 中以提高性能或满足记录分页列表之类的要求。
然后,我必须为规则编写代码两次,一次使用 CLR 代码,一次使用 SQL(或 ORM 语言)。
您如何组织这样的代码?
最好将代码放在同一个类中。这样,如果开发人员正在更新业务规则,他们忘记更新两组代码的可能性就较小。例如:
public class CanBorrowBooksSpec : ISpecification<Customer>
{
public bool Satisfies(Customer customer)
{
return customer.HasLibraryCard
&& !customer.UnpaidFines.Any();
}
public void AddSql(StringBuilder sql)
{
sql.Append(@"customer.HasLibraryCard
AND NOT EXISTS (SELECT Id FROM CustomerUnpaidFines WHERE CustomerId = customer.Id)");
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这对我来说似乎很难看,因为我们现在将担忧混合在一起。
另一种替代方案是使用 Linq-To-YourORM 解决方案,因为 LINQ 代码可以针对集合运行,也可以转换为 SQL。但我发现,除了最琐碎的场景之外,这种解决方案几乎不可能实现。
你做什么工作?
在Visual Studio中,如果选择"开始调试"或"启动而不调试"以运行当前选定的启动项目,Visual Studio将始终构建整个解决方案.这似乎是不必要的,因为它真正需要做的就是构建你想要启动的项目及其依赖项.
例如,如果您有一些单元测试项目,则在所有单元测试项目也进行编译之前,您无法运行启动项目.至少,构建所有这些单元测试项目是浪费时间,因为无论如何,希望运行的项目都不会依赖于它们.
是否有可能改变这种行为?
我们有一个HttpModule,用于捕获异常并将它们记录到db.它看起来像这样:
public class ExceptionLoggingModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.Error += OnError;
}
private static void OnError(object sender, EventArgs e)
{
try
{
var context = (HttpApplication) sender;
var exception = context.Server.GetLastError();
if (exception != null)
{
// Log exception
}
}
catch(Exception)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
这通常是有效的,但我注意到,当Page Methods中出现错误时,OnError方法永远不会触发(即使用WebMethod属性标记的代码隐藏文件中的方法).
怎么会?
除了重新实现Page方法本身内部的异常日志记录之外,我能做些什么吗?
将NHibernate与Linq或Criterion一起使用,是否可以在GUID列上执行LIKE查询?
在T-SQL中,这很简单:*select*from mytable,其中id为'0ae%'*
但是NHibernate不会将Guid转换为字符串.
有没有办法使使用SELECT*的视图与基础表保持同步.
我发现的是,如果对基础表进行了更改,从中选择所有列,则需要"重新创建"视图.这可以通过运行ALTER VIEW语句来简单地实现.
然而,这可能导致一些非常危险的情况.如果您忘记重新创建视图,则不会返回正确的数据.事实上,它可以返回严重混乱的数据 - 列的名称都是错误的和乱序的.
除非您碰巧将测试覆盖,或者数据完整性检查失败,否则什么都不会发现视图是错误的.例如,Red Gate SQL Compare没有发现需要重新创建视图的事实.
要复制问题,请尝试以下语句:
CREATE TABLE Foobar (Bar varchar(20))
CREATE VIEW v_Foobar AS SELECT * FROM Foobar
INSERT INTO Foobar (Bar) VALUES ('Hi there')
SELECT * FROM v_Foobar
ALTER TABLE Foobar
ADD Baz varchar(20)
SELECT * FROM v_Foobar
DROP VIEW v_Foobar
DROP TABLE Foobar
Run Code Online (Sandbox Code Playgroud)
我很想在视图中停止使用SELECT*,这将是一个PITA.某个地方是否有可能解决此问题的设置?
我一直在使用Linq到Active Directory,但我发现很难获得用户所属的所有角色的列表.我可以检索他们的直接组的列表,但它不是递归的.
我试图查询AD目录的原因是解决内置的角色管理器AspNetWindowsTokenRoleProvider,它不允许您调用Roles.GetRolesForUser(用户名),除非用户名与当前的Windows标识匹配.
nhibernate ×2
.net ×1
asp.net ×1
c ×1
c# ×1
command ×1
debugging ×1
events ×1
flush ×1
ldap ×1
newid ×1
prompt ×1
sql ×1
sql-server ×1
transactions ×1
unit-testing ×1
webforms ×1