Tag: sql server

C#在单独的线程中连接到数据库

我有一个位于任务栏中的应用程序,并定期检查数据库(通过SQLConnection)。 如果数据库无法访问,它只会在通知图标上显示红色状态,而不显示任何其他内容。 这是因为用户将使用在设施之间旅行的笔记本电脑,并且数据库只能在内部网络上或通过VPN连接时访问。 我遇到的问题是,当数据库无法访问时,我仍然希望通知图标上下文菜单能够响应。 目前,如果用户在数据库尝试连接时尝试与菜单进行交互,则线程会被连接尝试锁定。 我想要的是数据库连接发生在一个单独的线程中,但我知道在线程之间共享连接对象是一件坏事。 数据库连接后,我需要从原始线程查询它。 有没有好办法呢? 我知道我可以在新线程中使用rus函数并简单地检查连接是否失败,然后如果返回成功,原始线程可以继续并连接它自己的数据库对象。 但这种方法似乎是一个糟糕的解决方法。 想法? 谢谢! 感谢您的建议 – 我从他们那里学到了很多东西。 最后,我做了我应该从一开始就做的事情。 每当需要定期更新数据库时,主(UI)线程就会启动一个新线程(包括数据库对象创建和连接)。 因此,就像HenkHolterman在对我的原始消息的评论中所建议的那样,我真的不需要创建数据库并在单独的线程中使用它运行操作。 一旦我升级到VS2010,我一定会对使用SqlConnection.OpenAsync感兴趣。 再次感谢。

如何使用C#在SQL Server数据库中存储哈希?

我正在尝试建立一个具有登录/注销function的网站,并且我计划正确散列和保存密码。 然而,我面临的问题是如何将密码存储在数据库中。 我知道我需要将散列+盐渍密码存储在数据库中(不是以纯文本或纯文本加密),但我不知道如何在技术上将二进制数据插入到数据库中。 在我早期的尝试中,我可以在数据库中获取数据的唯一方法是将二进制数据转换为base64字符串并插入varchar密码字段,但有些事情告诉我这不是正确的方法。 数据库中的密码字段当前是varchar但据我所知,散列密码是二进制的。 所以,即使我将密码字段更改为二进制对象,我仍然不知道如何实际插入它! 如果我没有任何意义,请要求澄清,我会回复你。

在Linq to SQL中处理DataContext后无法访问相关数据

重申了我的问题,旧文本如下 由于我仍然希望得到答案,我想重申我的问题。 Image我有一个带有两个列表的GUI,一个列表显示数据库tblOrders的所有条目列表,另一个列表显示每个订单中的项目。 我可以使用Linq2sql或EF从数据库中获取所有订单,如下所示: using (DataClasses1DataContext DataContext = new DataClasses1DataContext()) ListOfOrders = DataContext.tblOrder.ToList(); 我可以在列表或datagridview显示这些顺序。 然后选择其中一个作业,我想从表tblItems访问实体集合。 我可以这样做: ListOfOrders.First().tblItems.toList(); 除了我不能,因为我需要已经处理的DataContext 。 这在某种程度上是有道理的,因为我无法保证自从我检索ListOfOrders. So ideally I would like to check if there has been an addition to a tblOrder.tblItems以来没有添加到该订单的新项目ListOfOrders. So ideally I would like to check if there has been an addition to a tblOrder.tblItems ListOfOrders. So ideally […]

在SqlCommand中调用函数

public void CreateMySqlCommand() { SqlCommand myCommand = new SqlCommand(); myCommand.CommandText = “SELECT * FROM Categories ORDER BY CategoryID”; myCommand.CommandTimeout = 15; myCommand.CommandType = CommandType.Text; } 我可以在myCommand.CommandText中使用Sql Server函数吗?为什么?

没有sql server的本地数据库

我正在创建一个C#应用程序,我将安装在一些低端PC上。 我可以在低端机器上安装的只是.NET框架。 我想使用某种数据库,以便我可以存储应用程序将从互联网上抓取的信息。 任何人都可以建议我如何处理这个问题? 我无法安装任何版本的SQL Server。 谢谢。

