【发布时间】: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- 请改用DATE或DATETIME2(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