【问题标题】:Set date and time in stored procedure在存储过程中设置日期和时间
【发布时间】:2016-09-28 15:03:33
【问题描述】:

我目前在使用 C# asp.net 打印输出时遇到问题。我已经构建了一个存储过程,其中包含一个查询,如果用户尝试登录网站的登录日期和时间介于特定的开始时间和结束时间之间,则该查询将选择用户名。所以这是我使用 sql server 的代码:

CREATE PROCEDURE [dbo].[access]
    (@DateNow as varchar(50),  
     @studentnum as varchar(50)
    )
AS
IF EXISTS(SELECT StudentNum 
          FROM users, enlistment 
          WHERE StudentNum LIKE '13%' 
          AND @DateNow BETWEEN '2016-09-28 00:00:00.000' AND endtime)
    SELECT username FROM users, enlistment 
    WHERE StudentNum LIKE '13' + @studentnum 
    AND @DateNow BETWEEN starttime AND endtime

这是我在 C# 中的代码

SqlCommand cmd3 = new SqlCommand("access", connection); 
SqlParameter useraccess = new SqlParameter("studentnum", fourNum);
string datenow = DateTime.Now.ToString("MMMM dd yyyy hh:mm");
SqlParameter date = new SqlParameter("DateNow", datenow);

cmd3.Parameters.Add(useraccess);
cmd3.Parameters.Add(date);
cmd3.CommandType = CommandType.StoredProcedure;
lblStatus.Text = Convert.ToString(cmd3.ExecuteScalar());

执行后,lblStatus.Text 应该显示尝试登录的人的用户名。不幸的是,该网站没有显示它。我的代码有问题吗?

【问题讨论】:

  • "set nocount on" 应该是存储过程中的第一个命令
  • 使用最合适的数据类型 - 永远!不要将varchar(50) 用于显然 日期(或日期和时间)的参数@DateNow - 请改用DATEDATETIME2(n)
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(20 多年前),不鼓励使用它
  • 当 if exists() 返回 false 时,该过程也不返回任何内容
  • 当你使用它来填充DataTable时,为什么要再次执行该命令?要么从DataTable 中提取结果,要么在不需要时根本不填写DataTable

标签: c# asp.net sql-server date time


【解决方案1】:

这是对您使用 Date 的修复,而不是回答您为什么没有得到预期结果的答案。

始终在 .net 和 sql server 中使用本机数据类型,从不使用该类型的字符串表示形式!

更改了 sp 签名

CREATE PROCEDURE [dbo].[access]
    (@DateNow as Date,  -- change this to Date or DateTime or DateTime2 accordingly
     @studentnum as varchar(50)
    )
-- rest of stored proc does not have to change

更改了 c# 代码

SqlParameter date = new SqlParameter("@DateNow", SqlDbType.Date) {Value = System.DateTime.Now.Date};
// or with time
// SqlParameter date = new SqlParameter("@DateNow", SqlDbType.DateTime) {Value = System.DateTime.Now};

【讨论】:

  • 你好!这是“2016 年 9 月 29 日晚上 11:31”的格式吗?
  • @Briana - DateTime 类型没有format。它们是结构。格式应该只适用于表示层(在您的用户想要直观地“看到”日期/时间的时候)。在您的数据库中,starttimeendtime 的类型也应该是 DateDateTimeDateTime2(不是 varchar)。
  • 非常感谢!
  • @Briana - 如果这确实解决了您的问题,请考虑接受答案(请参阅How to accept SO answers)。
猜你喜欢
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
相关资源
最近更新 更多