【问题标题】:Cannot convert System.String to System.DateTime无法将 System.String 转换为 System.DateTime
【发布时间】:2015-07-09 07:20:11
【问题描述】:

我对从数据库中选择的 asp.net 编辑结果有问题。到目前为止一切都很好,我可以显示我的选择结果。但是如果我尝试编辑一行,我会得到 InvalidOperationException。 无法将 Datum_doručení 从 System.String 转换为 System.DateTime。 如果我从 asp.net 文件中删除 DateTime 行,它会再次正常工作..

编辑:

刚刚结束调试,在 sql 我的字段“Datum_doručení”有 值“2015-04-30 00:00:00.0000000”,与 select in 的结果相同 ASP.NET。但如果我尝试编辑它,“Datum_doručeni”的值是“1.1.0001 0:00:00”,它会因为范围溢出。为什么会这样?

EDIT2:我用一种 hack 解决方案来修复它。只使用字符串。但我仍然不知道为什么 datetime 不起作用。

public DateTime Datum_doručení { get; set; }
changed to
public string Datum_D { get; set; }
----
s.Datum_doručení = reader.GetDateTime(4);
changed to
s.Datum_D = reader.GetDateTime(4).ToString("yyyy-MM-dd HH:mm:ss.fff");

command.Parameters.Add("@Datum_doručení", System.Data.SqlDbType.DateTime).Value = zásilka.Datum_doručení;
to
command.Parameters.Add("@Datum_doručení", System.Data.SqlDbType.DateTime2).Value = DateTime.Parse(zásilka.Datum_D);


我的班级:

public class Zásilka
{

    public int zásilka_id { get; set; }
    public decimal objednavka_id { get; set; }
    public decimal zakaznik_id { get; set; }
    public decimal zaměstnanec_id { get; set; }
    public DateTime Datum_doručení { get; set; }
    public string Stav { get; set; }
    public decimal Váha { get; set; }

}

类表:

public class ZásilkaTable
{


    private string selectAllDelivery = "select * from zásilka";
    private string editDelivery = "UPDATE zásilka SET objednavka_id=@objednavka_id, zakaznik_id=@zakaznik_id, zaměstnanec_id=@zaměstnanec_id, Datum_doručení=@Datum_doručení, Stav=@Stav, Váha=@Váha WHERE zásilka_id=@zásilka_id";


    public Collection<ORM.Zásilka> SelectAllDelivery()
    {
        Collection<ORM.Zásilka> delivery = null;
        Database db = new Database();
        SqlDataReader reader = null;

        try
        {
            db.Connect();

            SqlCommand command = db.CreateCommand(selectAllDelivery);
            reader = db.Select(command);

            delivery = new Collection<Zásilka>();
            while (reader.Read())
            {
                Zásilka s = new Zásilka();

                s.zásilka_id = reader.GetInt32(0);
                s.objednavka_id = reader.GetDecimal(1);
                s.zakaznik_id = reader.GetDecimal(2);
                s.zaměstnanec_id = reader.GetDecimal(3);
                s.Datum_doručení = reader.GetDateTime(4);
                s.Stav = reader.GetString(5);
                s.Váha = reader.GetDecimal(6);


                delivery.Add(s);
            }
        }
        catch (Exception e)
        {
            throw;
        }
        finally
        {
            reader.Close();
            db.Close();
        }
        return delivery;
    }


    public string Update(Zásilka zásilka)
    {
        Database db = new Database();
        try
        {
            SqlCommand command = db.CreateCommand(editDelivery);

            command.Parameters.Add("@zásilka_id", System.Data.SqlDbType.Int).Value = zásilka.zásilka_id;
            command.Parameters.Add("@objednavka_id", System.Data.SqlDbType.Decimal).Value = zásilka.objednavka_id;
            command.Parameters.Add("@zakaznik_id", System.Data.SqlDbType.Decimal).Value = zásilka.zakaznik_id;
            command.Parameters.Add("@zaměstnanec_id", System.Data.SqlDbType.Decimal).Value = zásilka.zaměstnanec_id;
            command.Parameters.Add("@Datum_doručení", System.Data.SqlDbType.DateTime).Value = zásilka.Datum_doručení;
            command.Parameters.Add("@Stav", System.Data.SqlDbType.VarChar).Value = zásilka.Stav;
            command.Parameters.Add("@Váha", System.Data.SqlDbType.Decimal).Value = zásilka.Váha;
            db.Connect();
            command.ExecuteNonQuery();
        }
        catch (Exception e)
        {
            return e.Message;
        }
        finally
        {
            db.Close();
        }


        return "OK";
    }




}

