生成和访问固定列布局的数据很容易.您可以预先创建本地临时表,并通过调用存储过程来填充它们.
另一方面,如果要生成具有动态列布局的数据,则通常必须动态构建SQL语句并使用"exec sp_executesql"执行它.由于数据布局在运行时是未知的,因此您无法在前面创建临时表,并且一旦在"exec sp_executesql"语句中,在那里创建的任何临时表都绑定到该范围并在调用返回时消失,因此访问数据要困难得多(即您的选择更加有限).
我有一个查询需要访问动态生成的表中的数据.
由一个存储过程,其动态地构建的查询生成的表,它在一个变量"@sql为nvarchar(最大)"存储,并通过调用"EXEC sp_executesql的@statement = @sql"运行它.
@sql语句类似于"select*into #temptable from ...",但#temptable在"exec sp_executesql"返回时被销毁.对此的快速解决方法是仅使用"## temptable"(即全局临时表),因为它在存储过程返回时仍然存在并且我可以在调用范围中轻松访问它(因为它具有已知/静态名称) ).
我不喜欢这个解决方案,因为全局临时表不是线程安全的(名称冲突),我不想乱用动态生成的唯一名称,因为我最终不得不使用更多动态SQL来访问它们......这使我回到正方形,使数据在SP外部无法访问.
我不认为返回表变量(通过输出参数)是一个选项(对SQL Server 2008也是新的),除非可以在不必定义静态表类型的情况下完成.我的存储过程生成的表是动态的,并且取决于传递的输入参数.
内联表值函数是不是一种选择,因为我运行的代码循环来构建@sql查询和调用"EXEC sp_executesql的".
多语句表值函数(而不是存储过程)也不是一个选项,因为这样的函数必须有一个明确定义的表格式,而我正在运行dyanmic SQL来返回一个变量数量为列和列名称取决于输入参数值.
我真正想做的就是将动态查询的结果集选择到一个新表中,但我发现它很难,因为以上都没有; 特别令人恼火的是本地临时表不是会话本地的,而是存储过程的本地临时表,以便它们在返回时消失.我见过的唯一解决方案坚持认为使用OPENROWSET是唯一的方法,但我不想弄乱我的存储过程中的连接字符串,出于同样的原因我不想包含唯一名称管理代码. ..它应该比它应该的更复杂.
总之,我只想执行生成未知格式数据集的动态SQL,并能够从调用范围轻松访问它.
SQL Server中存储的扩展属性在哪里?
它们是否存储在包含添加到的对象的数据库中,或者是单独存储并以某种方式绑定到本地计算机.
例如,如果我添加填充SSMS中的"描述"字段(MS_Description扩展属性)来记录表的列,然后我关闭数据库引擎并将MDF/LOG文件复制出来以将其附加到另一台机器上,扩展属性与复制的文件一起使用,还是会留在本地计算机上的master数据库(或类似的东西)中?
我创建了一个名为SearchBox的类来处理搜索交互(延迟触发,搜索输入键按下,防止搜索活动时,搜索完成时同步结果,文本更改等).
所有类方法都是原型方法,意味着可以通过访问this.在下面的代码中,假设p是类的原型.
p.registerListeners = function () {
$(this.element).on('keypress', this.searchKeyPressed);
};
p.unregisterListeners = function () {
$(this.element).off('keypress', this.searchKeyPressed);
};
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为当keypress事件调用searchKeyPressed处理程序时,它不会在上下文中这样做this.我能想到的唯一解决方案是只有现代浏览器支持的解决方案,即绑定回调this,实际创建一个新函数.由于它创建了一个新函数,我必须将其缓存以便以后删除它,因为我必须将相同的引用off传递给我传递给它的函数on.
有没有比这更好的方法,或者这样可以吗?
var boundKeyPressed;
p.registerListeners = function () {
boundKeyPressed = this.searchKeyPressed.bind(this);
$(this.element).on('keypress', boundKeyPressed);
};
p.unregisterListeners = function () {
$(this.element).off('keypress', boundKeyPressed);
};
Run Code Online (Sandbox Code Playgroud)
我认为这可能jQuery.on会提供一种自动执行此事件绑定的方法,但它似乎会this根据它的调用方式绑定到不同的事物.例如,在使用时on('eventname',instance.func),this是"currentTarget"(在冒泡术语中不一定是"目标"),而在使用时on('eventname','selector',instance.func),this是指与选择器匹配的元素.在任何一种情况下,func运行就好像它没有关系instance.
JSON.NET通过使用以下设置保留所有引用来支持循环引用序列化:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
settings.PreserveReferencesHandling = PreserveReferencesHandling.All;
Run Code Online (Sandbox Code Playgroud)
这允许以下代码无错误地运行,正确地序列化和反序列化对象及其自引用完整.
public class SelfReferencingClass
{
public string Name;
public SelfReferencingClass Self;
public SelfReferencingClass() {Name="Default"; Self=this;}
}
SelfReferencingClass s = new SelfReferencingClass();
string jsondata = JsonConvert.SerializeObject( d, settings );
s = JsonConvert.DeserializeObject<SelfReferencingClass>( jsondata, settings );
Run Code Online (Sandbox Code Playgroud)
jsondata字符串如下所示:
{"$id":"1","Name":"Default","Self":{"$ref":"1"}}
Run Code Online (Sandbox Code Playgroud)
问题是......如果没有可以解释这些引用的相应客户端JavaScript库,JSON.NET的这个特性是如何有用的,并且还支持编码这样的引用本身?
什么客户端库(例如JSON.stringify)使用"$ id"和"$ ref"字段支持此功能/编码?如果不存在,是否有一种已知的方法来添加对现有库的支持?
自己添加支持将是一个非常简单的双通过程.首先,反序列化整个字符串,并在创建每个对象时使用其"$ id"值作为键将其添加到字典中.当您遇到引用(仅包含"$ ref"属性的对象)时,您可以将其添加到object + fieldname列表中,您可以通过在已创建对象的最终字典中查找其键来返回以替换每个遇到的引用.
serialization json jsonserializer json.net circular-reference
如何可以解析C#风格格式的泛型类型名称List<int>或者Dictionary<string,int>甚至更复杂Dictionary<string,Dictionary<System.String,int[]>>.假设这些名称是字符串,实际上可能不代表现有类型.它应该很容易解析BogusClass<A,B,Vector<C>>.为了清楚起见,我对解析格式的.NET内部类型名称并不感兴趣List`1[[System.Int32]],而是对源代码中出现的实际C#类型名称感兴趣,使用点表示法有或没有名称空间限定符.
正则表达式是因为这些是嵌套结构.我想也许System.CodeDom.CodeTypeReference构造函数会为我解析它,因为它有string BaseType和CodeTypeReferenceCollection TypeArguments成员,但那些显然需要手动设置.
CodeTypeReference是我需要的一种结构:
class TypeNameStructure
{
public string Name;
public TypeNameStructure[] GenericTypeArguments;
public bool IsGenericType{get;}
public bool IsArray{get;} //would be nice to detect this as well
public TypeNameStructure( string friendlyCSharpName )
{
//Parse friendlyCSharpName into name and generic type arguments recursively
}
}
Run Code Online (Sandbox Code Playgroud)
框架中是否有任何现有的类来实现这种类型名称解析?如果没有,我将如何解析这个?
属性值需要进行编码。如果我像这样构建一个 jQuery 对象:
$('<div data-value="' + value + '">');
实际上,value必须像这样进行属性编码:
$('<div data-value="' + HtmlAttributeEncode(value) + '">');
我找不到这样的原生函数。有些人认为这只是将双引号替换为 的问题",但微软的HttpEncoder.HtmlAttributeEncode方法对这四个字符进行了编码& < " '。我似乎有这样的实现quoteattr: https: //stackoverflow.com/a/9756789/88409,但这效率非常低,调用替换来多次迭代字符串。同样,我需要一个本机函数来编码 JavaScript 字符串(例如$('<div onclick="var s =\'' + HtmlAttributeEncode(JavaScriptStringEncode(value)) + '\';alert(s);"></div>).appendTo(body);<< 仅用于说明目的的示例)
是否有此功能的本机等效项?
注意:请不要提及escape(现已弃用,取而代之的是encodeURI和encodeURIComponent)所有这些都与属性编码无关。
事件可以具有多个订阅者(即,在引发事件时可以调用多个处理程序).由于任何一个处理程序都可能抛出错误,并且这会阻止其余部分被调用,我想忽略从每个处理程序抛出的任何错误.换句话说,我不希望一个处理程序中的错误破坏调用列表中其他处理程序的执行,因为这些其他处理程序和事件发布者都无法控制任何特定事件处理程序代码的作用.
这可以通过以下代码轻松完成:
public event EventHandler MyEvent;
public void RaiseEventSafely( object sender, EventArgs e )
{
foreach(EventHandlerType handler in MyEvent.GetInvocationList())
try {handler( sender, e );}catch{}
}
Run Code Online (Sandbox Code Playgroud)
当然,我不想在每次调用事件时反复编写所有这些通用代码,所以我想将它封装在泛型类中.此外,我实际上需要额外的代码来确保线程安全,以便在执行方法列表时MyEvent的调用列表不会更改.
我决定将其作为泛型类实现,其中泛型类型受"where"子句约束为Delegate.我真的希望约束是"委托"或"事件",但那些是无效的,所以使用Delegate作为基类约束是我能做的最好的.然后我创建一个锁对象并将其锁定在公共事件的添加和删除方法中,这些方法会更改名为"event_handlers"的私有委托变量.
public class SafeEventHandler<EventType> where EventType:Delegate
{
private object collection_lock = new object();
private EventType event_handlers;
public SafeEventHandler(){}
public event EventType Handlers
{
add {lock(collection_lock){event_handlers += value;}}
remove {lock(collection_lock){event_handlers -= value;}}
}
public void RaiseEventSafely( EventType event_delegate, object[] args )
{
lock (collection_lock)
foreach (Delegate handler in event_delegate.GetInvocationList())
try {handler.DynamicInvoke( args );}catch{} …Run Code Online (Sandbox Code Playgroud) 我用一个字段创建了一个简单的类. class Test{int value;}
如果我使用"保留引用"功能并将其设置为"all"(即对象和数组),那么当我简单地序列化一个Test对象数组时,它会被序列化为一个带有特殊"$ values"成员的JSON对象使用数组值以及预期的"$ id"属性来保留数组引用.这很好,但是整个事情再一次打破了反序列化.
单步执行源代码,我发现只是因为" IsReadOnlyOrFixedSize" 的测试是真的,它将标志" createdFromNonDefaultConstructor"设置为true,这甚至没有任何意义,因为虽然它是一个固定大小的数组,但它是从默认构造函数,除非它将任何固定大小的数组构造函数视为非默认构造函数.最重要的是,它应该能够处理如此基本的东西,但却抛出了这个错误:" Cannot preserve reference to array or readonly list, or list created from a non-default constructor".
如何在保留JSON.NET中的所有引用的同时反序列化基本数组而不会出现错误?
在cshtml文件中,我将一个字符串分配给一个属性.例如:
<input name="somename" value="@Model.Value">
Run Code Online (Sandbox Code Playgroud)
由于@ Model.Value字符串可以包含任何Unicode字符,因此显然必须对字符串进行编码.Razor会自动编码这个值吗?我猜它不会或不会因为我可以很容易地在它之后放一个@ Html.Raw将整个事情分解成两个标签.
我想我需要做的是:
<input name="somename" value="@Html.Raw(Html.AttributeEncode(Model.Value))">
Run Code Online (Sandbox Code Playgroud)
那是对的吗?
同样,如果我在脚本中的JavaScript字符串中嵌入字符串值,我应该使用:
//I could use Ajax instead of HttpUtility here, but Ajax just wraps the same call.
<script>$('id').data('key','@Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Value))');</script>
Run Code Online (Sandbox Code Playgroud) 我从 .NET 4.6.1 升级到 4.7.2 的旧项目包含对 的引用,Microsoft.Bcl.Build另一个有Microsoft.Net.Compilers. Microsoft.Bcl.Build已经过时了(2014),所以我们可以忽略它。
我读到它Microsoft.Net.Compilers已被弃用了一段时间,并且曾经是Microsoft.CodeDom.Providers.DotNetCompilerPlatform. 然后Microsoft.CodeDom.Providers.DotNetCompilerPlatform在 2.x 中更新为不再具有Microsoft.Net.Compilers依赖项。
现在,事情似乎又反转了,因为Microsoft.CodeDom.Providers.DotNetCompilerPlatform自 2018 年以来就没有更新过,而Microsoft.Net.Compilers22 天前才更新并支持 C# 8!该Microsoft.Net.Compilers页面(https://github.com/dotnet/roslyn/blob/master/docs/wiki/NuGet-packages.md)Microsoft.CodeDom.Providers.DotNetCompilerPlatform在底部提到了该包,但并没有真正解释它们的关系或为什么它没有多年来一直在更新。奇怪的是,另一个将这个作为依赖项,然后将其删除,现在不再维护。
其他建议是,System.Net.Compilers已弃用,请使用System.Net.Compilers.ToolSet,还有其他建议是“两者都不要使用”,两者都不适合一般使用,并且在 VS 16.5 之后将不可用:https: //stackoverflow.com/a/60623906/ 88409。
这些包似乎都覆盖了构建系统,那么它们是相互排斥的吗?当两者都安装时,我确实遇到了错误(如下所述),但这不一定是由于相互排他性引起的。
附加信息
当以 .NET 4.7.2 为目标时,没有安装这两个包,我在 MVC cshtml 页面上收到一条错误消息:
类型“System.Object”是在未引用的程序集中定义的。您必须添加对程序集“netstandard,Version=2.0.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”的引用。家”。
尽管发布成功,但安装System.Net.Compilers并不能解决问题。同时,Microsoft.CodeDom.Providers.DotNetCompilerPlatform自行安装确实可以修复该错误。后者所做的一件事有所不同,它在 system.codedom/compilers/compiler 的 web 配置中添加了 language="c#" 的部分。
即使两者单独安装都很好,但如果我安装了这两个包,发布操作就会失败,并显示错误“Microsoft.Net.Compilers 仅在 MSBuild v16.3 上受支持”,因此看起来几乎像是在Microsoft.CodeDom.Providers.DotNetCompilerPlatform强制使用(或者是基于?)早期版本的 …
c# ×2
json.net ×2
.net ×1
arrays ×1
attributes ×1
delegates ×1
dynamic-data ×1
encoding ×1
events ×1
html ×1
html-encode ×1
javascript ×1
jquery ×1
json ×1
location ×1
parsing ×1
roslyn ×1
scope ×1
storage ×1
t-sql ×1
temp-tables ×1
typename ×1