我使用SQL Server编写的数据库应用程序,使用sql server作为后端.为了数据完整性,我尝试在数据库级别上尽可能强制执行 - 关系,检查约束,触发器.
由于它们,如果数据不一致,则save/update/insert可能会失败,并且app会抛出SqlException.
我在UI中进行各种验证(如果输入的数据无效,则向用户显示有意义的信息),也在BL中,它将错误报告给用户提供给用户的UI.
但是,有些东西确实无法在应用程序中检查,并且由db处理:我的意思是当没有级联删除和用户尝试从主表中删除实体时删除错误等.
例如,员工表在很多关系中充当主人 - 员工经理,部门经理,收银员,团队负责人,团队成员等等.如果我添加一个没有涉及任何关系的新员工我可以删除它,但是用户尝试删除一个主要的关系,由于在DB级强制执行RI规则,删除失败(因为它应该),这没关系.
我在try ... catch中编写删除代码并处理异常,告诉用户他无法删除该员工.但我想给用户更有意义的信息 - 记录无法删除的原因.也许这只是一个测试员工记录,也被添加到测试团队.但是用户忘记了添加的内容,如果我能说"无法删除员工,因为它是团队T1的一部分",用户将知道先去T1团队,删除用户然后再尝试删除它.这是一个简单的例子,因为我说员工可以参与很多关系 - 在我的应用程序中我至少有20个.
解决方案是显示SqlException报告的消息,但这根本不优雅.首先,msg非常技术性 - 它谈论FK,PK,触发器,这对用户来说毫无意义并且会吓到它们.其次,我的应用程序使用多语言UI,所有菜单和消息都以用户选择的语言显示(在登录时或用户配置文件中选择).并且来自SqlException的消息是英语(如果我使用英语版本)或最差的,不太常见的语言,如德语或荷兰语,如果它发生sql server就是那种语言.
是否有任何通用或推荐的方法从sql异常中提取有意义的信息,以便能够向用户呈现有意义的消息(例如,什么关系或子表导致失败,或什么触发等).但我可以在程序中以独立于lang的方式测试,然后以用户友好的方式格式化我自己的错误消息?
你是如何处理这种情况的?
谢谢你的所有答案
(PS:很抱歉很长的帖子)
我有一个asp.net应用程序,它必须在SSL下运行,并且它在web.config中定义了一些重写规则来完成此任务.
<!--file web.config -->
....
</system.webServer>
<rewrite>
<rules configSource="webrewrite.config" />
</rewrite>
</system.webServer>
<!--file web.config -->
<rules>
....
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
....
</rules>
Run Code Online (Sandbox Code Playgroud)
但是,在开发模式(使用本地Web服务器或IIS Express)中,我不想使用SSL.所以我希望能够使用web.config转换来删除一个或多个重写规则(但不是全部)
我知道我可以使用以下查询来查找所有存储过程及其参数:
SELECT
r.*, p.*
FROM
INFORMATION_SCHEMA.ROUTINES AS r INNER JOIN
INFORMATION_SCHEMA.PARAMETERS AS p
ON r.SPECIFIC_SCHEMA = p.SPECIFIC_SCHEMA AND r.SPECIFIC_NAME = p.SPECIFIC_NAME
WHERE (r.ROUTINE_TYPE = N'PROCEDURE')
Run Code Online (Sandbox Code Playgroud)
从这里我可以看到(几乎)所有关于参数的信息,但我不知道如何找到哪些是可空的或具有默认值.
有没有办法找到这个?
谢谢
我有一个要在其中将条目写入事件日志的应用程序。记录器通过MEF实例化。我创建了一个派生类,以便能够在使用它之前执行日志初始化。
我的代码如下:
public class WinEventLog : EventLog, ILogger
{
private const string LOG_SourceName = "DataGen_Source";
private const string LOG_SysLogName = "Pool_Log";
private bool _isInitialized = false;
public WinEventLog()
: base()
{
Initialize();
}
public void LogMessage(MessageLevel level, string message)
{
WriteEntry(message, level.EventLogType());
}
public void LogMessage(string source, MessageLevel level, string message)
{
WriteEntry(source, message, level.EventLogType());
}
public void Initialize()
{
if (!_isInitialized)
{
this.BeginInit();
this.EndInit();
if (!System.Diagnostics.EventLog.SourceExists(LOG_SourceName))
{
System.Diagnostics.EventLog.CreateEventSource(
LOG_SourceName, LOG_SysLogName);
}
Source = LOG_SourceName;
Log = LOG_SysLogName;
_isInitialized = …Run Code Online (Sandbox Code Playgroud) 我有一个很大的ASP.NET应用程序(遗留),它实际上(功能上)由两个门户组成.所以我需要将它拆分为两个独立的应用程序,以简化每个应用程序的开发.
当然,两者之间有共同的特征.其中一些是在DAL和BL中,这不是问题 - 所有代码都是单独的单独项目,它们构成了在两个应用程序中引用的程序集.
但问题在于一些页面,许多用户控件,一些css和javascript文件,它们在两个"门户"(应用程序)之间共享.
我想就如何处理它们提出一些建议.我主要关心的是避免重复,所以理想情况下他们应该留在一个地方,并被两个应用程序使用.
首先,我尝试将文件从一个项目添加到另一个项目作为链接文件.虽然这适用于代码文件(它们内置到它们链接到的项目中),但它不适用于aspx/ascx或css/javascript/images.如果我首先发布(如果标记为内容,它们会在发布期间被复制),但我在开发期间无法一直执行此操作,并且在从源代码调试/运行应用程序时找不到此类文件(sincve,很明显,当一个人正在寻找其中的任何一个时,链接文件实际上在app文件树中不可用.
另一个想法是创建预构建事件,并在其中复制来自公共位置的所有共享文件.例如,我创建了一个项目Common,并将所有文件放在应用程序之间共享,组织在文件夹上,并在预构建时执行xcopy.
另一个想法是使所有共享文件成为我svn:external在两个项目中引用的SVN存储库的一部分.
但所有人看起来都很麻烦.有没有人有类似的情况?你是怎么处理的?
对我的任何建议有任何建议吗?
当我尝试从某个控制器的操作方法创建视图时(右键单击 - >添加视图 - >选择强类型视图)我收到以下错误:
c:\ Users(...)\ AppData\Local\Temp\b1b5zy30.0.cs(5,33):错误CS0234:编译转换:类型或命名空间名称'DataAnnotations'在命名空间'System中不存在. ComponentModel'(您是否缺少程序集引用?)
c:\ Users(...)\ AppData\Local\Temp\b1b5zy30.0.cs(6,23):错误CS0234:编译转换:命名空间'系统中不存在类型或命名空间名称'Linq'.数据'(您是否缺少程序集引用?)
有谁知道发生了什么事?这工作在几天前,同时我没有对MVC安装进行任何更改
谢谢
我写了一个新的应用程序,它将使用现有的主题,设计师将对其进行更改。
因此,我决定将主题保留在Theme文件夹(带有子目录-js,css,img)中,而不是将脚本放入“脚本”中以及“内容”中的其他所有内容(Css,图像)中
所以我尝试更改捆绑的脚本以指向主题/ js中的脚本,而不是脚本
我将其更改为
bundles.Add(
new ScriptBundle("~/Scripts/vendor")
.Include("~/Theme/js/jquery-{version}.js")
.Include("~/Theme/js/knockout-{version}.debug.js")
.Include("~/Theme/js/sammy-{version}.js")
.Include("~/Theme/js/toastr.js")
.Include("~/Theme/js/Q.js")
.Include("~/Theme/js/breeze.debug.js")
.Include("~/Theme/js/bootstrap.js")
.Include("~/Theme/js/moment.js")
);
Run Code Online (Sandbox Code Playgroud)
我不明白的是线
new ScriptBundle("~/Scripts/vendor")
Run Code Online (Sandbox Code Playgroud)
如果我将其保留为上述内容(即使没有Scripts / vendor文件夹,代码也可以正常工作,但是如果我将其更改为
new ScriptBundle("~/Theme/js/vendor")
Run Code Online (Sandbox Code Playgroud)
我在萤火虫中收到网络错误:
"NetworkError: 404 Not Found - http://localhost:51154/scripts/vendor"
Run Code Online (Sandbox Code Playgroud)
其余脚本未加载。
那条线是做什么的?
谢谢
我有一个运行SSRS 2014的SSRS实例,我希望将其配置为通过SSL使用.
该服务器位于http://reports.mydomain2.com
我从域名www.mydomain.com上购买了GoDaddy的多SSL证书,并将reports.mydomain2.com添加为SAN
我从GoDaddy生成SSL证书和IIS一样,将证书导入中间证书颁发机构和个人/证书

我启动了SSRS配置管理器,我正在尝试设置SSL我看到了证书,但是当我选择它并单击Apply我得到错误,SSL证书无法绑定
显示的错误是
Microsoft.ReportingServices.WmiProvider.WMIProviderException: An unknown error has occurred in the WMI Provider. Error Code 80070520
---> System.Runtime.InteropServices.COMException (0x80070520): A specified logon session does not exist. It may already have been terminated. (Exception from HRESULT: 0x80070520)
--- End of inner exception stack trace ---
at Microsoft.ReportingServices.WmiProvider.RSWmiAdmin.ThrowOnError(ManagementBaseObject mo)
at Microsoft.ReportingServices.WmiProvider.RSWmiAdmin.CreateSSLCertificateBinding(String application, String certificateHash, String ipAddress, Int32 port)
at ReportServicesConfigUI.WMIProvider.RSReportServerAdmin.CreateSSLCertificateBinding(UrlApplication app, String certificateHash, String ipAddress, Int32 port)
Run Code Online (Sandbox Code Playgroud)
我用命令检查了绑定
netsh http show urlacl
Run Code Online (Sandbox Code Playgroud)
我在443号港口找到了一个条目
Reserved URL : https://+:443/sra_{BA195980-CD49-458b-9E23-C84EE0ADCD75}/ …Run Code Online (Sandbox Code Playgroud) 我上课了
Class MyObject
{
decimal v1;
decimal dv1;
decimal v2;
decimal dv2;
}
Run Code Online (Sandbox Code Playgroud)
和a
List<MyObject> ...
Run Code Online (Sandbox Code Playgroud)
我需要通过将dv1添加到v1并将dv2添加到v2来处理列表的每个元素.(伪语法):
myList.Transform(o=>o.v1+=o.dv1, o.v2+=o.dv2)
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做(显然我的伪语法不起作用)?
谢谢
是否可以使用具有静态特性的MEF成分?
我通常做的是
MyClass obj = new MyClass();
MEFHelper.Compose(obj);
Run Code Online (Sandbox Code Playgroud)
和
public class MEFHelper
{
//....
public static void Compose(object o)
{
var batch = new CompositionBatch();
batch.AddPart(o);
_container.Compose(batch);
}
}
Run Code Online (Sandbox Code Playgroud)
但这仅适用于实例对象.有什么建议吗?
谢谢
我尝试使用带有敲除绑定和Knockout-Kendo.js库的kendo网格
它的定义如下:
<div data-bind="kendoGrid:
{
data: SearchResult,
rowTemplate: 'rowTmpl',
altRowTemplate: 'altTmpl',
useKOTemplates: true
}">
</div>
<script id="rowTmpl" type="text/html">
<tr class="tdText" role="row">
<td >
<a data-bind="attr: { href: 'scrccc_checkEdit.aspx?id=' + CheckID }" >
<img src="images/icon-edit.gif" border="0" alt="Edit/View Check" />
</a>
</td>
<td data-bind="text: CheckNumber"></td>
<td data-bind="text: new Date(CreateDate).MMddyyyy()"></td>
//...
<td data-bind="text: ParishName">
</tr>
</script>
<script id="altTmpl" type="text/html">
//....
Run Code Online (Sandbox Code Playgroud)
从REST服务加载的数据有更多的列,我希望在网格中显示该行看起来没问题,由于模板,但问题在于网格标题,为源中的每个字段创建列.

如何隐藏标题中的某些列,并自定义其标题标签(更改列宽,标题标签并最终允许其他自定义.
例如,在上图中我想要Co
我刚刚发现了淘汰赛(3.0和3.1)和复选框的问题
问题是,复选框的更改事件绑定不会在不同的浏览器中一致地发生.
请参阅下面的代码
<table >
<tr>
<td >
<input type="checkbox" data-bind='checked: CheckVal, event: { change: refresh }' />
</td>
<td>Check Value in checked binding: <span data-bind="text: CheckVal"></span>
</td>
</tr>
<tr>
<td></td>
<td>Check Value in changed event binding: <span data-bind="text: CheckValChanged"></span>
</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
和javascript
function MainViewModel() {
var self = this;
this.CheckVal = ko.observable(true);
this.CheckValChanged = ko.observable(true);
this.refresh = function() {
self.CheckValChanged(self.CheckVal());
}
}
viewModel = new MainViewModel();
ko.applyBindings(viewModel);
Run Code Online (Sandbox Code Playgroud)
在Firefox中,更改事件绑定发生在复选框值更改后,因此在更改事件处理程序中,我们可以读取复选框的实际值(即,如果选中复选框,则绑定字段的值为value = true).
在所有其他浏览器中(我使用Chrome,IE 11,Opera和Safari测试过),更改事件绑定似乎在实际更改绑定字段的值之前发生(即,选中复选框,在更改处理程序中读取的值)是false,如果未选中,则读取的值为true)
你可以在http://jsfiddle.net/bzamfir/su6SW/2/看到这个问题.
问题不仅在于浏览器中的行为不一致,而且对于大多数浏览器而言,这似乎是违反直觉的:事件是变化 …
c# ×3
knockout.js ×2
sql ×2
sql-server ×2
asp.net ×1
asp.net-mvc ×1
binding ×1
checked ×1
data-binding ×1
event-log ×1
javascript ×1
kendo-grid ×1
kendo-ui ×1
linked-list ×1
linq ×1
mef ×1
onchange ×1
split ×1
sqlexception ×1
ssl ×1
ssrs-2014 ×1
static ×1
sum ×1
svn ×1
t-sql ×1
transform ×1
web-config ×1