使用C#SQL Reader从SQL Server表检索datetime值

使用C#SQL Reader从SQL Server表检索datetime值,c#,sql,sql-server,datetime,C#,Sql,Sql Server,Datetime,我正在查询SQL Server表以获取表中数据类型为datetime的值 数据库中的项目如下:2014-05-17 23:52:09.333 以下代码引发此异常: 无法将“System.DateTime”类型的对象强制转换为“System.String”类型 代码: 内部列表CustomSqlQuery(stringdbname、stringdbtable、stringdbcolumn、stringquery、stringconnstring) { var databaseItems=新列表()

我正在查询SQL Server表以获取表中数据类型为
datetime
的值

数据库中的项目如下:
2014-05-17 23:52:09.333

以下代码引发此异常:

无法将“System.DateTime”类型的对象强制转换为“System.String”类型

代码:

内部列表CustomSqlQuery(stringdbname、stringdbtable、stringdbcolumn、stringquery、stringconnstring)
{
var databaseItems=新列表();
var conn=新的SqlConnection(connString);
var cmd=新的SqlCommand(查询,连接);
尝试
{
使用(cmd)
{
conn.Open();
var reader=cmd.ExecuteReader();
if(reader.HasRows)
{
while(reader.Read())
{
//在下一行引发异常
//无法将“System.DateTime”类型的对象强制转换为“System.String”类型。
var item=reader.GetString(reader.GetOrdinal(dbColumn));
数据库项。添加(项);
}
}
}
康涅狄格州关闭();
}
捕获(异常)
{
Logger.Log(Loglevel.Error,“Boom:{0}”,exception.Message);
返回null;
}
返回数据库项;
}

如何将
datetime
转换为字符串?

该列被键入为datetime,因此必须使用
GetDateTime
方法调用检索它

如果希望将所有值检索为
string
,无论数据库中的正确类型是什么,都可以使用
GetValue
ToString
方法调用:

var item = reader.GetValue(reader.GetOrdinal(dbColumn)).ToString();
但是,您应该知道,当其中一个值为
null
时,它可能会引发异常。要避免这种情况,请使用以下方法:

var value = reader.GetValue(reader.GetOrdinal(dbColumn));
var item = value == null ? string.Empty : value.ToString();

该列被键入为datetime,因此必须使用
GetDateTime
方法调用检索它

如果希望将所有值检索为
string
,无论数据库中的正确类型是什么,都可以使用
GetValue
ToString
方法调用:

var item = reader.GetValue(reader.GetOrdinal(dbColumn)).ToString();
但是,您应该知道,当其中一个值为
null
时,它可能会引发异常。要避免这种情况,请使用以下方法:

var value = reader.GetValue(reader.GetOrdinal(dbColumn));
var item = value == null ? string.Empty : value.ToString();

此代码在基本级别上被破坏。它迫使您以易受sql注入攻击的方式构建查询。@Joel如何使此示例不易受sql注入攻击?只是一些事情吗?我会读一读,看看怎么做。很难知道从哪里开始。无论如何,这是个坏主意,但至少返回一个对象列表,因为此函数不知道数据的类型。为避免安全问题,该函数还需要请求包含参数信息的集合,以便您可以构建参数化查询。表名不能是参数。当您真正完成了这样的安全保护时,您可能已经说了一些东西,并且只使用了linq。它迫使您以易受sql注入攻击的方式构建查询。@Joel如何使此示例不易受sql注入攻击?只是一些事情吗?我会读一读,看看怎么做。很难知道从哪里开始。无论如何,这是个坏主意,但至少返回一个对象列表,因为此函数不知道数据的类型。为避免安全问题,该函数还需要请求包含参数信息的集合,以便您可以构建参数化查询。表名不能是参数。当您真正保护完这样的内容时,您可能已经说了一些东西,然后使用linq。如果这是一个解决方案,那么您需要将函数名更改为CustomSqlQueryAtonlyDealSwitDateColumn使用
GetValue
可以处理所有类型,并返回值的字符串表示形式。顶部的Saw GetDateTime没有注意到GetValue。当然,以字符串形式返回日期会给我带来麻烦……如果这是一个解决方案,那么您需要将函数名更改为CustomSqlQueryAtonlyDealSwithDateColumnUsing
GetValue
将允许您处理所有类型,并返回值的字符串表示形式。顶部的Saw GetDateTime没有注意到GetValue。以字符串形式返回日期的课程给了我高跟鞋。。。