我很好奇SQL Server连接字符串中的令牌"Trusted_Connection"和"Integrated Security"之间有什么区别(我相信其他数据库/驱动程序不支持这些).我明白他们是等同的.
我已经获得了一个带有证书和发布/私钥的PEM文件.具体来说,它包括标题
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PUBLIC KEY-----
-----END RSA PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
按特定顺序.
我的理解是在标题之后没有BEGIN RSA PRIVATE KEY
标题,这个pem文件包含传统格式的私钥(PKCS1)而没有加密.
我需要将此私钥转换为DER编码的PKCS8未加密格式,以便与java服务器代码一起使用,特别是PKCS8EncodedKeySpec.我已经尝试过使用rsa和pkcs8命令的OpenSSL,但没有运气.如果有更容易的东西,没有特别需要使用openssl.
特别:
openssl rsa -in IServer_Key.orig.prikey.pem -out IServer_Key.pkcs8.pem
openssl rsa -in IServer_Key.orig.prikey.pem -out IServer_Key.pkcs8.pem -pubin openssl pkcs8 -in IServer_Key.orig.prikey.pem -out IServer_Key.pkcs8.pem -nocrypt
Run Code Online (Sandbox Code Playgroud)
我也试过指定通知和结果但没有成功.
user@ubuntu:~/TestCerts$ openssl rsa -in IServer_Key.pem -out IServer_Key.pkcs8.pem -pubin
unable to load Public Key
5925:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:
Expecting: PUBLIC KEY
user@ubuntu:~/TestCerts$ openssl rsa -in IServer_Key.orig.prikey.pem -out IServer_Key.pkcs8.pem
unable to …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用sp_rename系统sproc重命名SQL Server 2008中的存储过程.第三个参数虽然给我带来了困难,但我仍然收到以下错误:
Msg 15249, Level 11, State 1, Procedure sp_rename, Line 75
Error: Explicit @objtype 'P' is unrecognized.
Run Code Online (Sandbox Code Playgroud)
正如消息所示,我正在传递P参数的值.我这样称呼sproc:
EXEC sp_rename @objName = @procName, @newname = @WrappedName, @objtype = 'P';
Run Code Online (Sandbox Code Playgroud)
我仔细检查了文档,其中说这是来自sys.objects的值.我跑了以下来仔细检查我是不是疯了
select * from sys.objects where name = 'MySprocName'
Run Code Online (Sandbox Code Playgroud)
确实返回的类型是P.
有谁知道我应该通过什么?我不想把它留空,因为我正在创建一个通用的sproc来重命名任意的sprocs,如果sproc和其他东西之间有名称冲突,我不想担心这个.
首先,我要说我同意goto语句在很大程度上与现代编程语言中的更高级别结构无关,并且在适当的替代品可用时不应使用.
我最近重新阅读了Steve McConnell的Code Complete原版,并忘记了他对常见编码问题的建议.几年前,当我第一次开始时,我已经读过它,并且不认为我意识到配方会有多么有用.编码问题如下:执行循环时,您经常需要执行循环的一部分来初始化状态,然后使用其他逻辑执行循环,并使用相同的初始化逻辑结束每个循环.一个具体的例子是实现String.Join(delimiter,array)方法.
我想每个人第一个接受这个问题的都是这个.假设定义了append方法以将参数添加到返回值.
bool isFirst = true;
foreach (var element in array)
{
if (!isFirst)
{
append(delimiter);
}
else
{
isFirst = false;
}
append(element);
}
Run Code Online (Sandbox Code Playgroud)
注意:稍微优化一下就是删除else并将其放在循环的末尾.赋值通常是单个指令并等效于else,并将基本块的数量减少1并增加主要部分的基本块大小.结果是在每个循环中执行一个条件以确定是否应该添加分隔符.
我也看到并使用了其他处理这个常见循环问题的方法.您可以先在循环外执行初始元素代码,然后从第二个元素到结尾执行循环.您还可以将逻辑更改为始终附加元素然后添加分隔符,一旦完成循环,您只需删除添加的最后一个分隔符.
后一种解决方案往往是我更喜欢的解决方案,因为它不会复制任何代码.如果初始化序列的逻辑发生变化,您不必记得在两个地方修复它.然而,它需要额外的"工作"来做某事然后撤消它,至少导致额外的cpu周期,并且在很多情况下,例如我们的String.Join示例也需要额外的内存.
我兴奋地阅读这个结构
var enumerator = array.GetEnumerator();
if (enumerator.MoveNext())
{
goto start;
do {
append(delimiter);
start:
append(enumerator.Current);
} while (enumerator.MoveNext());
}
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,您没有重复的代码,也没有额外的工作.你开始循环进入第一个循环的执行的一半,那就是你的初始化.您只能使用do while构造模拟其他循环,但转换很容易并且阅读并不困难.
所以,现在问题.我很高兴尝试将其添加到我正在处理的一些代码中,发现它不起作用.在C,C++,Basic中工作得很好但是在C#中你不能跳转到不是父范围的不同词法范围内的标签.我很失望.所以我想知道,在C#中处理这个非常常见的编码问题(我主要在字符串生成中看到它)的最佳方法是什么?
或许更具体的要求:
我认为可读性是唯一可能因我说的配方而受到影响的事情.但它在C#中不起作用,那么下一个最好的东西是什么?
*编辑* 由于一些讨论,我改变了我的表现标准.性能通常不是限制因素,所以更正确的目标应该是不合理,不是最快的.
我不喜欢我建议的替代实现的原因是因为它们要么重复代码,这留下了改变一个部分而不是另一个部分的空间,或者对于我通常选择它的那个需要"撤消"操作,这需要额外的思考和时间来撤消事物你做的那件事.特别是对于字符串操作,这通常会让您因一个错误而打开,或者无法解释一个空数组并尝试撤消未发生的事情.
这显然是一个谷歌证明的术语,因为我不能让任何搜索引擎不丢弃"额外"字符.我也在C++参考中查看了MSDN,但我似乎无法找到C++/CLI参考,因为声明部分中没有任何内容.
刚刚第五次为SQLCLR编写了正则表达式替换和匹配函数以及tvf,我坐下来思考是否有一组SQLCLR的常见社区扩展,用于数据库中最常见但从未提供的内容.
例如,Powershell拥有一套出色的社区扩展,涵盖了包装盒中未包含的众多附加功能.没有它我不会使用Powershell.
我想也许SQLCLR有类似的东西.我正在寻找像这样的东西:
有没有人知道一个具有这种常见常规功能的库,我们都会反复写一遍?
我想解析一个持久化对象图状态的自定义字符串格式.这是ASP.NET场景,我想在客户端(JavaScript)和服务器(C#)上使用易于使用的东西.
我有一个类似的格式
{Name1|Value1|Value2|...|ValueN}{Name2|Value1|...}{...}{NameN|...}
Run Code Online (Sandbox Code Playgroud)
在这种格式我有3个分隔符{
,}
和|
.此外,因为在名称/值中可以想到这些字符,所以我使用非常常见的方式定义了一个转义序列\
,这样\{
,\}
并且\|
都被解释为它们自身的正常版本,当然\\
也是反斜杠.一切都很标准.
最初我试图使用正则表达式来尝试用这样的东西解析出对象的字符串表示(?<!\\)\{(.*?)(?<!\\)\}
.请记住\
,{
并且}
都在正则表达式中保留.这当然能够解析出{category|foo\}|bar\{}
正确的东西.但是我意识到它会失败{category|foo|bar\\}
.
我只花了一分钟时间尝试这个,(?<!(?<!\\)\\)\{(.*?)(?<!(?<!\\)\\)\}
并意识到这种方法是不可能的,因为你需要无数个负面的后观来处理潜在的无限数量的转义序列.当然,我不可能有超过一个或两个级别,所以我可能会硬编码.但是,我觉得这是一个很常见的问题,应该有一个定义明确的解决方案.
我的下一个方法是尝试编写一个定义的解析器,其中我实际上扫描了输入缓冲区并在前向方法中使用了每个字符.我还没有真正完成这个,但它似乎过于复杂,我觉得我必须遗漏一些明显的东西.我的意思是只要我们有计算机语言,我们就有解析器.
所以我的问题是,使用可能的转义序列解码这样的输入缓冲区的最简单,有效和优雅的方法是什么?
我在Silverlight 3中使用ADO.Net数据服务(Astoria),我希望在初始加载之后延迟加载实体的属性.但是,当我准备加载它们时,我想将加载请求一起批处理.
// this is what I want to avoid
var c = (from c in ctx.Customers.Expand("Address,Phone,Email")
where c.Id = 12
select c).Take(1) as DataServiceQuery<Customer>;
Run Code Online (Sandbox Code Playgroud)
我到目前为止:
// I can do this instead
var c = (from c in ctx.Customers // .Expand("Address,Phone,Email")
where c.Id = 12
select c).Take(1) as DataServiceQuery<Customer>;
c.BeginExecute(CustomerCallback, objState);
...
// Later, when I want properties, I need to do this
ctx.BeginLoadProperty(c, "Address", AddressCallback, objState);
ctx.BeginLoadProperty(c, "Phone", PhoneCallback, objState);
ctx.BeginLoadProperty(c, "Email", EmailCallback, objState);
Run Code Online (Sandbox Code Playgroud)
但是,我无法想象如何获取DataServiceRequest对象以将load属性请求传递给BeginExecuteBatch.是否可以通过获取DataServiceQuery在同一批次中发出这些请求(以及可能与客户属性加载无关的其他请求)?
像这样的东西:
// c is …
Run Code Online (Sandbox Code Playgroud) 我最近遇到了两个重载问题,我找不到答案,也没有java环境来运行一些测试代码.我希望有人可以通过汇编一份java编译器遵循的所有规则列表来帮助我进行重载,或者交替指向我已经存在的列表.
首先,当两个方法只有最终的varargs参数不同时,在什么情况下每个方法都被调用,你可以在没有任何args的情况下调用varargs方法吗?
private void f(int a) { /* ... */ }
private void f(int a, int... b) { /* ... */ }
f(12); // calls the former? I would expect it to
f(12, (int[])null); // calls latter, but passes null for b?
// Can I force the compiler to call the second method in the same fashion
// as would happen if the first method didn't exist?
Run Code Online (Sandbox Code Playgroud)
第二个问题,当两个方法因为彼此继承而被调用的类型不同时?我希望调用最多的派生版本,并允许调用另一个版本.
interface A {}
class B implements A {}
class C implements A …
Run Code Online (Sandbox Code Playgroud) 昨天我正和一位同事谈论这件事,这让我想到了.Net的传递参考.
// C#
class Foo {}
static void Test(ref Foo foo) { ... };
static void Main()
{
Foo f;
Test(ref foo);
}
Run Code Online (Sandbox Code Playgroud)
必须使用双重间接实现,因为我们正在更改指针的值.因为所有引用类型都是引用(指针)
// C#
static void Test(Foo foo) { ... }
static void Test(ref Foo foo) { ... };
Run Code Online (Sandbox Code Playgroud)
相当于像
// C++
void Test(Foo *foo);
void Test(Foo **foo);
Run Code Online (Sandbox Code Playgroud)
但如果这是一个VALUE类型,我们实际上并不需要双重间接.所以我很好奇
// C#
static void Test(ref int bar) { ... }
Run Code Online (Sandbox Code Playgroud)
变
// C++
void Test(int *bar);
// or
void Test(int **bar);
Run Code Online (Sandbox Code Playgroud)
1/29/10更新:阅读所有答案后,我意识到我对自己想要的内容并不十分清楚,而且我误导了将C++投入到正在发生的事情中.我最感兴趣的是它是如何在CLR中实现的,以及JIT将如何为它生成程序集.感谢所有的答案,我从一个角度发现它们都是正确的,但我选择了一个最接近我认为我问过的问题的答案.
我道歉,因为这必须是其他人提出的问题,但似乎谷歌证明.我正在试图弄清楚调用了什么shell,因为我遇到了一个不一致的问题.如果我sudo
,我的脚本不起作用,但是如果我的话,它确实有用sudo bash
.然而,当我sudo echo $0
,它说bash.
cpu=$(cat /proc/cpuinfo | grep Revision | cut -d' ' -f 2-);
if [[ "a22082" = $cpu || "a02082" = $cpu ]]; then
echo 'do stuff';
fi
Run Code Online (Sandbox Code Playgroud)
如果我用#!/ bin/sh指定命令解释器,它仍然会失败,但更具体的是#!/ bin/bash.
我(现在)知道这[[
是特定的bash但是尽管响应它似乎并不像sudo的默认shell是bash.
我的bat文件:
myprogram.exe >> c:\temp\log.txt
Run Code Online (Sandbox Code Playgroud)
我的程序得到一个空引用错误,但不知道为什么消息没有记录在日志文件中.当我在命令窗口中手动运行时,我看到错误.
c# ×3
.net ×2
sql-server ×2
bash ×1
batch-file ×1
c++-cli ×1
certificate ×1
do-while ×1
escaping ×1
goto ×1
java ×1
linux ×1
openssl ×1
overloading ×1
parsing ×1
regex ×1
shell ×1
sql ×1
sqlclr ×1
sudo ×1