Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server VB SQL Server忽略默认值_Sql Server_Vb.net - Fatal编程技术网

Sql server VB SQL Server忽略默认值

Sql server VB SQL Server忽略默认值,sql-server,vb.net,Sql Server,Vb.net,我正在使用一些简单的vb代码记录用户登录到我的程序。其思想是服务器使用默认值自动用正确的时间/日期填充时间/日期列。我知道我可以从客户端计算机检索这两个,但这取决于他们的设备是否设置为正确的时区。当我使用下面的代码时,我似乎无法让服务器使用默认值。我的两个专栏似乎都使用00:00:00表示时间,1900:01:01表示日期。但是,当我使用MicrosoftSQLServerManagementStudio输入假数据时,它会将默认值更正为当前时间和日期 con.open() cmd = New S

我正在使用一些简单的vb代码记录用户登录到我的程序。其思想是服务器使用默认值自动用正确的时间/日期填充时间/日期列。我知道我可以从客户端计算机检索这两个,但这取决于他们的设备是否设置为正确的时区。当我使用下面的代码时,我似乎无法让服务器使用默认值。我的两个专栏似乎都使用00:00:00表示时间,1900:01:01表示日期。但是,当我使用MicrosoftSQLServerManagementStudio输入假数据时,它会将默认值更正为当前时间和日期

con.open()
cmd = New SqlCommand("INSERT INTO Account_Login_Log VALUES (@memberID, @accountID, @logintime, @logindate)", con)
cmd.Parameters.AddWithValue("@memberID", "32")
cmd.Parameters.AddWithValue("@accountID", "91")
cmd.Parameters.AddWithValue("@logintime", "")
cmd.Parameters.AddWithValue("@logindate", "")

cmd.ExecuteNonQuery()
con.close()
我的问题是,为什么我的代码不能在服务器端自动默认为正确的时间和日期

我试过:

从insert语句中省略列,使用dbNULL.value,并简单地指定,正如我在上面的代码中所示。但所有的一切都要从时间的开始说起

编辑-我已将完整的表定义包含在下面

USE [Atlas]
GO

