Tag: sql server

在WCF服务返回DataTable时需要帮助解决错误:OutOfMemoryException

我有一个正在尝试返回DataTable的WCF服务。 service方法使用SqlDataReader ,然后使用DataTable.Load()将该数据输入到它想要返回的DataTable 。 问题:当服务方法返回一个大表时(我稍后会定义它),我在调试输出中得到这些exception(它们不会削弱服务): SMDiagnostics.dll中出现类型为“System.OutOfMemoryException”的第一次机会exception SMDiagnostics.dll中发生了’System.InsufficientMemoryException’类型的第一次机会exception “大”的定义:我测试中返回的记录集包含286760条记录,当该表导出为文本时,大小约为800MB。 我知道这都是相对的,所以这可能都是毫无意义的。 大多数情况下,我指出这一点是因为对于我来说,抛出内存exception似乎相当小,特别是考虑到我正在测试的开发机器有8GB内存这一事实。 同样,它都是相对的,也许是无关紧要的,但我正在努力提供足够的信息。 这是我的连接代码: NetTcpBinding netBind = new NetTcpBinding(); netBind.Security.Mode = SecurityMode.Transport; netBind.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows; netBind.MaxReceivedMessageSize = Int32.MaxValue; netBind.MaxBufferSize = Int32.MaxValue; netBind.MaxBufferPoolSize = 0; netBind.MaxConnections = 300; netBind.ListenBacklog = 300; netBind.ReaderQuotas = XmlDictionaryReaderQuotas.Max; netBind.PortSharingEnabled = true; netBind.OpenTimeout = new TimeSpan(0, 0, RegistryValues.DatabaseTimeout); netBind.CloseTimeout = new TimeSpan(0, 0, […]

使用Entity Framework Code First将SQL表主键定义为区分大小写

是否可以首先在entity framework代码中定义SQL区分大小写的主键? 我知道默认情况下,SQL在字符串方面不区分大小写,只是为了清楚我不想将整个数据库定义更改为区分大小写,只需要一个表列(主键)。 我从外部API获取数据,该API使用区分大小写的主键(’a’和’A’是不同的记录)发送数据,我知道我可以修改它们并在我的数据库中以不同方式保存它们,但这也需要我在我的代码中到处都是一致的。 这是绝对可能的,但我宁愿避免它。 理想情况下,我希望找到一种方法,通过entity framework将主键定义为区分大小写,而不是使用SQL查询 。 我会很感激任何建议,或者更好的方法来做到这一点。 更新 好吧,所以我几乎失去了对这种可能性的希望,现在当我尝试使用另一种方法时: public ovveride Up() { // drops the existing primary key named PK_dbo.Urls Sql(“ALTER TABLE dbo.Urls DROP CONSTRAINT [PK_dbo.Urls]”); // change the collation Sql(“ALTER TABLE dbo.Urls ALTER COLUMN Url VARCHAR(10) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL”); // re-add the primary key to the Url column Sql(“ALTER TABLE […]

我如何获得所有月份从日期formssql?

我有表名’payroll’和以下数据 month , pay January , 1200 March , 1500 December , 2000 我希望从存储过程的水晶报告中得到以下结果我想要一个显示此结果的SQL查询 Janury , 1200 February , 000 March , 1500 April , 000 May , 000 June , 000 July , 000 August , 000 September , 000 October , 000 November , 000 December , 2000 请帮忙进行查询。 提前致谢

为什么要使用SqlParameter 而不是嵌入参数?

我有一个sqlhelper类,包含一个重载的ExecuteNonQuery:一个只有一个参数(commandText),另一个有两个参数(commandText,SqlParameter [])。 假设我有一个没有用户交互的独立控制台应用程序,我将调用一个只更新一个包含3个参数的表的存储过程,如果我可以轻松地构建字符串,那么使用SqlParameter []有什么好处?只是将它作为commandText发送? 换句话说,为什么要使用以下内容: SqlParameter[] parameters = { new SqlParameter(“parm1” SqlDbType.VarChar, 3), new SqlParameter(“parm2”, SqlDbType.VarChar, 8), new SqlParameter(“parm3”, SqlDbType.VarChar, 2), new SqlParameter(“parm4”, SqlDbType.VarChar, 4) }; parameters[0].Value = p1; parameters[1].Value = p2; parameters[2].Value = p3; parameters[3].Value = p4; 当我可以使用这样的东西时: strQueryToRun = string.Format(“exec updateTable {0}, {1}, {2}, {3}”, p1, p2, p3, p4); 这是一个独立的控制台应用程序,因此不可能进行SQL注入。 谢谢。

让SqlDataAdapter和SqlCommand混淆

我有这个调用方法: public string RunReportSteps(int _reportKey) { DataTable fStepsTable; fStepsTable = GetStepsTable(“xxx.console.pr_xxx”); return (string)fStepsTable.Rows[1][3]; } 它调用这个私有方法: private DataTable GetStepsTable(string procName) { var connectionString = ConfigurationManager.ConnectionStrings[“xxx”].ConnectionString; using(var conn = new SqlConnection(connectionString)) using(var adapt = new SqlDataAdapter()) using(var cmd = new SqlCommand(procName, conn)) { conn.Open(); SqlParameter p = new SqlParameter(“@ReportKey”, this.ReportKey); p.Direction = ParameterDirection.Input; cmd.Parameters.Add(p); adapt.SelectCommand = cmd; […]

如何在DacServices.Deploy()中禁用预部署和部署后脚本

我们有一些自动dacpac部署代码,可以使用Microsoft.SqlServer.Dac正确处理C#中的CreateNewDatabase和简单的Update数据库方案 现在,在CreateNewDatabase的情况下,我们希望能够在禁用前置和后置部署脚本的情况下运行DacServices.Deploy() 。 即它们不应该在这种情况下执行。 我试图在DacDeployOptions和DacServices对象中找到合适的位置,但找不到任何可以执行此操作的地方.Ideally 问题1 : 我想要类似于DacDeployOptions.IgnorePreDeploymentScript = true有什么方法可以在运行时实现这一点吗? 作为替代方案,前段时间我记得看过示例代码,它展示了如何遍历dacpac并在运行时创建一个新的dacpac。 我认为这种方法可以让我简单地创建一个新的dacpac,我可以将其传递给Deploy,它将排除Pre和Post Deployment脚本。 我不喜欢这个解决方案,但它可以让我实现我所需要的。 问题2 : 有人可以为我指出一些例子吗? 我的代码: var dacService = new DacServices(ConstDefaultConnectionString); using (var dacPackage = DacPackage.Load(dacPacFilePath)) { var deployOptions = new DacDeployOptions { CreateNewDatabase = true, IncludeTransactionalScripts = false }; dacService.Deploy(dacPackage, TestDatabaseName, true, deployOptions); } 问题与以下内容有关: 创建LocalDB以便从Visual Studio SQL项目进行测试

将日期与字符串entity framework进行比较

让我们假设我有一个SQL Server数据库和一个看起来像这样的表: Id int NOT NULL, Date date NOT NULL 我有相应的entity framework模型: public class Bundle { public int Id {get; set;} public DateTime Date {get; set;} } 用户可以键入可以是任何内容的字符串。 我需要找到Date或日期的任何部分包含用户输入的字符串的所有项目。 所以,基本上,我需要执行查询: SELECT Id, Date FROM Bundles WHERE Date LIKE ‘%user_query_here%’ 我的第一次尝试是 query.Where(b => b.Date.ToShortDateString().Contains(filter.Date)) 这会引发NotSupportedException,所以我尝试了这个: query.Where(b => Convert.ToString(b.Date).Contains(filter.Date)); 请注意, filter.Date是字符串。 它不是DateTime结构。 这也引发了一个例外。 所以我的问题是如何执行上面执行的查询? PS:我无法在内存中执行过滤,这个表有几千行。

在SQL Server中自动提交事务使用什么隔离级别?

当我使用SNAPSHOT隔离级别处理更新冲突问题时,似乎自动提交事务使用上次使用的隔离级别。 条件:ALLOW_SNAPSHOT_ISOLATION为ON,READ_COMMITTED_SNAPSHOT为OFF 步骤1:执行没有事务的更新语句 using (var sqlconn = new SqlConnection(“Data source=…”)) using (var sqlcmd = sqlconn.CreateCommand()) { sqlconn.Open(); sqlcmd.CommandText = “Update …” sqlcmd.ExecuteNonQuery(); } 然后我看一下sys.md_exec_sessions ,发现事务隔离级别是sys.md_exec_sessions 。 步骤2:使用SNAPSHOT隔离级别的事务执行update语句 using (var sqlconn = new SqlConnection(“Data source=…”)) { sqlconn.Open(); using (var sqltran = sqlconn.BeginTransaction(IsolationLevel.Snapshot)) using (var sqlcmd = sqlconn.CreateCommand()) { sqlconn.Open(); sqlcmd.CommandText = “Update …” sqlcmd.ExecuteNonQuery(); } } […]

SqlDataAdapter不会填充DataSet

我正在使用VS2012和SQL Server Express 2008.我已经简化了我的连接/查询,试图找出为什么我的DataSet没有被填充。 连接成功完成,并且不会抛出任何exception,但适配器不会填充DataSet 。 从中提取的数据库位于同一台PC上,使用localhost\SQLEXPRESS不会更改结果。 谢谢你的任何输入! SqlConnection questionConnection = new SqlConnection(ConfigurationManager.ConnectionStrings[“DefaultConnection”].ConnectionString); questionConnection.Open(); String sql = “SELECT * FROM HRA.dbo.Questions”; SqlDataAdapter adapter = new SqlDataAdapter(); DataSet ds = new DataSet(); SqlCommand command = new SqlCommand(sql, questionConnection); adapter.SelectCommand = command; adapter.Fill(ds); adapter.Dispose(); command.Dispose(); questionConnection.Close(); 连接字符串:

安装SQL Server 2014 Express包作为ClickOnce先决条件

我正在使用clickOnce并使用它部署安装程序。 我尝试了各种设置。 使用SQL Server 2008 Express和SQL Server 2012 Express作为先决条件都可以(我已经下载了它们并设置了clickonce“从app的相同路径下载先决条件”的选项)。 现在我正在尝试使用SQL Server 2014 Express做同样的事情。 由于SQL Server 2014 Express包不能完成2008和2012版本的版本,我正在尝试创建它。 我已经完成了它似乎工作,但安装它时给出错误号-2054422506 。 这是一个非常普遍的错误,我不明白。 它似乎是一个弹出窗口,说安装已停止,因为安装SQL Server Express 2014时出错并查看日志以获取更多信息。 日志只说: Installing using command ‘C:\Users\VIRTUA~1\AppData\Local\Temp\VSD24F4.tmp\SqlExpress2014\ SQLEXPR32_x86_ITA.EXE’ and parameters ‘/q /action=Install /features=SQL /instancename=SQLEXPRESS /securitymode=SQL /sapwd=passwd /sqlsvcaccount=”NT Authority\Network Service’ Process exited with code -2054422506 Status of package ‘SQL Server 2014 Express’ after install […]