【问题标题】:How to read data from SQL server database table that is not in the default DBO schema如何从不在默认 DBO 架构中的 SQL Server 数据库表中读取数据
【发布时间】:2016-07-22 00:58:41
【问题描述】:

我正在构建一个使用 SQL Server 作为数据库的 .NET MVC 4 应用程序,我使用 Dapper 和 Dapper SimpleCRUD 进行数据库操作。在我的数据库中,我有默认 dbo 模式中的表,并且我也有其他模式中的表,例如 product.clients 而不是 dbo.clients。我在 SQL 服务器上创建了一个单独的登录名,该登录名映射到数据库上的一个单独的用户帐户(产品架构的所有者,默认为产品架构)。但是使用此凭据连接到数据库会给我诸如 System.Data.SqlClient.SqlException: Invalid object name 'clients' 之类的异常。现在,我已经搜索和搜索,但找不到如何在 web.config 中构造正确的连接字符串元素,以便我可以从默认 dbo 以外的模式中读取数据。我该怎么做?

【问题讨论】:

    标签: c# sql-server asp.net-mvc dapper


    【解决方案1】:

    您可以在查询中明确指定架构名称

    SELECT Id,ClientName FROM product.clients
    

    只要 sql 用户有权访问架构,它就应该可以工作。

    您可以根据需要连接来自 2 个 schamas 的表。

     SELECT C.Id,C.ClientName FROM product.clients C WITH (NOLOCK) 
     INNER JOIN dbo.UserAccount U WITH(NOLOCK) 
                             ON U.UserId=C.CreatedById
    

    【讨论】:

      【解决方案2】:

      好的,解决方案很简单,但不明显,除非你知道去哪里找。也许我的 google-fu 不是很好。

      答案是可以在Table属性注解中定义schema。

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;
      using Dapper;
      
      namespace MyApp.Models
      {
          [Table("Clients", Schema="Products")]
          public class Client
          {
              public int id { get; set; }
              public string firstname { get; set; }
              public string lastname { get; set; }
          }
      }
      

      这将有助于 Dapper 和 Dapper SimpleCRUD 找到正确的表并从那里读取数据。

      https://msdn.microsoft.com/en-us/library/system.data.linq.mapping.tableattribute(v=vs.110).aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-11
        • 1970-01-01
        • 2023-03-16
        相关资源
        最近更新 更多