【问题标题】:Invalid cast error on querying the database查询数据库时出现无效的强制转换错误
【发布时间】:2020-05-25 16:16:04
【问题描述】:

我正在 .NET Core 中开发一个控制台应用程序以在数据库中读/写,使用与我之前的应用程序(用于 Web,用 ASP.NET MVC 编写)相同的代码(稍作更改)。

但是,当我查询数据库时,(正在运行的)程序会抛出一个无效的强制转换异常

System.InvalidCastException:“无法将“Microsoft.Data.SqlClient.SqlCommand”类型的对象转换为“System.Data.SqlClient.SqlCommand”类型。”。

但这些命令在我的网络应用程序中运行没有问题。

谁能帮我解决这个问题?

.csproj 文件:

… 
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <StartupObject></StartupObject>
  </PropertyGroup>
…
  <ItemGroup>
… 
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.1" />
    <PackageReference Include="Microsoft.Windows.Compatibility" Version="2.0.0" />
… 
  </ItemGroup>

我在Program.cs 中的Main 例程,我在其中配置应用程序:

using System;
using System.IO;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.SqlServer;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using System.Collections.Generic;
… 
            var optionsBuilder = new DbContextOptionsBuilder<fmDataContext>();

            optionsBuilder
                .UseSqlServer(connectionString, providerOptions => providerOptions.CommandTimeout(60));

            using (fmDataContext context = new fmDataContext(optionsBuilder.Options))
… 

我对发生错误的数据库的查询(在我的数据上下文类中):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.SqlServer;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
… 
            DataTable dt = new DataTable();

            DbConnection connection = Database.GetDbConnection();//)
            using (DbCommand cmd = connection.CreateCommand())
            using (DbDataAdapter sda = new SqlDataAdapter((SqlCommand)cmd))
            {
                cmd.CommandText = sqlQuery;
                cmd.CommandType = CommandType.Text;
                connection.Open();
                rows_returned = sda.Fill(dt);
                connection.Close();
            }

【问题讨论】:

  • 这与控制台应用程序无关。 .NET Core 3.x(和 EF Core 3.x)使用​​新库 Microsoft.Data.SqlClient。将 System.Data.SqlClient 命名空间替换为 Microsoft.Data.SqlClient
  • 添加到@PanagiotisKanavos 的评论中,两个命名空间都有同名的类(例如SqlCommand),以方便从.NET 框架迁移到核心,但需要注意使用Microsoft.Data.SqlClient在核心世界。见this announcement
  • 你尝试过干净的构建吗?编译器可能无法识别网络版本中的更改,因此中间目标文件不会使用新的库版本重新编译。

标签: c# sql-server entity-framework .net-core


【解决方案1】:

在 .NET Core 3.0 中,与 SQL Server 相关的二进制文件及其数据类型已从本机 System.Data 命名空间中移出并移至它们自己的专用包中,以减少框架的臃肿。

那些仍需要使用SQL Server 的开发人员可以通过在Microsoft.Data.SqlClient 下载必要的 NuGet 包来选择加入。

参考: https://devblogs.microsoft.com/dotnet/introducing-the-new-microsoftdatasqlclient/

【讨论】:

    【解决方案2】:

    Microsoft.EntityFrameworkCore.SqlServer 库使用Microsoft.Data.SqlClient。所以你需要使用它而不是System.Data.SqlClient

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      相关资源
      最近更新 更多