/****** Object:  Table [dbo].[Account_Login_Log]    Script Date: 26/01/2015 8:34:21 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Account_Login_Log](
    [lLogID] [int] IDENTITY(10,1) NOT NULL,
    [lMember_ID] [int] NOT NULL,
    [lAccount_ID] [int] NOT NULL,
    [lLogin_Time] [time](7) NOT NULL CONSTRAINT [DF_Account_Login_Log_lLogin_Time]  DEFAULT (CONVERT([varchar](8),getdate(),(108))),
    [lLogin_Date] [date] NOT NULL CONSTRAINT [DF_Account_Login_Log_lLogin_Date]  DEFAULT (getdate()),
 CONSTRAINT [PK_Account_Login_Log] PRIMARY KEY CLUSTERED 
(
    [lLogID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Account_Login_Log]  WITH CHECK ADD  CONSTRAINT [FK_Account_Login_Log_Account1] FOREIGN KEY([lAccount_ID])
REFERENCES [dbo].[Account] ([aAccount_ID])
GO

ALTER TABLE [dbo].[Account_Login_Log] CHECK CONSTRAINT [FK_Account_Login_Log_Account1]
GO

ALTER TABLE [dbo].[Account_Login_Log]  WITH CHECK ADD  CONSTRAINT [FK_Account_Login_Log_Member_Details] FOREIGN KEY([lMember_ID])
REFERENCES [dbo].[Member_Details] ([mMember_ID])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[Account_Login_Log] CHECK CONSTRAINT [FK_Account_Login_Log_Member_Details]
GO
编辑-我已经证明了我的列的默认值为getdate,而lLogin_时间为CONVERT[varchar]8,getdate,108

注入攻击注意:我的代码没有从用户那里获取任何值,所有这些都是根据程序和数据库值计算的,所以我不担心注入攻击

你觉得为什么

INSERT INTO Account_Login_Log (lMember_ID, lAccount_ID, lLogin_Time, lLogin_Date)  VALUES (@memberID, @accountID, @logintime, @logindate)
是否将使用默认值

如果为表设置了默认值,请改为:

INSERT INTO Account_Login_Log (lMember_ID, lAccount_ID) VALUES (@memberID, @accountID)
因为您将值传递给insert语句,所以它使用这些值而不是默认值

查询管理器工作方式不同的原因是,当您使用C平台时,它会将您发送的内容转换为正确的时间和日期类型,然后将值发送到所使用的服务器。

将代码更改为

    Dim cmd = new SqlCommand("INSERT INTO Account_Login_Log " & _ 
                             "(lMember_ID, lAccount_ID) " & 
                             "VALUES (@memberID, @accountID)", cnn)
    cmd.Parameters.AddWithValue("@memberID", 32)
    cmd.Parameters.AddWithValue("@accountID", 91)
    cmd.ExecuteNonQuery()
要添加WithValue,应传递正确的数据类型。如果列需要字符串,则应传递字符串;如果列需要int,则传递int,而不是字符串。此外,INSERT不需要为具有默认值的列传递值。如果您没有传递任何内容,将使用默认值。最后,INSERT语法要求,如果没有为所有字段名传递参数,则需要指定受查询影响的列。因此,您需要添加更新的两列的名称


我最终删除了表,并在一列中使用datetime重新创建了它。我仍然不清楚为什么服务器默认设置为日历的开始,唯一合乎逻辑的是VB向列发送了某种数据,它默认设置为开始,而不是当前的日期时间。我已经包括了我的新表和它的代码,以防将来有人偶然发现相同的问题,尽管我怀疑有人会这样做

VB代码:

新数据库表:


当我这样做的时候,我的问题就解决了。谢谢大家的帮助。

嗨,霍根,这是我自己想的。但是,省略您所说的列仍然会导致将“时间开始”设置为值。在定义表时的默认值字段中,将getdate设置为当前时间作为默认值。@Jeremy我知道看起来我没有这样做,但我已经这样做了。正如我所说,当我使用MS Management Studio输入数据时,它会工作。但由于某些原因,通过vb执行此操作仍然会将默认的时间和日期列恢复为其最早的可用值。空字符串不是零。您真的不必在选择列表中指定该列。INSERT语句中只列出了两列,它仍然是默认值?能否在上面的代码中添加表的架构定义,即Sql Server Management Studio,右键单击表,选择脚本表为…@Steve请查看我的编辑,我已经包括了你的问题。史蒂夫,这和我的答案完全一样。完全没有。您错过了queryhmm中的字段名。。。我认为如果您按照我在LinqPad中测试过的模式和代码的顺序添加所有需要的字段,并且如果您不输入字段名,那么它们是可选的。提供的值的列名或数目与表定义不匹配。正确的字段名就位后,插入将按预期进行,缺少的值将使用默认值。顺便说一下,没有必需字段名的相同查询在SSMS中也会失败,但有相同的异常。
        con.open()
        cmd = New SqlCommand("INSERT INTO Account_Login_Logger (lAccount_ID) VALUES (@accountid)", con)
        cmd.Parameters.AddWithValue("@accountid", 91)
        cmd.ExecuteNonQuery()
        con.close()
 USE [Atlas]
GO

/****** Object:  Table [dbo].[Account_Login_Logger]    Script Date: 27/01/2015 3:37:20 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Account_Login_Logger](
    [lLogin_ID] [int] IDENTITY(10,1) NOT NULL,
    [lAccount_ID] [int] NOT NULL,
    [lDate_Time_Stamp] [datetime] NOT NULL CONSTRAINT [DF_Account_Login_Logger_lDate_Time_Stamp]  DEFAULT (getdate()),
 CONSTRAINT [PK__Account___0B8A2E93BF56F461] PRIMARY KEY CLUSTERED 
(
    [lLogin_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO