Tag: sql server

从SQL Server读取十进制值时出现溢出exception

我想知道这是一个错误还是我出错了。 我正在使用SQL Server 2008数据库中的SqlDataReader加载值,但在某些情况下,它无法将SQL值转换为.net值。 (.NET 4.0) 我已将其追溯到一个测试案例,该案例演示了实际问题: 工作范例: “select convert(decimal(38, 19), 260000 ) as test” rs.GetValue(1); –> returns 260000 (decimal) 不工作: “select convert(decimal(36, 26), 260000 ) as test” rs.GetValue(1); –> throws System.OverflowException: Conversion overflows. at System.Data.SqlClient.SqlBuffer.get_Decimal() at System.Data.SqlClient.SqlBuffer.get_Value() at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i) at System.Data.SqlClient.SqlDataReader.GetValues(Object[] values) 我已经检查了SQL Server恢复的实际值。 他们的不同之处在于,非工作人员使用4个整数来表示价值,而工作人员只使用3个。 我还检查了.net Reflector的源代码,它揭示了如果值存在超过3个值时抛出exception,但我不理解它们背后的机制。 所以,我想知道这是否是.net框架中的真正错误。

同时使用entity framework与SQL Server和SQLite数据库

我有一个用于测试目的的C#.Net 4.0控制台应用程序(使用VS 2012)。 我的目标是能够创建一个可以在MS SQL Server数据库和SQLite数据库上使用的单个Entity Framework .edmx文件。 基本上,我想使用相同的实体模型类和集合进行查询,但很容易就能随意在两个不同的数据库之间切换。 到目前为止,我已经通过连接到MS Server数据库并添加了我的单个测试表(称为Contact)来创建我的.edmx文件。 有了这个,我可以使用以下代码从我的表中获取数据: var db = new DataAccess.ContactTestEntities(); foreach (var contact in db.Contacts) Console.WriteLine(“” + contact.ID + “. ” + contact.FirstName + ” ” + contact.LastName); 现在,我希望能够使用相同的代码,而是连接到SQLite数据库。 我编写了一个部分类,允许我更改contruction上的连接字符串,如下所示: var db = new DataAccess.ContactTestEntities(“MY SQLITE CONNECTION STRING”); 它在这方面工作正常,除了在尝试查询数据库时我收到此错误: 无法将类型为“System.Data.SQLite.SQLiteConnection”的对象强制转换为“System.Data.SqlClient.SqlConnection”。 我试图找到解决方案,但已经走到了尽头,我正在努力寻找下一步。 这就是我的问题 :我怎样才能解决这个问题? 或者我可以采取另一种方法来获得相同的预期结果? 堆栈跟踪以上exception: 处于System.Data.Ents.Clmand.AntityClient.EntityCommandDefinition.ExecuteStoreCommands的System.Data.Common.Utils.CommandHelper.SetStoreProviderCommandState(EntityCommand entityCommand,EntityTransaction entityTransaction,DbCommand […]

带有WellKnownText空间数据列的SqlBulkCopy DataTable

我正在尝试批量复制具有以下列的DataTable : “ID” – System.Int32 “Geom” – System.String 使用以下列进入SQL数据库: “Id” – int “形状” – geometry 谁能建议最好的方法来做到这一点? 一些测试代码,如果有帮助…… DataTable dataTable = new DataTable(); dataTable.Columns.Add(“ID”, typeof(Int32)); dataTable.Columns.Add(“Geom”, typeof(String)); dataTable.Rows.Add(1, “POINT(‘20,20’)”); dataTable.Rows.Add(1, “POINT(‘40,25’)”); dataTable.Rows.Add(1, “POINT(‘60,30’)”); SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connection); sqlBulkCopy.DestinationTableName = “MySpatialDataTable”; sqlBulkCopy.WriteToServer(dataTable); 我的原始post未能解释执行上述操作会导致抛出以下exception。 InvalidOperationException:数据源中String类型的给定值无法转换为指定目标列的类型udt。 我假设SqlBulkCopy不知道geometry列类型,因此不知道如何从string转换为它。 谁能证实这一点?

百万插入:SqlBulkCopy超时

