如何在ASP.NET Core中使用SqlClient?

120
我想在ASP.net核心中使用SQLClient库,但好像无法使其正常工作。我在网上找到了一篇文章,介绍了如何设置它,但对我不起作用:http://blog.developers.ba/using-classic-ado-net-in-asp-net-vnext/
我有一个简单的控制台应用程序包。我的project.json看起来像这样:
{
  "version": "1.0.0-*",
  "description": "DBTest Console Application",
  "authors": [ "" ],
  "tags": [ "" ],
  "projectUrl": "",
  "licenseUrl": "",

  "compilationOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "System.Data.Common": "4.0.1-beta-23516",
    "System.Data.SqlClient" :  "4.0.0-beta-23516"
  },

  "commands": {
    "DBTest": "DBTest"
  },

  "frameworks": {
    "dnx451": { },
    "dnxcore50": {
      "dependencies": {
        "Microsoft.CSharp": "4.0.1-beta-23516",
        "System.Collections": "4.0.11-beta-23516",
        "System.Console": "4.0.0-beta-23516",
        "System.Linq": "4.0.1-beta-23516",
        "System.Threading": "4.0.11-beta-23516"
      }
    }
  }
}

然后我尝试了以下代码:

using System;
using System.Data.SqlClient;

namespace DBTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            using (SqlConnection con = new SqlConnection(ConnStr)) {
                con.Open();
                try {
                    using (SqlCommand command = new SqlCommand("SELECT * FROM SAMPLETABLE", con)) {
                        command.ExecuteNonQuery();
                    }
                }
                catch {
                    Console.WriteLine("Something went wrong");
                }
            }

            Console.Read();
        }
    }
}

但是出现了以下错误:

在此输入图像描述

还有其他人成功实现了吗?


1
您的依赖项中似乎没有 System.Runtime 的引用。您尝试添加了吗? - thorkia
1
你没有在你的SQL中执行UPDATE,INSERT或DELETE命令,那么为什么要使用command.ExecuteNonQuery();?请查阅使用Fill()方法从数据库返回数据或使用ExecuteScalar方法如果只返回单行。你还需要添加引用,不仅在.cs文件类头using部分中添加,还需要手动将它们添加到项目的reference节点中。 - MethodMan
1
你的错误表明你没有为 DNX 4.5.1 添加正确的引用。你同时为两种项目类型构建。如果你不关心 DNX 4.5.1,那么从你的配置中删除它,就可以构建了。 - mason
1
大家好 - 非常感谢你们!已经删除了 DNX 4.5.1 部分,并在设置中添加了 System.Runtime 依赖项,现在它完美地工作了(尽管需要重新启动 Visual Studio!)。再次感谢! - Rob McCabe
3个回答

208

我认为你在教程中可能错过了这一部分:

你需要从Nuget获取以下两个类库而不是引用System.Data和System.Data.SqlClient:

System.Data.Common和System.Data.SqlClient。

目前,这会在project.json文件的aspnetcore50部分创建对这两个类库的依赖关系。

"aspnetcore50": {
       "dependencies": {
           "System.Runtime": "4.0.20-beta-22523",
           "System.Data.Common": "4.0.0.0-beta-22605",
           "System.Data.SqlClient": "4.0.0.0-beta-22605"
       }
}
尝试通过Nuget获取System.Data.Common和System.Data.SqlClient,看看是否会为您添加上述依赖项,但简而言之,您缺少System.Runtime。 编辑:根据Mozarts的回答,如果您正在使用.NET Core 3+,请引用Microsoft.Data.SqlClient。

11
我只需要通过 Nuget 添加 System.Data.SqlClient,就可以在 .NET Core 1.1 中与 Dapper 一起使用了。 - tedi
4
我刚刚通过Nuget添加了system.data.sqlclient,并且它能正常工作。 - Shahram
1
这个问题在 .NET Core 2.0 中似乎已经被修复了。对我来说至少是这样。 - tedi
我在使用Nuget或dotnet add package添加此软件包时遇到了问题。解决方法是将依赖项直接放入项目文件中,并执行还原操作 - dotnet restore。Nuget.config文件应该在packageSources部分包含nuget.org。 - user2809176
哪一个是正确的?在 .NET Core 中使用 System.Data.SqlClient 还是 Microsoft.Data.SqlClient? - Karthic G
显示剩余2条评论

87

10
对于任何从.NET Core 2.2迁移到.NET Core 3.0的人来说,这个评论是救命稻草。将所有对System.Data.SqlClient的引用替换为Microsoft.Data.SqlClient即可。 - Admir Tuzović
@mozart,.Net Core 2.2 可以使用 Microsoft.Data.SqlClient 吗?还是说 Microsoft.Data.SqlClient 只能用于 .net Core 3? - Daleman
@Daleman 我在迁移到 .Net Core 3 时解决了这个问题,所以我没有尝试过在2.2上运行它。我不认为它会起作用,“每个参数都有一个数据类型,对吧?”但你可以试试看。 - Mozart
@Mozar,你的数据库连接还在使用 StringBuilder 吗? - Daleman
1
@SteveSmith,你可以在链接中查看文章。 - Mozart
显示剩余4条评论

4
尝试这个方法:打开您的projectname.csproj文件,这对我起作用了。
<PackageReference Include="System.Data.SqlClient" Version="4.6.0" />

您需要在内部添加“ItemGroup”标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接