Linq“无法将类型为'System.DateTime'的对象转换为类型'System.String'”错误

3

我将使用linq从数据库中提取一些信息。

SQL脚本:

    TYPE CURS IS REF CURSOR;

    CREATE OR REPLACE
    PROCEDURE PROCEDURE_NAME (
        Cursor1 OUT CURS)
    AS
    BEGIN
        OPEN Cursor1 FOR
            SELECT NO, TITLE, TO_CHAR(STARTDATE) STARTDATE
            FROM TABLE_1;
    END;

Linq 代码:

    var query = from e in getItem().AsEnumerable()
                select new {
                    No = e.Field<string>("NO"),
                    Title = e.Field<string>("TITLE"),
                    StartDate = e.Field<string>("STARTDATE")
                };

    return query.Select(e => new ClassA()
    {
        No = e.No,
        Title = e.Title,
        StartDate = e.StartDate
    }).ToList<ClassA>();

类 A:

    public class ClassA {
        public string No { get; set; }
        public string Title { get; set; }
        public string StartDate { get; set; }
    }

getItem():

    public DataTable getItem() {
        OracleDataAdapter da = new OracleDataAdapter();
        DataSet ds = new DataSet();
        OracleCommand cmd = new OracleCommand();

        cmd.CommandText = "PROCEDURE_NAME";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("Cursor1", OracleDbType.RefCursor).Direction = ParameterDirection.Output;

        da.SelectCommand = cmd;
        da.Fill(ds);

        return ds.Tables[0];
    }

但是查询总是返回错误:无法将类型为'System.DateTime'的对象强制转换为类型'System.String',但我已经检查过STARTDATE被提取为System.String。如何解决这个问题?这让我很困扰。
[更新] 现在它可以工作了,我将所有的STARTDATE数据类型都改为DateTime,并且在不进行转换的情况下从数据库中提取它。
但是,我仍然不明白为什么会出现错误。

仍然出现相同的错误提示。 - noobie
1
TO_CHAR 是 Oracle 的一个方法,返回一个 VARCHAR2:http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions180.htm - Ben Reich
4
也许在GetItem()函数内部有一些转换将其转回为DATETIME类型?不确定为什么会这样,但我没有在您发布的代码中看到其他问题。 - Tim
1
将你的 SQL 中的字段名更改为 STARTDATE2,并相应地在代码中进行更改,看看会发生什么。 - Eren Ersönmez
@noobie 请在答案中包含您的“更新”,这样您的问题就会有正式的答案。 - bot
显示剩余11条评论
2个回答

0
在存储过程中,移除函数 TO_CHAR。该函数将把日期时间列转换为 varchar2 列。
TYPE CURS IS REF CURSOR;

CREATE OR REPLACE
PROCEDURE PROCEDURE_NAME (
    Cursor1 OUT CURS)
AS
BEGIN
    OPEN Cursor1 FOR
        SELECT NO, TITLE, STARTDATE
        FROM TABLE_1;
END;

0
为了正式回答这个问题,我会在这里发布所有者的回答。(如果所有者在这里包括他的答案,我会删除这个)。
[更新]
现在它能够工作了,我将STARTDATE的所有数据类型更改为DateTime,并直接从数据库中提取,无需转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接