关于SQL Server2005数据表字段关联问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于SQL Server2005数据表字段关联问题相关的知识,希望对你有一定的参考价值。

情况描述:
因工作需要,采用了一套门禁设备管理系统。现发现该 系统中进行刷卡记录查询报表,数据导出时,人员"name"字段数据完全丢失。但在系统中进行报表查询时,该字段数据是正常有效的。

图1:(查询刷卡记录报表)数据表显示正常有效。

图2:(报表数据导出excel表)字段数据丢失。

图3:(为sqlserver db数据库)人员表为dbo.userinfo

图4:导出记录报表的表名为dbo.checkinout

我想请问,如何将userinfo表的name字段关联到checkinou表的sn_name字段中引用。还是说并不是这样解决,请专家能给予指导解决一下,不胜感激!

为盼

如果是前台显示正常 只是导出后有问题的话,应该是导出那段写错字段名了 参考技术A 这系统是你们自己做的?若不是,应该联系供应商解决啊追问

商家狗屁不懂。别说什么数据库上的问题了。

还不如我自已解决。

追答

好吧,如果你能从数据库层面去解决问题也可以

不过在我看来这应该是软件的bug

如果你确认导出数据的表是checkinout,并且表中的sn_name确实是空值

那么可以在这张表中设置触发器,看你也不是很懂的样子,直接给你源码吧

create trigger tr_checkinout_in
on checkinout
for inserted
as
begin
    update a set a.sn_name=c.name from checkinout a join inserted b on a.id=b.id 
    join userinfo c on a.userid=c.userid
    where a.sn_name='' or a.sn_name is null
end

这是以后的自动处理模式,现有数据可以这样处理

update a set a.sn_name=c.name from checkinout a  
    join userinfo c on a.userid=c.userid
    where a.sn_name='' or a.sn_name is null

追问

谢谢你的解答。我是一知半解,还希望你能多给指导一下。

我现在也在怀疑sn_name并非是人员姓名字段。如果不是,那这个触发器代码,一执行。那系统数据是不是会直接受到损坏或丢失的影响?

您看,能否直接我远程给你,帮我查清楚,这导出的问题是在哪?到底是表字段的bug,还是软件上的BUG。

追答

首先能否确认这点,你没有程序的源码,这一时半会儿是查证不了的
即便是兼容性问题,也是程序不能兼容,如果程序足够健壮是可以跨数据库移植
如果你不能确认具体问题,也不能确认数据表之间的关系的话,最好不要轻易的改动
哦,对了,我上面的触发器和语句,只会将check表中sn_name没有值的地方添加值
不会造成损坏和丢失

追问

行吧,我先测试下这段语句,看看效果吧。

唉~谢谢

在.NET Core类库中使用EF Core迁移数据库到SQL Server

前言

如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题。

起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合理,一些关于数据库的迁移,比如新增表,字段,修改字段类型等等,不应该和最上层的Web项目所关联,数据的迁移文件放到这里也感觉有点多余,有点乱乱的感觉,所以才想着单独出来由专门的项目进行管理会比较好,也比较清晰!

注意目标框架选择的是.NET Core 2.0而不是.NET Standard 2.0

0、前期准备

a)、表实体定义,这个是在.NET Standard 2.0的类库中存放的。

/// <summary>

    /// 系统应用的用户实体

    /// </summary>

    public class ApplicationUser : BaseModel

    {

        /// <summary>

        /// 用户名

        /// </summary>

        public string UserName { get; set; }


        /// <summary>

        /// 密码

        /// </summary>

        public string Password { get; set; }


        /// <summary>

        /// </summary>

    }

b)、新建一个.NET Core 2.0的类库,并定义好我们所要使用的数据库上下文,很简单,接下来开始我们的正文

/// <summary>

    /// 系统上下文

    /// </summary>

    public class LightContext : DbContext

    {

        public LightContext(DbContextOptions<LightContext> options) : base(options)

        {

        }


        /// <summary>

        /// 系统应用用户

        /// </summary>

        public DbSet<ApplicationUser> ApplicationUser { get; set; }


        /// <summary>

        /// 角色表

        /// </summary>

        public DbSet<Role> Role { get; set; }

    }

1、问题汇总

首先要确保仓储类库中已经引入以下两个Nuget包,没有的话请使用包管理器进行安装。不建议直接引入原包:Microsoft.AspNetCore.All,按需引入即可

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Install-Package Microsoft.EntityFrameworkCore.Tools

a)打开CMD,然后切换到类库所在路径下,执行以下命令。不过你也可以使用程序包管理器控制台(PMC)进行迁移,但是会有少许变化,部分命令见下表:

迁移命令描述 CMD命令 PMC命令
创建迁移:migrationname为迁移名称 dotnet ef migrations add migrationname add-migration migrationname
移除迁移(删除最近的一次迁移) dotnet ef migrations remove remove-migration
应用最新的迁移(使迁移文件应用到数据库) dotnet ef database update update-database
应用指定的迁移 dotnet ef database update migrationname update-database migrationname
查看迁移列表 dotnet ef migrations list
查看数据库上下文信息 dotnet ef dbcontext info
dotnet ef

错误提示:

  未找到与命令“dotnet-ef”匹配的可执行文件

解决方法:

  在项目文件Light.Repository.csproj中添加以下节点

<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.1" /></ItemGroup>

重新执行上面的命令,如果出现了EF Core的标志(一头蓄势待发的野马)表示已经成功

在.NET Core类库中使用EF Core迁移数据库到SQL Server

 b)、执行以下命令进行迁移

dotnet ef migrations add InitLightDB

