添加新记录时,Visual Studio SQL 默认值未显示在 Windows 窗体上

Posted

技术标签:

【中文标题】添加新记录时,Visual Studio SQL 默认值未显示在 Windows 窗体上【英文标题】:Visual studio SQL default value not showing on windows form when adding new record 【发布时间】:2018-06-16 07:56:17 【问题描述】:

我在 Visual Studio 中创建了一个 SQL 表,并为字段设置了默认值。

该表已连接到我的 C# 项目(在同一解决方案中)并且可以正常运行,但是通过 Windows 窗体创建新行时不会出现默认值。

来自评论问题的信息:

当我单击新行的 + 时,它不会出现在表单上。 当从数据库中添加一行时,默认值就在那里。 通过表单添加了一个新行,将默认值的字段留空,保存,重新打开并且没有默认值。

【问题讨论】:

您的意思是保存时没有在数据库中设置默认值,还是保存前没有出现在表单应用程序中? @SBFrancies 当我单击新行的 + 时,它不会出现在表单上 如果您在没有为该列指定值的情况下进行插入,则默认值将出现在数据库中。如果您想以我认为您必须在代码中手动设置的形式自动设置它。 在表单上新建一行时不能自动拉到文本框中吗? @Matt 您可以通过编程方式添加它,但 SQL Server 中使用的默认值选项是在此列中没有提供值时分配一个值 【参考方案1】:

基于此W3Schools Tutorials

如果没有指定其他值,默认值将添加到所有新记录中。

因此,在将行保存到数据库之前,默认值不会显示,您可以通过编程方式添加它,但如果此列中没有提供值,则使用默认值约束来分配值

您可以save these default values in the application Settings 并在添加新行时使用它

textBox1.Text = Properties.Settings.Default.TextBoxDefaultValue;

如果您在 Visual Studio 中定义默认值时遇到问题,请尝试使用 SQL 查询添加默认约束:

ALTER TABLE XXX 
ADD CONSTRAINT def_Retired
DEFAULT 'N' FOR Retired;

更新 1

在表单设计器上,单击 BindingNavigator,在“属性”窗口中将 AddNewItem 属性设置为 (none)

尝试将以下代码添加到bindingNavigatorAddNewItem_Click 事件中

private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e) 

 vehiclesBindingSource.AddNew();
 Textbox1.Text = Properties.Settings.Default.Text1default;

;

【讨论】:

我在一个类似的表单上收到一个错误,当我单击添加新的时,员工 ID 不能为空。它也没有xxsource.EndEdit(); 对employeeID有什么限制?记得做这一步On the form designer, click on the BindingNavigator, In the Properties window set the AddNewItem property to (none) 这是我错过的步骤 :) 我要把它写下来!【参考方案2】:

当我点击新行的 + 时,它不会出现在表单上。

DataGridView 对数据库表中的默认值一无所知。因此,您必须在specifyDataGridView 中使用默认值。

或者如果您使用数据绑定,您可以在DataTable 中设置specify 默认值。

当从数据库中添加一行时,默认值就在那里。

没错,因为在数据库中它们是设置好的。

通过表单添加了一个新行,将默认值的字段留空,保存,重新打开并且没有默认值。

如果你以如下方式向数据库中插入数据:

insert into SomeTable ('Retired') values ('');

那么将不使用默认值。很有可能我可以假设目前您从 DataGridView 传递空值,如果它们没有设置的话。这是错误的!

如果你以如下方式向数据库中插入数据:

insert into SomeTable ('Last Mileage') values (0);

然后将使用Retired 列的默认值。应该是这样的。

因此,您必须正确设计Insert 语句,完全省略那些应该在数据库本身中使用默认值的列。


总结。您要么必须在DataGridView/DataTable 中填写默认值,要么动态构造Insert 语句,完全省略未指定的值。

【讨论】:

【参考方案3】:

您在动态生成的表单中分配默认值。您可能需要评估您的客户端/服务器端脚本的组件是否也可以同时适应这种动态行为。

【讨论】:

【参考方案4】:

默认约束仅当您未在插入列表中指定列时才有效。

假设我有一张这样的桌子

CREATE TABLE MyInfo
(
    Id INT IDENTITY(1,1),
    Nm VARCHAR(50),
    MyDate DATE DEFAULT(GETDATE())
)

我正在指定这样的值

INSERT INTO MyInfo
(
    Nm,
    MyDate
)
SELECT
    Nm = 'A',
    MyDate = '02/23/93'
UNION
SELECT
    Nm = 'B',
    MyDate = NULL

结果会是这样的

现在我插入一行而不指定MyDate

INSERT INTO MyInfo
(
    Nm
)
VALUES('C')

MyDate 填充了默认值

默认约束旨在在插入列表中未指定列的情况下分配值。如果您需要在插入的值为 NULL 或为空的情况下设置默认值,请尝试使用触发器

【讨论】:

以上是关于添加新记录时,Visual Studio SQL 默认值未显示在 Windows 窗体上的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2013与数据库的连接错误

如何防止 Visual Studio 2010 在 C++ 中向我的项目添加大型 SQL 文件?

将数据从 c#form (visual studio) 添加到 mysql 数据库,并且需要重新检索新的记录 ID 以形成

C# Visual Studio - 将 SQL 表数据输出到 Datagridview

如何在 Visual Studio 中从 SQL 脚本创建数据库并将其添加到项目中?

sql71501 sql 参数未解决对内置类型 Visual Studio 2012 DB 项目的引用