我们已经有一个运行系统来处理所有连接字符串( db2 , oracle , MSServer )。 目前,我们正在使用ExecuteNonQuery()来进行一些插入。 我们希望通过使用SqlBulkCopy()而不是ExecuteNonQuery()来提高性能。 我们有一些客户拥有超过5000万条记录。 我们不想使用SSIS ,因为我们的系统支持多个数据库。 我创建了一个示例项目来测试SqlBulkCopy()的性能。 我为MSServer创建了一个简单的读取和插入函数 这是小function: public void insertIntoSQLServer() { using (SqlConnection SourceConnection = new SqlConnection(_sourceConnectionString)) { //Open the connection to get the data from the source table SourceConnection.Open(); using (SqlCommand command = new SqlCommand(“select * from ” + _sourceSchemaName + “.” + _sourceTableName + “;”, […]

DateTime.MinValue与C#中的新DateTime()

获取SQL DateTime Resharper建议在值为DBNull.Value时使用new DateTime() 。 我一直使用DateTime.MinValue 。 哪种方法适当? DateTime varData = sqlQueryResult[“Data”] is DateTime ? (DateTime) sqlQueryResult[“Data”] : new DateTime();

EF返回的值不同于查询

所以我只是遇到了这个奇怪的情况,并想知道是否有人可能知道问题是什么。 我有以下EF Linq查询。 var hierarchies = (from hierarchy in ctx.PolygonHierarchyViews where hierarchy.DashboardId == dashboardId select hierarchy); 当我在调试器中检查该查询时,它显示以下SQL SELECT [Extent1].[DashboardId] AS [DashboardId], [Extent1].[CurrentId] AS [CurrentId], [Extent1].[PolygonTypeId] AS [PolygonTypeId], [Extent1].[DisplayName] AS [DisplayName], [Extent1].[ParentId] AS [ParentId] FROM [dbo].[PolygonHierarchyView] AS [Extent1] WHERE [Extent1].[DashboardId] = @p__linq__0 如果我在SQL Server Management Studio中运行它, @p__linq__0使用dashboardId的值替换@p__linq__0 。 我得到了这些结果。 DashboardId CurrentId Type Name ParentId 4 5 […]

EF Core嵌套Linq在N + 1个SQL查询中选择结果

我有一个数据模型,其中’Top’对象有0到N’Sub’对象。 在SQL中,这是通过外键dbo.Sub.TopId 。 var query = context.Top //.Include(t => t.Sub) Doesn’t seem to do anything .Select(t => new { prop1 = t.C1, prop2 = t.Sub.Select(s => new { prop21 = s.C3 //C3 is a column in the table ‘Sub’ }) //.ToArray() results in N + 1 queries }); var res = query.ToArray(); 在Entity Framework 6(延迟加载关闭)中,此Linq查询将转换为单个 […]

在.Net 4中加密SQL Server / Decrypt

我知道这可能是这个问题的重复: 如何加密sql server中的数据并在.net应用程序中解密 – 但这是近一年前问的,我希望可能有进步或其他东西。 无论如何,我们有一个应用程序,FTP文件从一个位置到另一个位置,显然FTP配置文件需要一个密码。 我们有一个包含配置文件所有详细信息的数据库,但我们需要加密密码。 我们已经考虑过在SQL中解密然后将它们发送到应用程序,但这意味着通过网络发送它,这是我们不想要的。 我们想要加密存储的密码,将详细信息传递给应用程序,然后在应用程序中解密它们。 这可能吗? 从我的谷歌搜索,它似乎不是,但我希望有人有一个技巧或东西。 提前致谢! 注意:我使用的是.Net 4和SQL Server 2008 R2。

为什么我突然收到这个错误?

所以我有一个WCF服务,里面有一个Process()方法。 此方法从一个表中读取字节数组(文件),并基本上将该文件中的数据放入多个表中。 它只是遍历每一行。 它在生产环境中工作了一个月以来一直很好。 现在突然间,它间歇地抛出这个错误: System.InvalidOperationException:与当前连接关联的事务已完成但尚未处理。 必须先处理事务,然后才能使用连接执行SQL语句。 可能有所帮助的东西:大约两周前,我们更换了生产网络和数据库服务器。 我们搬家后,这个错误一直在呕吐。 当我们在旧服务器上时,我从未遇到过这个问题。 但问题是,这个错误在前9-10天没有发生。 现在它突然间歇地发生了。 我已经上传了大文件(1k-2.5k行)并且它们工作正常,并且这个错误会引发更小的200行文件! 并且服务有时会完美地处理相同的文件。 代码片段:(它更大,但重复类似的操作) using (var scope = new TransactionScope()) { // loop through each row/invoice foreach (var row in Rows) { Invoice invoice = (Invoice)CreateObjectWithConstantData(typeof(Invoice), doc, applicationName); invoice = (Invoice)FillObjectWithUserData(invoice, row, -1, -1, string.Empty); invoice.InvoiceNumber = InvoiceDBImpl.SaveInvoice(invoice, processFileRequest.RunId); if (invoice.InvoiceNumber == Guid.Empty) { […]

如何使用Dapper将字符串作为NULL发送到SQLServer?

我有一个场景,其中C#中的字符串可以为null 。 我需要它在SQLServer上为NULL 。 我正在使用Dapper将其发送到SQLServer,其查询如下: connection.Query(“[dbo].[sp_MyStoredProcedure]”), new { StartDate: startDate }, commandType: CommandType.StoredProcedure); 其中startDate是有时可以等于null的字符串。 存储过程的参数是 @StartDate varchar(10) = NULL 当它为NULL它返回所有记录。 我已经确认这种行为可以通过SSMS实现。 我读过Marc Gravell的这篇文章说: null vs DBNull问题是混淆的常见原因; 但是, 通常如果人们在C#中声明为null ,则他们在SQL中打算使用null 。 这是小巧玲珑采用的方法。 这让我相信当string设置为null ,它应该将DBNull.Value发送到SQLServer。 但是,情况似乎并非如此。 我在发送null字符串时从SQLServer返回0条记录。 这似乎表示发送一个空字符串,而不是DBNull.Value 。 另外,我无法直接发送DBNull.Value : connection.Query(“[dbo].[sp_MyStoredProcedure]”), new { StartDate: DBNull.Value }, commandType: CommandType.StoredProcedure); 这会在Dapper中产生exception: System.DBNull类型的成员StartDate不能用作参数值 题 当我在C#中有一个可以为null的string时,如何使用Dapper将NULL发送到SQLServer? 重要 当字符串为null时,Dapper确实发送NULL 。 基于错误的信息,这个假设是我的错误。 […]