问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ASP.NET更新数据库我的不能更新它也不报错

发布网友 发布时间:2022-04-08 02:43

我来回答

5个回答

懂视网 时间:2022-04-08 07:04

2.  给表添加新列

本小节,将修改Student和Instructor实体共同的基类Person类,添加一个birth date字段,也要在展示页面的表格上添加一个新列。

ContosoUniversity.DAL项目,打开Person.cs在类的末尾添加如下的代码属性(记得,大括号里面哦)。

[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
[Required(ErrorMessage = "Birth date is required.")]
[Display(Name = "Birth Date")]
public DateTime? BirthDate { get; set; }

 

需要更新初始化类来支持新列,打开SchoolInitializer.cs文件找到var students = new List<Student>开头的代码,替换成包括birth date信息的如下的爱吗:

var students = new List<Student>
{
 new Student { FirstMidName = "Carson", LastName = "Alexander", EnrollmentDate = DateTime.Parse("2005-09-01"), BirthDate = DateTime.Parse("1990-01-01") },
 new Student { FirstMidName = "Meredith", LastName = "Alonso", EnrollmentDate = DateTime.Parse("2002-09-01"), BirthDate = DateTime.Parse("1989-01-15") },
 new Student { FirstMidName = "Arturo", LastName = "Anand", EnrollmentDate = DateTime.Parse("2003-09-01"), BirthDate = DateTime.Parse("1988-02-01") },
 new Student { FirstMidName = "Gytis", LastName = "Barzdukas", EnrollmentDate = DateTime.Parse("2002-09-01"), BirthDate = DateTime.Parse("1987-03-15") },
 new Student { FirstMidName = "Yan", LastName = "Li", EnrollmentDate = DateTime.Parse("2002-09-01"), BirthDate = DateTime.Parse("1985-11-11") },
 new Student { FirstMidName = "Peggy", LastName = "Justice", EnrollmentDate = DateTime.Parse("2001-09-01"), BirthDate = DateTime.Parse("1970-11-21") },
 new Student { FirstMidName = "Laura", LastName = "Norman", EnrollmentDate = DateTime.Parse("2003-09-01"), BirthDate = DateTime.Parse("1992-10-11") },
 new Student { FirstMidName = "Nino", LastName = "Olivetto", EnrollmentDate = DateTime.Parse("2005-09-01"), BirthDate = DateTime.Parse("1986-06-06") }

};

 

var instructors = new List<Instructor>开头的代码块替换成如下代码:

var instructors = new List<Instructor>
{
 new Instructor { FirstMidName = "Kim", LastName = "Abercrombie", HireDate = DateTime.Parse("1995-03-11"), BirthDate = DateTime.Parse("1918-08-12") },
 new Instructor { FirstMidName = "Fadi", LastName = "Fakhouri", HireDate = DateTime.Parse("2002-07-06"), BirthDate = DateTime.Parse("1960-03-15") },
 new Instructor { FirstMidName = "Roger", LastName = "Harui", HireDate = DateTime.Parse("1998-07-01"), BirthDate = DateTime.Parse("1970-01-11") },
 new Instructor { FirstMidName = "Candace", LastName = "Kapoor", HireDate = DateTime.Parse("2001-01-15"), BirthDate = DateTime.Parse("1975-04-11") },
 new Instructor { FirstMidName = "Roger", LastName = "Zheng", HireDate = DateTime.Parse("2004-02-12"), BirthDate = DateTime.Parse("1957-10-12") }

};

 

在ContosoUniversity项目打开Instructors.aspx文件,添加一个模板字段来显示birth date,在hire date和office assignment字段之间:

<asp:TemplateField HeaderText="Birth Date" SortExpression="BirthDate">
 <ItemTemplate>
 <asp:Label ID="InstructorBirthDateLabel" runat="server" Text=‘<%# Eval("BirthDate", "{0:d}") %>‘></asp:Label>
 </ItemTemplate>
 <EditItemTemplate>
 <asp:TextBox ID="InstructorBirthDateTextBox" runat="server" Text=‘<%# Bind("BirthDate", "{0:d}") %>‘
  Width="7em"></asp:TextBox>
 </EditItemTemplate>
</asp:TemplateField>

(注:如果代码变形了,可以通过CTRL+K+D来格式化代码)

Students.aspx文件,在enrollment date 之前添加一个dynamic字段显示birth date:

<asp:DynamicField DataField="BirthDate" HeaderText="Birth Date" SortExpression="BirthDate"/>

 

StudentsAdd.aspx页面, enrollment date之前添加一个bound字段显示birth date:

<asp:BoundField DataField="BirthDate" HeaderText="Birth Date"
 SortExpression="BirthDate"/>

 

BLLSchoolBL.cs文件, 支持按列排序的GetStudents 方法力的switch语句里的default语句之前,添加一个case分支以支持使用birth date排序:

case "BirthDate":
 students = students.OrderBy(s => s.BirthDate);
 break;
case "BirthDate DESC":
 students = students.OrderByDescending(s => s.BirthDate);
 break;

 

运行程序访问Students页面,你可能感觉有一点慢,那是因为Entity Framework探测到了model变了,需要删除并重建数据库,然后将初始化里的数据插入到数据库。页面加载以后,可以看到有了一个birth date新列。

 

技术分享

访问Add Students和Instructors页面验证是否有这个新列。

 

技术分享

 

技术分享

3.  部署数据库更新到测试环境

在生产环境,部署升级的时候需要保持以前的数据,但是在测试环境则没有必要,不过为了使部署步骤和生产环境部署一样,我们还是在测试环境保存以前的数据,以便部署步骤尽量一样。对于生产环境,下面列出了一些需要follow的步骤:(忽略app_offline.htm步骤):

    从生产环境将School-Prod.sdf下载下来,放到Visual Studio项目的App_Data目录

    手工改变schema更新,手工更新数据

    重新上传School-Prod.sdf到生产环境

    部署项目

(除了手工上传的方式,也可以使用和项目一起部署的方式,但是需要在项目属性里设置部署的时候将这个数据库也一起部署了(membership数据库除外),手工方式的好处是不用修改任何设置,依然可以使用之前的one-click发布设置。)

 

应用Schema修改

部署到册数环境,你不必担心是否能获得最新的copy,可以更新项目里下载下来的School-Prod.sdf来用。

看看Entity Framework里为School数据库做的修改,你可以手工修改测试环境和生产环境数据库。在Solution Explorer里双击App_DataSchool.sdf在Server Explorer里打开数据库连接。

在Server Explorer里展开School-Dev.sdf,展开Tables-> Person->Columns。你可以看到Code First 生产的BirthDate列:

 

技术分享

在Properties窗口,你可以看到BirthDate列的数据类型是datetime, 名称和数据类型是唯一需要修改的。

 

技术分享

在Server Explorer里,右键School-Dev.sdf数据库然后选择关闭连接Close Connection。

(这只是数据库更新的简单例子,在真实环境里,数据库修改很麻烦的。本章的重点不是修改或跟踪数据库变化,而是数据库改变怎么影响数据库部署过程。普通的步骤就是:数据模型改变以后数据库需要怎么改变,以及Code First怎么自动更新数据库的,然后再用手工方式去做。)

下一步是手工修改School-Prod.sdf文件

在Server Explorer里,展开School-Prod.sdf->Tables->Person->Columns,然后你可以看到老的表结构(没有BirthDate列)。

右键Person选择Edit Table Schema显示Edit Table对话框。

 

技术分享

在Edit Table对话框,在Discriminator下面添加一个新列,输入如下信息:

    Column Name: BirthDate     Data Type: datetime           

 

技术分享

 

技术分享

Length, Allow Nulls, Unique和Primary Key的默认值都没问题。点击OK。

数据库和新代码能够很好的一起运行了,但是BirthDate 列在测试数据库(后面的生产环境数据库)的位置和在Entity Framework Code First 里的位置是不一样的,因为Visual Studio tool for SQL Server Compact 只支持在最下面添加新列。其实,说实话只是顺序不一样而已,没有什么大的问题。

在数据库方面,Visual Studio tool for SQL Server Compact 可能还会有其他的一些限制不能和Code First.的自动生产功能一样,你可以通过如下的方式来改进:

  • 使用WebMatrix的数据库操作功能,比Visual Studio 下的SQL Server Compact 的工具功能多。
  • 使用第三方或者开源工具,例如CodePlex 上的SQL Server Compact Toolbox 和 SQL Compact data and schema script utility。
  • 自己写DDL(数据定义语言)脚本来维护数据库结构。
  • 迁移至SQL Server Express或完整版SQL Server以后,可是使用SQL Server Management Studio,使用完整的数据库维护功能,也可以使用Visual Studio 2010 SQL Server database projects 或者 Database Publishing Wizard 来自动生产脚本(可能还有其它的原因迁移至SQL Server,请看第2章节里的叙述)。
  • 使用Entity Framework Code First Migrations,自动更新新的数据库以匹配新的数据模型。本章节撰写之前,该工具还没用Release,不过可是使用NuGet来安装预览器,请参看Entity Framework team blog。
  •  

    更新数据

    测试数据库的结果和新代码吻合了,但是你需要添加instructor 们的生日进去,你可以手工创建并执行一个SQL脚本。本章节已经帮你创建了这个脚本,你可以运行它。

    Server Explorer里, 右键School-Prod.sdf库的Person表,选择New Query。

     

    技术分享

    如果出现Add Table对话框的话,关闭它,然后将下面的SQL脚本复制到查询窗口的SQL窗格里:

    UPDATE Person SET BirthDate = ‘1918-08-12‘ WHERE PersonID = 9;
    UPDATE Person SET BirthDate = ‘1960-03-15‘ WHERE PersonID = 10;
    UPDATE Person SET BirthDate = ‘1970-01-11‘ WHERE PersonID = 11;
    UPDATE Person SET BirthDate = ‘1975-04-11‘ WHERE PersonID = 12;
    UPDATE Person SET BirthDate = ‘1957-10-12‘ WHERE PersonID = 13;

    技术分享

    右键SQL窗格,选择Execute SQL。

     

    技术分享

    如果出现Query Definitions Differ对话框,点击Continue继续。该消息只是告诉你查询代码不能直观里表示在SQL窗格上面UI及时显示界面上。

     

    技术分享

    查询运行了,然后弹出了5条数据被更新的确认窗口。

     

    技术分享

    Server Explorer里,重新右键Person选择Show Table Data检查instructors是否都有了生日数据。

     

    技术分享

    测试数据库现在可以部署了。

    复制数据库到测试站点

    在Windows Explorer资源管理器里,将ContosoUniversity项目的App_Data文件夹里的School-Prod.sdf文件复制到测试站点的App_Data目录(C:inetpubwwwrootcontosouniversityApp_Data),覆盖原来的数据库文件。

     

    和数据库更新一起部署更新代码

    可以部署更新的代码了, Solution Configurations下来菜单里选择Test, Publish profile 里也选择Test。点击Publish Web。(如果由于自定义了工具栏操作不了的话,参考:第8章节的内容)。

     

    技术分享

    Visual Studio部署了修改后的程序,并在Output窗口显示了成功信息。

     

    技术分享

    运行程序http://localhost/contosouniversity来验证更新是否成功部署,在Instructors 页面可以看到真实的birth date了。

     

    技术分享

    也可以运行Students页面 和Add Students页面来验证更新是否成功。

    4.  部署数据库更新到生产环境

    现在可以部署到生产环境了。除了需要先上传app_offline.htm文件防止用户使用站点以外,其它步骤和部署测试环境是一样的。生产环境部署的步骤如下:

  • 上传app_offline.htm文件到生产环境站点
  • 从生产环境站点下载School-Prod.sdf文件保存到本机的App_Data文件夹,然后再备份一份(见下面的注释)。
  • 手工添加新列
  • 运行更新脚本(具体更新数据视真实环境需要而定)
  • 上传School-Prod.sdf文件到生产环境站点
  • 使用Visual Studio发布
  • 注释:数据库备份的话题就不多说了,肯定是需要经常备份的,这里指的是School-Prod.sdf 和aspnet-Prod.sdf文件。

    最后一步和部署code-only 更新是一样的。在Solution Configurations下拉菜单里选择Release,在Publish profile下拉菜单里选择Production,然后点击Publish Web。

     

    技术分享

    Visual Studio部署了修改后的程序,并在Output窗口显示了成功信息。

     

    技术分享

    验证是否正确部署之前,需要先删除app_offline.htm文件,删除以后,就可以运行站点来验证部署是否正常了。

     

    技术分享

    现在,你已经成功将包含数据库更新的应用程序部署到测试环境和生产环境了。下一章节讲的是如何将SQL Server Compact数据库迁移到SQL Server Express 或者完整版SQL Server上。

    版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

    微软ASP.NET站点部署指南(9):部署数据库更新

    标签:数据库   asp.net   

    热心网友 时间:2022-04-08 04:12

    1、保证你使用的数据库是sqlserver
    2、试试不用参数传递是否能通过
    3、保证你的表参数与你参数传递过程中的参数类型一致,包括表字段的长度。

    热心网友 时间:2022-04-08 05:30

    public void Insert(ProctNewInfo info)
    {
    SqlParameter[] parameters = {
    new SqlParameter("@name", SqlDbType.VarChar,150),
    new SqlParameter("@proctType", SqlDbType.Int,4),
    new SqlParameter("@shortIntroction", SqlDbType.VarChar,200),
    new SqlParameter("@imageSmall", SqlDbType.VarChar,200),
    new SqlParameter("@imageBig", SqlDbType.VarChar,200),
    new SqlParameter("@lastEditDateTime", SqlDbType.DateTime),
    new SqlParameter("@tabIntroction", SqlDbType.Text),
    new SqlParameter("@tabHighLights", SqlDbType.Text),
    new SqlParameter("@tabScreenShots", SqlDbType.Text),
    new SqlParameter("@tabReportsManager", SqlDbType.Text),
    new SqlParameter("@tabCompare", SqlDbType.Text),
    new SqlParameter("@tabModelsAndPrices", SqlDbType.Text),
    new SqlParameter("@isDel", SqlDbType.Int,4),
    new SqlParameter("@topOrder", SqlDbType.Int,4),
    new SqlParameter("@clickCount", SqlDbType.Int,4),
    new SqlParameter("@price", SqlDbType.Money)};
    parameters[0].Value = info.Name;
    parameters[1].Value = info.ProctType.Id;
    parameters[2].Value = info.ShortIntroction;
    parameters[3].Value = info.ImageSmall;
    parameters[4].Value = info.ImageBig;
    parameters[5].Value = info.LastEditDateTime;
    parameters[6].Value = info.Introction.ToString();
    parameters[7].Value = info.HighLights.ToString();
    parameters[8].Value = info.ScreenShots.ToString();
    parameters[9].Value = info.ReportManager.ToString();
    parameters[10].Value = info.Compare.ToString();
    parameters[11].Value = info.ModelsAndPrices.ToString();
    parameters[12].Value = info.IsDel;
    parameters[13].Value = info.TopOrder;
    parameters[14].Value = info.ClickCount;
    parameters[15].Value = info.Price;

    DbHelperSQL.ExecuteSql(_INSERT_SQL, parameters);
    }

    使用类似这样的方法去添加参数试试看。

    热心网友 时间:2022-04-08 07:05

    你试试把创建及赋值Parameters参数的顺序改成跟sql语句中出现的顺序一样能不能解决问题

    热心网友 时间:2022-04-08 08:56

    ok 了吗
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 学法语要多长时间 零基础学习法语需要多久呢?费用大概是多少? 法语c1要学多长时间 学习法语的500课时大约需要多少时间? 上法语联盟学习班多少钱学习多长时间 一年的时间法语能从零基础达到B2吗?每天要学多长时间呢? 武汉欧洲之星:现在学法语需要多久? 学法语,从零基础开始,直到可以日常交谈,大约需要多长时间? (每天只能花一小部分时间) 华为云里面购买怎么样加入清单? 深圳市给排水标准 急:EXCEL中如何找出两列相同或相似的数据并分别标示出来: 清华大学深圳校区和上海的哪个大学属于一种档次? 深圳市观星网络服务有限公司怎么样? 彼岸译云是做什么的? EXCEL中如何使输入的数据与里面的数据重复的会自动标记出来 摩尔图像科技(深圳)有限公司怎么样? 深圳创蔚联科技有限公司怎么样? 为什么广东省做数据统计公布都会标注深圳、珠海除外?难道这两个市就不属于广东省吗?为何独立统计? 怎么取消苹果的用户相关联,一来电话iPad上都有显示,求解怎么让iPad不接受任何短信电话 我的iPad和iPhone使用同一个AppleID iMessage会同时收到 怎么不让iPad收 多久能够法语入门,学一年法语国际法语培训 学法语大概得几年? 法语要学多久才能够正常交流 学习法语要多长时间(能基本听懂会说)? 法语学多长时间才能学会?有什么好的学习法语的软件吗?推荐下 谢谢 学法语最短多长时间 学习法语大概要多久才能熟练掌握,一个暑假的时间可以达到什么程度,哪里可以学? 太子蟹好吃还是面包蟹好吃 学法语需要多少时间可以掌握? 想要把法语从零基础学到考B1,要多久 台式电脑本地连接没有怎样恢复?我在网上下载了一个操作系统后自己电脑的本地连接就没了怎么办? 残疾学生补助申请理由怎么写? ps的溅水效果怎么做的? PS流动飘逸水效果如何制作 ps水制作 各位PS大大帮我一下 怎么用PS给连衣裙做出飘逸的效果 百事这些广告用什么软件做的? 用什么样马桶才能不溅水?快崩溃了,那么贵的马桶,居然还会溅水!! 潜水艇的马桶会溅水吗?