在NHibernate中设置TimeOut Expired

我在sql server 2008 R2中有一个存储过程,它工作正常,但突然它抛出了TimeOut Expiration的例外。 BmDaoSession.CreateSQLQuery(“exec SP_Name @Param1 = ‘” + clientCode + “‘, @Param2 ='” + existingDatabase + “‘, @Flag='” + flag + “‘”).ExecuteUpdate(); 我使用上面的NHibernate命令来调用我的SP。 我的问题是如何在NHibernate中设置TimeOut Expiration。 谢谢

DRY CLR表值函数

我正在使用CLR表值函数来SELECT并返回使用许多变量的复杂数据库搜索的结果。 文档显示您以类似于此的方式构建此类函数: public partial class UserDefinedFunctions { private class ResultRow // This class holds a row which we want to return. { public SqlInt32 CustId; public SqlString Name; public ResultRow(SqlInt32 custId_, SqlString name_) { CustId = custId_; Name = name_; } } [SqlFunction( DataAccess = DataAccessKind.Read, FillRowMethodName = “Test_FillRow”, TableDefinition = “CustId int” + “Name […]

EF和TPT:在SET子句中多次指定列名

我正在使用EF 6并使用TPT策略来模拟我的问题。 Rule是一个抽象类。 OvertimeRule是一个inheritance自Rule的具体类。 Rule看起来像这样: public abstract class Rule { public int Id { get; set; } public PeriodType PeriodType { get; set; } public int SortOrder { get; set; } public int StatuteId { get; set; } public bool IsActive { get; set; } } OvertimeRule看起来像这样: public partial class OvertimeRule : Rule { public […]

entity framework6 DBContext只包含所有表的子集

我们有一个包含770个表的庞大数据库,并希望使用EF 6.1x进行一些性能测试。 我们只想查询这770个表中的5个。 是否可以创建一个只有5-6个实体/ DBSets的“轻”DBContext,而不是使用完整的770-tables-context? 当我们使用完整上下文时,一个包含4个连接的简单查询需要45秒。 那是44秒太长了。 我们正在使用代码优先(逆向工程)。 问题:当我们创建完整上下文的这种“轻型”版本(即仅5个表)时,EF抱怨所有与这5个表有某种关联的所有其他实体都缺少密钥。 我们只映射这5个表的键,属性,关系,而不是其余的。 由于用LINQ编写的查询只查询5个表,因此EF应该忽略其他765个表,但它不会。 为什么不? LazyLoading = true / false似乎与此无关。 注意: 显然,可以在DB中创建一个视图,该视图使用LINQ查询执行我们在代码中所做的操作。 问题是可以使用上面的“轻”DbContext来完成。 有上下文的“轻”版本: public class ItemLookupContext : DbContext { static ItemLookupContext() { Database.SetInitializer( null ); } public ItemLookupContext() : base( “Name=ItemLookupContext” ) { //Configuration.LazyLoadingEnabled = true; } public DbSet Identities { get; set; } public DbSet Items […]

C#Hash SHA256Managed不等于TSQL SHA2_256

我使用哈希密码和盐(用户名)。 问题是c#的散列值不等于我通过TSQL脚本添加到数据库的初始值。 TSQL: UPDATE [Users] SET Password = HASHBYTES(‘SHA2_256’, ‘test123’+UPPER([UserName])) GO; C#: var passBytes = new UnicodeEncoding().GetBytes(pass); var saltBytes = new UnicodeEncoding().GetBytes(userName.ToUpper()); var dataToHash = new byte[passBytes.Length + saltBytes.Length]; Array.Copy(passBytes, dataToHash, passBytes.Length); Array.Copy(saltBytes, dataToHash, saltBytes.Length); var sha = new SHA256Managed(); return sha.ComputeHash(dataToHash); 我想这与编码有关。 但我不知道如何解决这个问题。 UserName是varchar(50) DB是现有的,因此更改varchar将不那么容易。 我已经尝试过: UPDATE [Users] SET Password = HASHBYTES(‘SHA2_256’, N’test123’+UPPER([UserName])) GO;