在.NET Core类库中使用EF Core迁移数据库到SQL Server

错误提示:

The specified framework version '2.0' could not be parsed
The specified framework 'Microsoft.NETCore.App', version '2.0' was not found.
- Check application dependencies and target a framework version installed at:

- Alternatively, install the framework version '2.0'.

解决方法:

  在项目文件中添加以下节点:

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <RuntimeFrameworkVersion>2.0.3</RuntimeFrameworkVersion>
  </PropertyGroup>

c)、重新执行b步骤的命令,报错信息如下:

在.NET Core类库中使用EF Core迁移数据库到SQL Server

错误提示:

  Unable to create an object of type 'LightContext'. Add an implementation of 'IDesignTimeDbContextFactory<LightContext>' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.

这个问题如果是在Web项目,并且配置了DbContext的链接字符串的话,是不会出现此问题的。很显然是迁移命令没有找到DbConnectionString导致的,接下来我们按照提示,实现一个IDesignTimeDbContextFactory<LightContext>试试

解决方法:

  创建一个与DbContext同一目录下的DesignTimeDbContextFactory文件,然后实现接口中的方法CreateDbContext,并配置ConnectionString

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<LightContext>

    {

        public LightContext CreateDbContext(string[] args)

        {

            var builder = new DbContextOptionsBuilder<LightContext>();

            builder.UseSqlServer("Server=(localdb)\MSSQLLocalDB;Integrated Security=true;Initial Catalog=Light;");

            return new LightContext(builder.Options);

        }

    }

再次执行迁移命令,终于成功了。

在.NET Core类库中使用EF Core迁移数据库到SQL Server

成功提示:

  Done. To undo this action, use 'ef migrations remove'

同时类库下面会生成Migrations文件夹以及相关的迁移文件

在.NET Core类库中使用EF Core迁移数据库到SQL Server

2、小试迁移命令

a)、使用以下命令应用迁移,生成数据库和表

dotnet ef database update

在.NET Core类库中使用EF Core迁移数据库到SQL Server

通过VS的SQL Server资源管理器查看生成数据库的结构,其中__EFMigrationsHistory为每次迁移的记录表

在.NET Core类库中使用EF Core迁移数据库到SQL Server

b)、因为string类型的字段迁移到数据库之后的数据类型为nvarchar(max)并且是可空类型的,下面我们就使用Fluent API对ApplicationUser表字段进行配置,同样你也可以使用属性注解的方式进行配置,因为我自己不喜欢“污染”表实体

public static void ConfigApplicationUser(ModelBuilder modelBuilder)

        {

            modelBuilder.Entity<ApplicationUser>(m =>

            {

                        .HasMaxLength(50);


                m.Property(t => t.UserName)

                        .IsRequired()

                        .HasMaxLength(50);


                m.Property(t => t.Password)

                        .IsRequired()

                        .HasMaxLength(20);

            });

        }

然后同样使用上面的两条命令重新迁移并更新数据库结构

在.NET Core类库中使用EF Core迁移数据库到SQL Server

观察数据库表结构已经更新

在.NET Core类库中使用EF Core迁移数据库到SQL Server

 同理添加字段,删除字段都是一样的迁移操作,还是很方便的

3、扩展

a)、为了方便演示,其实上面在类库中执行迁移时的数据库连接字符串是写死的,那么最好的办法是应该去读取Web项目下已经配置好的连接,这样就能保证上下的一致性,不用再去为了EF的迁移而单独维护一个多余的数据库连接配置。改造也很简单,即通过Configuration组件读取appsettings.json的ConnectionStrings节点,改造之后是这样子的:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<LightContext>

    {

        public LightContext CreateDbContext(string[] args)

        {

            Directory.SetCurrentDirectory("..");//设置当前路径为当前解决方案的路径

            string appSettingBasePath = Directory.GetCurrentDirectory() + "/Light.AuthorityApi";//改成你的appsettings.json所在的项目名称

            var configBuilder = new ConfigurationBuilder()

                .SetBasePath(appSettingBasePath)

                .AddJsonFile("appsettings.json")

                .Build();


            var builder = new DbContextOptionsBuilder<LightContext>();

            //builder.UseSqlServer("Server=(localdb)\MSSQLLocalDB;Integrated Security=true;Initial Catalog=Light;");

            builder.UseSqlServer(configBuilder.GetConnectionString("LightConnection"));

            return new LightContext(builder.Options);

        }

    }

注意需要额外引入下面这个Nuget包:

Install-Package Microsoft.Extensions.Configuration.Json

b)、属性注解[Column(Order = 1)]对EF Core来说还没有达到可以调整数据库生成字段的顺序,不过我们还是可以修改迁移文件的实体属性的顺序来达到我们想要的效果。下面是我调整之后重新生成的表,是不是看出来和上面的有什么不同,一图胜万语:

 c)、最后一步,自己动手试试看:创建一个SeedData迁移文件来添加数据库的初始数据。:)

4、最后

EF Core的强大远不止这些,还有更多的使用方法等着我们去发现,去探索。每天进步一点点,是件很愉快的事情!

原文:http://www.cnblogs.com/wangjieguang/p/EFCore-Migration.html


以上是关于关于SQL Server2005数据表字段关联问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MS Access 2007 或 MS SQL Server 2005 中通过 SQL 将字段转换为行

sql如何获得某个数据库里面的表的字段名,字段类型,字段长度(sql server2005)

Sql Server2005数据库怎么查看视图里的字段。

关于配置sql server 2005的问题

sql server 2005 跨数据库操作

仅使用 SQL 将图片插入 SQL Server 2005 图像字段