C# 林奇;无法强制转换类型为';System.DateTime';输入';System.String'&引用;错误

C# 林奇;无法强制转换类型为';System.DateTime';输入';System.String'&引用;错误,c#,linq,oracle,C#,Linq,Oracle,我正在使用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

我正在使用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;
    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>();
    public class ClassA {
        public string No { get; set; }
        public string Title { get; set; }
        public string StartDate { get; set; }
    }
    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];
    }
Linq代码:

    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;
    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>();
    public class ClassA {
        public string No { get; set; }
        public string Title { get; set; }
        public string StartDate { get; set; }
    }
    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];
    }
getItem():

    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;
    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>();
    public class ClassA {
        public string No { get; set; }
        public string Title { get; set; }
        public string StartDate { get; set; }
    }
    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
,并从数据库中提取它,而不进行转换


但是,我仍然不理解为什么会出现错误。

在存储过程中,删除函数以\u 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;

为了对这个问题有一个正式的回答,我将在这里发布所有者的答案。(如果所有者将其答案包含在此处,我将删除此内容)

[更新]


现在可以工作了,我将STARTDATE的所有数据类型更改为DateTime,并从数据库中提取它,而不进行转换。

如果执行
STARTDATE=e.Field(“STARTDATE”)
,会发生什么?这行吗?同样的错误仍然提示出
到\u CHAR
是一个返回
VARCHAR2
的Oracle方法:可能
GetItem()
中的某个东西正在将其转换回日期时间?不确定为什么会这样,但我没有看到您发布的代码有任何其他问题。请将sql中的字段名更改为STARTDATE2,并在代码中相应地更改它,然后查看发生了什么。。