";将varchar值转换为int“”时转换失败;尝试按日期筛选表时
本文关键字:转换 失败 日期 筛选 varchar quot int | 更新日期: 2023-09-27 17:59:56
我想从C#中ASP.NET中的数据库中进行一个简单的选择。我在aspx页面上有一个SqlDataSource
,我有一个名为Eventmsgs
的表,其中有3列——id (int), Msg (Varchar(max)), date (Varchar(max))
,其中包含每天的事件。
我只想选择今天的消息。这是我的代码:
String date = System.DateTime.Now.Date.ToShortDateString();
SqlDataSource1.SelectCommand = "SELECT * FROM EventMsgs WHERE Date="+date;
DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
但是当我调用Select
方法时,我会得到以下错误:
将varchar值"4/25/2014"转换为时转换失败数据类型int
但为什么要将其转换为int
?
尝试用单引号('4/25/2014'
)包装date
值,如下所示:
SqlDataSource1.SelectCommand
= String.Format("SELECT * FROM EventMsgs WHERE Date='{0}'",date);
无论何时在SQL中比较不同类型的两个值,服务器都必须首先转换其中一个。那么你比较的两种类型是什么?
在左侧,您的Date
列的类型显然是varchar(max)
。然而,在右边,你得到了值4/25/2014
,它是4,除以25,除以2014,一个值为0
的int
。
因此,当服务器尝试进行比较时,它会尝试将左侧(字符串)转换为整数,但无法这样做,因为它不是整数。
你的问题是字符串文字必须被引用,同样的事情也适用于例如日期。如果你使用了不同的日期格式或任何其他字符串,你会得到一个语法错误,这会使错误更清楚——事实上,US格式实际上是一个可解析的表达式(尽管它总是会导致0
)。因此,为了实现这一点,您必须在文本/日期值周围使用引号,例如'4/25/2014'
。
无论如何,你所做的在很多层面上都是错误的:
- 您不应该使用
varchar
列来存储日期。更不用说varchar(max)
了。这就是datetime
和date
的作用——使用正确的数据类型。这一点很重要,原因有很多-您可以获得正确的排序、比较,还可以获得日期函数(dateadd
、datepart
…)的支持。更不用说它节省了一点空间。你保存了一个日期值,这也意味着,如果你传递了一个不是有效日期的东西,你会在插入时受到折磨,而不是在以后处理不正确的数据时——尽快发现错误要容易得多 - 您不应该像这样将值传递到SQL查询中。相反,您应该始终使用参数-
select * from EventMsgs where Date = @Date;
。您只需将参数添加为原始DateTime
值,.NET(和SQL服务器)将自行处理传递,从而避免SQL注入开口和许多其他问题(例如,如果您与将日期解释为dd/MM/yyy
而不是MM/dd/yyyy
的SQL服务器交谈,则会出现非常"有趣"的错误) - 通常,除非需要,否则您不希望执行自定义SQL查询。为什么不使用类似于ORM的EntityFramework或LINQ2SQL来简化您的工作呢
传递参数的正确方式的示例代码如下所示:
SqlDataSource1.SelectCommand = "select * from [EventMsgs] where [Date] = @Date;";
SqlDataSource1.SelectParameters.Add("@Date", DateTime.Today);