ASP.NET:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="Zásilka.aspx.cs" Inherits="dais.Zásilka" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">




    <center>
        <h1>Seznam zásilek</h1>
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="ObjectDataSourceadAS" DataKeyNames="zásilka_id">
        <Columns>
            <asp:CommandField ShowEditButton="True" />
            <asp:BoundField DataField="zásilka_id" HeaderText="zásilka_id" SortExpression="zásilka_id" />
            <asp:BoundField DataField="objednavka_id" HeaderText="objednavka_id" SortExpression="objednavka_id" />
            <asp:BoundField DataField="zakaznik_id" HeaderText="zakaznik_id" SortExpression="zakaznik_id" />
            <asp:BoundField DataField="zaměstnanec_id" HeaderText="zaměstnanec_id" SortExpression="zaměstnanec_id" />
            <asp:BoundField DataField="Datum_doručení" HeaderText="Datum_doručení" SortExpression="Datum_doručení" ConvertEmptyStringToNull="False" />
            <asp:BoundField DataField="Stav" HeaderText="Stav" SortExpression="Stav" />
            <asp:BoundField DataField="Váha" HeaderText="Váha" SortExpression="Váha" />
        </Columns>
    </asp:GridView>

        <asp:ObjectDataSource ID="ObjectDataSourceadAS" runat="server" DataObjectTypeName="dais.ORM.Zásilka" SelectMethod="SelectAllDelivery" TypeName="dais.ORM.ZásilkaTable" UpdateMethod="Update"></asp:ObjectDataSource>

    </center>



</asp:Content>

在sql数据库中:

CREATE TABLE [zásilka]
(
 [zásilka_id] INT NOT NULL,
 [objednavka_id] Decimal(10,0) NOT NULL,
 [zakaznik_id] Decimal(10,0) NOT NULL,
 [zaměstnanec_id] Decimal(10,0) NOT NULL,
 [Datum_doručení] Datetime NOT NULL,
 [Stav] Varchar(2) NOT NULL,
 [Váha] Decimal(10,0) NOT NULL
)
go

准确的错误

Podrobnosti o výjimce: System.InvalidOperationException: Nelze převést hodnotu parametru Datum_doručení z System.String na System.DateTime.

Zdrojová chyba:

Při provádění aktuálního webového požadavku byla vyvolána neošetřená výjimka. Informace týkající se původu a umístění výjimky lze zjistit pomocí níže uvedeného trasování zásobníku výjimek.

Trasování zásobníku:


[InvalidOperationException: Nelze převést hodnotu parametru Datum_doručení z System.String na System.DateTime.]
   System.Web.UI.WebControls.ObjectDataSourceView.ConvertType(Object value, Type type, String paramName, ParsingCulture parsingCulture) +416
   System.Web.UI.WebControls.ObjectDataSourceView.BuildObjectValue(Object value, Type destinationType, String paramName, ParsingCulture parsingCulture) +166
   System.Web.UI.WebControls.ObjectDataSourceView.BuildDataObject(Type dataObjectType, IDictionary inputParameters) +210
   System.Web.UI.WebControls.ObjectDataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +1276
   System.Web.UI.DataSourceView.Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback) +87
   System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean causesValidation) +1210
   System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +738
   System.Web.UI.WebControls.GridView.OnBubbleEvent(Object source, EventArgs e) +89
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +88
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +121
   System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +156
   System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +9664586
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724

【问题讨论】:

  • 试试 Convert.ToDateTime(reader.GetString(4));
  • 在 SQL 中使用 DateTime2(7) 或其他,而不是 Datetimestackoverflow.com/questions/1334143/…
  • 尝试转换,但它不在字符串中,所以它给我一个转换异常,也尝试 DateTime2 但仍然是同样的问题
  • 您在给出错误的字段中输入了什么文本?
  • 刚刚结束调试,在 sql 中我的字段“Datum_doručení”的值为“2015-04-30 00:00:00.0000000”,与 asp.net 中的选择结果相同。但是如果我尝试编辑它,“Datum_doručeni”的值是“1.1.0001 0:00:00”,它会溢出,因为范围显然是错误的。但是为什么会这样呢?我用同样的方法解决了同样的问题,效果很好。

标签: c# sql asp.net string datetime


【解决方案1】:

可能是您的日期时间字段在数据库中为空。 在类中使用声明:Nullable&lt;DateTime&gt; Datum_doručení ;

【讨论】:

  • 还是同样的问题,为什么你认为它可以是 null ?在 sql 我有 [Datum_doručení] Datetime NOT NULL,即使在查询结果中也没有任何空字段
猜你喜欢
  • 2017-07-30
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 2012-09-07
相关资源
最近更新 更多