对吧......这个让我困惑了一会儿,所以也许你们其中一个SQL Server明亮的火花可以揭示这种行为.
我们有一张桌子Phones
.在其中,电话号码存储为nvarchars,它包含国际格式的数字,仅以数字格式...所以美国号码+1-(212)-999-9999
存储为12129999999
由于超出原因,我有人编写了一个SPROC,将电话号码作为bigint,没有投射,做了一个简单的where子句=比较,并且这非常好,直到一些垃圾数据进入nvarchar列导致它破裂的桌子.请考虑以下测试脚本.
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Phones')
BEGIN
DROP TABLE Phones
END
GO
CREATE TABLE [dbo].[Phones]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Mobile] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Phones] PRIMARY KEY CLUSTERED
( [ID] ASC )
WITH (
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]
) ON [PRIMARY]
GO
DECLARE @biMobile_1 bigint
DECLARE @biMobile_2 bigint
SET @biMobile_1 = …
Run Code Online (Sandbox Code Playgroud) 我不确定以下是否可行,但我想以一种受限制的方式在Paralell中调用一些Actions,但是要保持处理流程的连续性,而不是恢复使用定时器或循环/睡眠周期.
到目前为止,我已经开始工作了它从一些来源加载大量输入......然后以受控方式并行处理它们并像下面一样循环.
static void Main(string[] args)
{
while(true) //Simulate a Timer Elapsing...
{
IEnumerable<int> inputs = new List<int>() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//Simulate querying database queue tables for next batch of entries
RunAllActions(inputs, 3); //Max 3 at a time.
}
}
static void RunAllActions(IEnumerable<int> inputs, int maxConcurrency)
{
var options = new ParallelOptions() {MaxDegreeOfParallelism = maxConcurrency};
Parallel.ForEach<int>(inputs, options, DoWork);
//Blocks here until all inputs are processed.
Console.WriteLine("Batch of Work Done!!!");
}
static void DoWork(int …
Run Code Online (Sandbox Code Playgroud) 最近在使用C#和ActiveMQ(通过Apache.NMS库)进行一些工作时,我遇到了以下属性 ActiveMQBytesMessage
public new byte[] Content
{
get
{
byte[] buffer = (byte[]) null;
this.InitializeReading();
if (this.length != 0)
{
buffer = new byte[this.length];
this.dataIn.Read(buffer, 0, buffer.Length);
}
return buffer;
}
..(setter omitted)
}
Run Code Online (Sandbox Code Playgroud)
该InitialiseReading
方法处理从活动MQ到.dataIn
字段的数据的连接和流传输.但问题在于它每天都有这个问题.一旦读取了数据,就无法再次读取数据并且dataIn字段为零并重置.因此,只需观察属性并再次观察它,就会丢失数据.这使得一些非常奇怪的错误,例如:
byte [] myBytes = new byte[msg.Content.Length];
//Touched the property. Data read in.
msg.Content.CopyTo(myBytes,0);
//Uh oh! touched it again, copying a zero'd array.
Run Code Online (Sandbox Code Playgroud)
或者在您进行调试时,您在该属性上粘贴了一个监视变量,或者意外地将鼠标悬停在该属性上.
这种机制是使用流数据属性的公认或流行方式吗?
我们将所有数据库对象检入源代码控制作为可重新运行的脚本(视图,函数,触发器和存储过程等...)
在部署时,我们需要确保所有脚本都可以重新运行和重复,以便创建/更新存储过程到最新版本.
以下列方式创建脚本是否有任何缺点.
IF NOT EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'dbo'
AND ROUTINE_NAME = 'MyStoredProcedure'
)
BEGIN
EXEC ('CREATE PROCEDURE [dbo].[MyStoredProcedure] AS SELECT 1')
-- ALSO DO ANY INITIAL GRANT PRIVILEGE SCRIPTING HERE
END
GO
ALTER PROCEDURE [dbo].[MyStoredProcedure] (
@param1 INT,
@param2 NVARCHAR(50) = 'Default String'
)
AS
BEGIN
-- DO SOMETHING WITH @param1 AND @param2
SELECT 1;
END
GO
Run Code Online (Sandbox Code Playgroud)
本质上,脚本检查对象是否存在于相关系统视图中,如果它不存在,则某些动态sql将其创建为存根,以解决CREATE PROCEDURE/GO
条件块中不允许的语句问题.然后它通过一个应用脚本的实际功能ALTER
.
所以这些好处对我来说是显而易见的,我只是想知道这样做是否有任何缺点......除了编写稍微冗长的脚本的轻微开销.
我们有一个由SQL Server数据库支持的Web应用程序.
到目前为止,我们一直在使用SQL成员资格提供程序进行应用程序级别登录.对SQL Server的后端调用在Web.config的连接字符串中使用单个SQL帐户
我们客户的新合规性要求规定,所有应用程序用户必须在后台拥有自己的专用SQL帐户.
我已经将它原型化了,并且有一个工作版本.应用程序中的数据库连接上下文是为每个会话的当前用户配置的,在后台有SQLMembership帐户 - > DatabaseUser - > Sql Server Login之间的映射.密码可以计算为SQLMembership User Guid的SHA1哈希值.
这一切都运行正常,但我想知道由于拥有1000个服务器登录,数据库用户(+所有GRANT权限),数据库是否有任何性能考虑因素.
我们有一个现有的Web应用程序,它是基于MVC和SQL成员资格提供程序构建的,用于用户身份验证.该应用程序还包括管理员管理屏幕,用于创建/编辑用户,重置密码,激活帐户等...这是一个相当成熟的系统,已经生产了大约2.5年.
我们现在有了通过API从系统中公开一些数据的新要求,我们将WebApi视为候选技术.
我遇到的一个问题是身份验证.我想利用我们应用程序中现有的用户/角色管理功能来创建和管理API帐户.但是,由于WebAPI的首选选项是使用ASP.NET身份(声明/承载令牌等...),我对最佳选择将会有些困惑.
在现有的会员提供商用户/密码认证中以某种方式将角斗机用于web api auth mechs是可能的还是坏的.有一种方法ApplicationOAuthProvider
,看起来我可以通过IdentityUser user = await userManager.FindAsync(context.UserName, context.Password);
调用MembershipProvider 替换该行来操作.尽管如此,这似乎非常有说服力.
思想和选项将不胜感激.
c# asp.net asp.net-membership asp.net-web-api asp.net-identity
我们有一个现有的 API,它有一个使用 Redis 的非常简单的缓存命中/缓存未命中系统。支持Key搜索。因此,可以根据主键轻松缓存转换为以下内容的查询。
SELECT * FROM [Entities] WHERE PrimaryKeyCol = @p1
任何后续请求都可以通过其主键在 REDIS 中查找实体或故障回复到数据库,然后使用该结果填充缓存。
我们正在构建一个新的 API,它将允许通过更多参数进行搜索,将在结果中返回多个条目,并且将处于相当高的请求量下(足以影响我们在 SQL 中现有的 DTU 利用率天蓝色)。
查询将可以通过其他几个术语、一次搜索中的多个 PK、各种其他 FK 查找列、文本上的 LIKE/CONTAINS 语句等进行搜索...
在这种情况下,是否有任何我们可以考虑的设计模式或缓存策略。Redis 似乎不太适合这些类型的查询。我正在考虑简单地散列查询参数,然后将该散列作为键缓存,并将整个结果集作为值缓存。
但考虑到 Redis 的键值特性,以及一个实体可能包含在多个查询哈希下的多个结果集中这一事实,这感觉有点天真。
(作为参考,此数据的来源目前是 SQL Azure,我们使用的是 Azure 的托管 Redis 服务。我们也在寻找其他方法来访问数据库,包括对数据进行非规范化、将数据 ETL 到 CosmosDB、托管数据在 Azure 搜索中,但这样做还有其他含义,包括实施时间、数据的“新鲜度”等......)
architecture caching design-patterns redis azure-sql-database
今天就将此作为一些EF / DB代码的一部分,以为我以前从未见过感到羞耻。
在.NET中,您可以在类型之间显式转换。例如
int x = 5;
long y = (long)x;
Run Code Online (Sandbox Code Playgroud)
您可以对对象进行装箱并取消装箱回到该原始类型
int x = 5;
object y = x;
int z = (int)y;
Run Code Online (Sandbox Code Playgroud)
但是您不能直接将其拆箱为可以显式转换为的类型
int x = 5;
object y = x;
long z = (long)y;
Run Code Online (Sandbox Code Playgroud)
尽管我直到今天才真正碰到它,但实际上已记录了这种行为。https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/boxing-and-unboxing#example-1
为了使值类型的拆箱在运行时成功,要拆箱的项目必须是对以前通过对该值类型的实例进行装箱而创建的对象的引用。尝试对null取消装箱会导致NullReferenceException。尝试取消对不兼容的值类型的引用的装箱会导致InvalidCastException。
我很好奇是否有某些技术原因导致运行时无法/不支持此操作?
我们有一个小的c#工具,我们将它们拼凑在一起来解析数据文件,构建一些对象并将它们插入到数据库中.
逻辑本质上是.
string [] lines = File.ReadAllLines("C:\\Temp\\Data.dat")
foreach(string line in lines)
{
MyDataObject obj = ParseObject(line);
myDataContext.MyDataObjects.InsertOnSubmit(obj);
}
myDataContext.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
这在一开始就很好,因为数据文件每天只有大约1000行,但是最近这个文件已经增长到大约30,000行,并且这个过程变得非常缓慢.
SubmitChanges()
调用的所有内容都很好,但是一旦开始向数据库转储30,000个插入的过程,它就会停止运行.作为一项测试,我发了30,000个插入语句并直接从QA运行.花了大约8分钟.
8分钟后,C#/ Linq版本仅完成了大约25%的插入.
有人建议我如何优化这个吗?
编辑
感谢所有投入的人.意见非常受欢迎,我认为我们将在这一点上采用L2S实现,只是以这样的方式汇总/封装我们的DAL,如果我们将来需要更改为EF,它将不会太无痛一个手术.
因为这是非常主观的,所以积分最多的是海报.
弊
我一直在努力跟上整个Entity Framework Vs的速度.Linq2SQL的主题和SO上已经有一些问题了
我想知道的是(欢迎观点)如果你开始一个新的重大项目,你会使用Linq2SQL作为你的数据访问层吗?
为了给出一些上下文,我们是.NET C#House,DB是SQL Server 2000,但我们可能会在今年晚些时候将其移植到SQL 2005.在我们的小型开发团队中,我是唯一一个拥有C#3.0/.NET 3.5经验的人.团队中的其他人在过去3年中一直使用手工剪切的ADO.NET和SqlHelper代码进入数据访问层.
我想,我的主要担心是我们将开始使用更高级/可用/更快速开发的新项目(即L2S),但最终它已经过时了.
我们应该接受命中,延迟项目并调查使用VS2008中的实体框架.
为任何输入球员干杯.
c# ×5
sql ×4
sql-server ×4
.net ×3
linq-to-sql ×2
.net-3.5 ×1
architecture ×1
asp.net ×1
c#-4.0 ×1
caching ×1
casting ×1
properties ×1
queue ×1
redis ×1
t-sql ×1
types ×1